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

如何添加外部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:33:11