如何添加外部AAR库至AOSP,仅允许frameworks/base内部Java调用?
解决方案:将AAR作为Framework私有依赖集成(避免Bootclasspath暴露)
核心思路
不把AAR加入framework-minus-apex这类Bootclasspath模块,而是作为Framework内部的私有静态依赖,通过Soong的可见性控制和导出规则,仅允许frameworks/base/core/java/android/*下的代码调用,同时避免APK访问到Framework中的该库类。
1. 调整AAR导入的Soong规则
在frameworks/base/Android.bp中定义AAR导入模块,严格限制可见性并禁止导出:
android_library_import { name: "mylib-private", aars: ["libs/mylib/mylib.aar"], sdk_version: "current", // 仅允许framework/base下的子模块依赖此库 visibility: [":__subpackages__"], // 禁止将该库的类暴露给依赖它的模块的公开API exported: false, // 关联AAR中的.so文件(需先提取AAR内的.so到对应目录) native_libs: ["libmylib"], } // 导入AAR中的.so文件作为私有共享库 cc_prebuilt_library_shared { name: "libmylib", arch: { arm: { srcs: ["libs/mylib/armeabi-v7a/libmylib.so"], }, arm64: { srcs: ["libs/mylib/arm64-v8a/libmylib.so"], }, // 按需添加x86、x86_64等其他架构 }, visibility: [":__subpackages__"], // 将.so安装到系统framework专属库目录,仅Framework可加载 install_path: "framework/${LIB}", }
2. 让Framework核心模块依赖私有库
找到frameworks/base中对应core/java/android/*代码的模块(通常为framework-core或直接修改framework主模块),添加私有静态依赖,注意不要将其加入exported_static_libs:
java_library { name: "framework-core", // 保留原有配置... static_libs: [ // 保留原有依赖... "mylib-private", ], // 不要把mylib-private加入此处,避免暴露给SDK exported_static_libs: [ // 保留原有导出依赖... ], }
3. 处理AAR中的资源文件(可选)
如果AAR包含资源文件,需将其合并到Framework的资源体系中:
android_resources { name: "mylib-resources", visibility: [":__subpackages__"], resource_dirs: ["libs/mylib/res"], sdk_version: "current", } // 在framework主模块中添加资源依赖 java_library { name: "framework", // 保留原有配置... resource_libs: ["mylib-resources"], }
方案优势
- 规避Bootclasspath检查:库未加入
framework-minus-apex这类Bootclasspath模块,Soong不会触发package_allowed_list.txt的校验,无需添加包名到允许列表。 - 严格访问控制:通过
visibility: [":__subpackages__"]限制仅frameworks/base下的模块能依赖该库,确保只有android/*下的代码可调用。 - 避免APK冲突:库的类不会被导出到SDK或Bootclasspath,APK若包含同名包的类,会优先使用自身实现,不会出现从Framework加载的情况。
内容的提问来源于stack exchange,提问作者Notrep
相关产品推荐
相关产品推荐

