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

为何APK包含原生共享库但目标设备中无法读取?

原生共享库打包进APK但安装后未提取到设备lib目录的问题

问题详情

  • 已将原生共享库放置在src/main/jniLibs/arm64-v8a目录
  • 编译后通过unzip build/outputs/apk/debug/app-debug.apk验证,库确实存在于APK的lib/arm64-v8a/路径下
  • 安装应用到设备后,/data/app/{PATH1}/{PATH2}/lib/arm64/目录为空,但库仍保留在设备上的base.apk内
  • 未修改Gradle或CMake配置,当前使用Gradle 8版本

解决方法

1. 检查ABI拆分配置

若开启了按ABI拆分APK,可能安装的变体不包含arm64-v8a库。查看模块级build.gradle.kts(或.gradle)中的splits配置:

android {
  splits {
    abi {
      enable true
      reset()
      include 'x86', 'x86_64' // 若未包含arm64-v8a,对应ABI的APK会缺失库
    }
  }
}

处理方式:要么关闭ABI拆分,要么在include列表中添加arm64-v8a,然后安装对应ABI的APK包。

2. 验证设备ABI兼容性

通过adb shell getprop ro.product.cpu.abi查看设备主ABI,确认是否为arm64-v8a:

  • 若设备主ABI是armeabi-v7a(32位ARM),系统不会提取arm64-v8a的库,此时需要补充对应32位版本的库到src/main/jniLibs/armeabi-v7a目录。

3. 确认Gradle的jniLibs路径配置

确保Gradle正确识别jniLibs目录,模块级build.gradle.kts中需包含默认配置(若被修改过需恢复):

android {
  sourceSets {
    main {
      jniLibs.srcDirs = ['src/main/jniLibs']
    }
  }
}

4. 清理缓存后重建项目

执行以下命令清理构建缓存并重新编译安装:

./gradlew clean
./gradlew assembleDebug
adb install build/outputs/apk/debug/app-debug.apk

5. 检查extractNativeLibs配置

查看AndroidManifest.xml的<application>标签,若存在android:extractNativeLibs="false",系统不会将库提取到设备lib目录,而是直接从APK加载:

  • 若不需要此配置,直接移除该属性(默认值为true),让系统自动提取库;
  • 若需保留该设置,确保应用代码实现了从APK加载原生库的逻辑。

内容的提问来源于stack exchange,提问作者fabian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:09:59