AOSP Android12:自定义Jar加入引导类路径及非SDK限制解决
解决AOSP自定义库加入Boot Class Path后的非SDK接口限制及全局可用问题
问题根源分析
- 加入
PRODUCT_BOOT_JARS后,编译系统会将Jar中的classes.dex提取并编译为ART格式的vdex/oat/art文件,原Jar中classes.dex为空是正常行为,实际类数据已存储在ART相关文件中。 - 报错核心是Android的Hidden API机制拦截了应用对非SDK接口的访问——即便库在Boot Class Path中,未标记为公开SDK的类/字段仍会被限制访问。
解决步骤
1. 将自定义库纳入系统公开SDK接口
要实现应用无需添加<uses-library>即可全局访问,需把库的类/字段标记为系统公开SDK接口:
- 在
frameworks/base/api/current.txt中添加类和字段的声明,格式参考已有条目:public class com.example.mylib.MyClass { public static final java.lang.String MY_STRING; } - 执行
make update-api命令更新API文件,让编译系统识别这些接口为公开SDK内容。
2. 配置Hidden API豁免规则(适配Android 12)
即使纳入公开API,仍需确保Hidden API机制不拦截访问,需添加豁免规则:
- 在
build/make/core/tasks/hiddenapi/hiddenapi-policy-unspecified.txt中添加目标类和字段:Lcom/example/mylib/MyClass; Lcom/example/mylib/MyClass;->MY_STRING:Ljava/lang/String; - 若需要更宽松的访问权限,也可将规则添加到
hiddenapi-policy-whitelist.txt,但优先使用unspecified保持合规性。
3. 修正库模块的编译配置
确保frameworks/base/mylib的编译配置正确,以Android.bp为例:
java_library { name: "com.example.mylib", srcs: ["src/**/*.java"], installable: true, sdk_version: "core_platform", // 标记为系统平台SDK范畴 }
若使用Android.mk,对应配置如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := com.example.mylib LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_MODULE_TAGS := optional LOCAL_SDK_VERSION := core_platform include $(BUILD_JAVA_LIBRARY)
4. 验证Boot Class Path配置
确认build/target/product/sdk_phone_arm64.mk中的配置无误:
PRODUCT_BOOT_JARS += com.example.mylib
编译后系统会自动将该库加入Boot Class Path,实现全局可访问。
5. 重新编译验证
执行完整编译流程:
make clean && make -j$(nproc)
刷入系统后,应用即可直接访问com.example.mylib.MyClass.MY_STRING,无需在Manifest中添加<uses-library>配置。
关键说明
- 仅加入Boot Class Path无法绕过Hidden API限制,必须将接口标记为系统公开SDK才能实现全局无感知访问。
make update-api命令必须执行,否则编译会因API检查不通过报错。- Android 12的Hidden API规则严格,必须明确声明豁免或公开为SDK接口,否则应用无法正常访问目标类/字段。
内容的提问来源于stack exchange,提问作者Banana999
相关产品推荐
相关产品推荐

