You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:07:24