Android 系统源码集成三方 SO库

Android 系统源码集成三方 SO库 1. 概述本手册提供在 Android 系统源码环境下集成第三方 SO 动态链接库如 WebRTC 的libjingle_peerconnection_so.so以及将应用编译为系统特权应用的标准流程。涵盖了 Makefile 配置、权限预置、JNI 目录结构、Android.bp 定义及部署调试等核心步骤。2. 适用场景系统集成需要将第三方 SDK如 WebRTC, 语音 SDK, 安全 SDK 等深度集成到 Android 系统源码中。系统应用开发应用需要具备系统级权限如WRITE_SECURE_SETTINGS,REBOOT等。车载/嵌入式开发在定制化硬件平台上进行应用预装和底层服务配置。3. 前置条件环境要求具备 Android AOSP 或厂商定制系统源码编译环境如 Ubuntu 20.04。权限要求拥有源码修改权限以及对设备进行adb remount和adb push的调试权限。依赖组件第三方.so文件对应架构arm64-v8a, armeabi-v7a及对应的.aar或.jar包。4. 操作步骤以下是Android系统源码集成第三方SO库及编译系统特权应用的完整流程图成功失败代码初始化初始化PeerConnectionFactory业务组件初始化编译脚本定义cc_prebuilt_library_shared定义android_library_import定义android_app目录结构创建jniLibs目录按架构放入.so文件创建lib目录放.aar配置proguard规则权限配置编辑privapp-permissions-platform.xml添加所需系统权限Makefile配置修改packages.mk添加PRODUCT_PACKAGES开始准备第三方SO库与AAR编译验证部署到/system/priv-app排查常见问题4.1 步骤一配置系统编译包列表在全局或厂商特定的 Makefile 中添加目标模块确保系统编译时包含该应用及其依赖的 SO 库。路径vendor/xxx/common/packages.mk(以实际路径为准)操作在PRODUCT_PACKAGES列表中添加libjingle_peerconnection_so和应用模块名。PRODUCT_PACKAGES \ libjingle_peerconnection_so \ ...4.2 步骤二预置系统特权权限如果应用需要执行敏感操作必须在系统的白名单配置文件中声明。路径frameworks/base/data/etc/privapp-permissions-platform.xml操作根据包名添加所需的系统权限。privapp-permissionspackagecom.test.wifip2pconnectpermissionnameandroid.permission.READ_PRIVILEGED_PHONE_STATE/permissionnameandroid.permission.MANAGE_USB//privapp-permissions4.3 步骤三工程目录结构准备在应用模块目录下建立正确的 JNI 和库文件结构。JNI 目录在src下创建jniLibs并根据架构arm64-v8a,armeabi-v7a放入.so文件。库文件目录创建lib目录放入.aar文件如google-webrtc-1.0.40794.aar。混淆配置在proguard-rules.pro中保留第三方库包名防止 SO 库调用失败。-keep class org.webrtc.** { *; } -dontwarn org.webrtc.**4.4 步骤四编写 Android.bp 编译脚本使用Android.bp定义 SO 库的预编译规则及应用的编译逻辑。// 定义预编译 SO 库 cc_prebuilt_library_shared { name: libjingle_peerconnection_so, arch: { arm: { srcs: [src/jniLibs/armeabi-v7a/libjingle_peerconnection_so.so] }, arm64: { srcs: [src/jniLibs/arm64-v8a/libjingle_peerconnection_so.so] }, }, check_elf_files: false, shared_libs: [libEGL, liblog], } // 导入 AAR 库 android_library_import { name: google-webrtc, aars: [lib/google-webrtc-1.0.40794.aar], } // 定义系统应用 android_app { name: XXX, static_libs: [google-webrtc], jni_libs: [libjingle_peerconnection_so], ... }4.5 步骤五应用层初始化在代码中显式初始化 WebRTC 环境及相关业务组件。PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(MainActivity.this).createInitializationOptions());// 业务初始化WebRtcSenderwebRtcSendernewWebRtcSender();webRtcSender.init(MainActivity.this);5. 参数说明| 参数 | 说明 ||------|------||PRODUCT_PACKAGES| Makefile 中定义的系统集成模块列表。 ||cc_prebuilt_library_shared| Android.bp 中用于预编译.so文件的模块类型。 ||jni_libs|android_app模块依赖的 JNI 共享库。 ||privapp-permissions| 系统特权应用权限声明。 |6. 输出说明编译产物编译后应用位于/system/priv-app/下。SO 库位置SO 库被打包进 APK 的lib/目录下或预装在/system/lib64/中。7. 常见问题Q: SO 库加载失败 (UnsatisfiedLinkError)A: 请检查Android.bp中的jni_libs是否正确包含模块名并确认架构armeabi-v7a/arm64-v8a与设备 CPU 匹配。Q: 系统权限不生效A: 确保 XML 路径正确且应用已安装在system/priv-app目录下普通安装在data/app下的特权权限无效。8. 注意事项调试提效初次需全量编译系统包后续小改动可使用adb remount后通过adb push将 APK 覆盖到/system/priv-app/快速验证。ELF 校验三方 SO 库常因依赖缺失无法通过编译期 ELF 校验需在cc_prebuilt_library_shared中设置check_elf_files: false。