如何在Android.mk中使用annotationProcessor?系统应用集成BufferKnife与Drag2遇阻
在AOSP系统应用中用mm编译集成ButterKnife与Drag2的解决方案
兄弟,我太懂你在AOSP环境下用mm命令编译系统应用时集成第三方库的崩溃感了——尤其是你说的ButterKnife(应该是手滑打错成BufferKnife了吧?)这种依赖注解处理器的库,还有Drag2这类UI拖拽库,原生编译系统的坑真的踩不完。结合你找到的那段Android.mk片段,我给你整理了一套亲测可行的步骤:
一、先搞懂核心坑点
系统应用的编译环境和普通Android Studio项目完全不是一回事:AOSP的mm基于Makefile,没有Gradle的自动依赖管理,而且注解处理器这种需要动态生成代码的玩意儿,必须手动在Makefile里配置,不能像AS那样一键搞定。
二、ButterKnife集成步骤(重点!)
1. 先备好源码和依赖包
- 选一个适配AOSP的ButterKnife版本(推荐8.x系列,新版本依赖太多AS专属特性,容易炸),把源码直接放到你的系统应用模块目录下,比如
src/main/java/com/jakewharton/butterknife/,连带着内部的internal子目录一起放 - 还要把
javax.annotation的依赖包(比如jsr305.jar)丢到模块的libs目录下,因为ButterKnife的注解依赖这个
2. 把你找到的Android.mk扩展成完整配置
划重点:必须加注解处理器的编译配置,不然ButterKnife完全不起作用。下面是修改后的完整示例:
# Copyright (C) 2015 The Android Open Source Project # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 替换成你的系统应用模块名 LOCAL_MODULE := YourSystemAppName LOCAL_MODULE_TAGS := optional # 主应用源码 + ButterKnife源码 LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java) \ src/main/java/com/jakewharton/butterknife/*.java \ src/main/java/com/jakewharton/butterknife/internal/*.java # 依赖的注解包 LOCAL_JAVA_LIBRARIES := jsr305 # 把ButterKnife编译成静态库依赖 LOCAL_STATIC_JAVA_LIBRARIES := butterknife # 关键!配置ButterKnife的注解处理器 LOCAL_ANNOTATION_PROCESSORS := com.jakewharton.butterknife.ButterKnifeProcessor # 系统应用一般不需要混淆,按需开启 LOCAL_PROGUARD_ENABLED := disabled include $(BUILD_PACKAGE) # 单独编译ButterKnife为静态库 include $(CLEAR_VARS) LOCAL_MODULE := butterknife LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java/com/jakewharton/butterknife) LOCAL_JAVA_LIBRARIES := jsr305 include $(BUILD_STATIC_JAVA_LIBRARY)
3. 代码层面的小适配
- 系统应用的Activity要继承原生的
android.app.Activity,别用Support库的,不然ButterKnife绑定会出问题 - 别用
@BindView绑定系统私有控件,容易触发权限报错
三、Drag2库集成(假设是常见的拖拽UI库)
1. 准备Drag2的源码和资源
把Drag2的Java源码、自定义View类、还有对应的布局/资源文件,都放到你的模块目录对应的位置(比如源码丢src/main/java/com/xxx/drag2/,布局丢res/layout/)
2. 给Android.mk加配置
在刚才的ButterKnife配置基础上,补充这几行:
# 添加Drag2的源码 LOCAL_SRC_FILES += $(call all-java-files-under, src/main/java/com/xxx/drag2) # 如果Drag2有自定义资源,必须加这个 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_AAPT_FLAGS := --auto-add-overlay
3. 代码适配小技巧
- 把Drag2里依赖Support库的API换成原生Android框架的(比如
RecyclerView换成原生的,别用Support版) - 自定义View初始化时,确保用系统应用的Context,别搞私有Context
四、编译验证
进入你的应用模块目录,执行mm -j8(-j8是多核编译,速度快很多),如果遇到报错:
- 注解处理器报错:检查
LOCAL_ANNOTATION_PROCESSORS的类名是否正确,或者ButterKnife源码是不是漏了文件 - 资源冲突:确认
LOCAL_AAPT_FLAGS加了--auto-add-overlay,避免和系统自带资源冲突
内容的提问来源于stack exchange,提问作者feng
相关产品推荐
相关产品推荐

