安装为系统应用时出现java.lang.UnsatisfiedLinkError如何解决
问题根因
将编译好的APK手动移动到/system/priv-app/目录作为系统特权应用时,Android不会像安装普通第三方应用那样,自动把APK包内lib/目录下的原生库解压到对应扫描路径,因此调用System.loadLibrary("traceroute")时,类加载器无法在枚举的原生库目录中找到libtraceroute.so,抛出链接错误。
修复方案
- 方案1:直接将so文件放到系统公共库目录
- 从编译生成的APK中,提取对应设备ABI的
libtraceroute.so,比如报错日志显示当前设备扫描armeabi-v7a路径,就提取APK内lib/armeabi-v7a/libtraceroute.so - 将提取的so文件推送到设备对应系统库目录:32位so放
/system/lib/,64位so放/system/lib64/ - 给so文件设置正确权限,执行命令
chmod 644 对应so的完整路径,权限和目录下其他系统原生库保持一致即可 - 重启设备后验证功能
- 从编译生成的APK中,提取对应设备ABI的
- 方案2:按照priv-app目录结构手动部署so
- 在
/system/priv-app/路径下新建和APK同名的专属目录,例如/system/priv-app/TraceRoute/ - 将APK放入该专属目录后,在同目录下新建对应架构的lib子目录:armeabi-v7a架构建
lib/arm/,arm64架构建lib/arm64/ - 将对应架构的
libtraceroute.so放入上述新建的lib子目录中 - 给目录、APK、so文件设置和其他已存在priv-app一致的权限,一般目录权限设为755,文件权限设为644
- 重启设备后生效
- 在
- 方案3:系统镜像编译阶段直接预置库
如果是做ROM定制集成,可以在编译系统镜像时直接把libtraceroute.so预置到系统库目录,APK作为priv-app预置时不需要在包内携带该so,系统会自动从公共系统库路径加载。
注意:如果之前的处理仅修改APK内部的so加载配置,没有手动部署so文件,无法解决手动放置APK到priv-app场景的加载问题——该场景下系统不会主动解析APK包内的lib目录内容。
内容的提问来源于stack exchange,提问作者basil_369
相关产品推荐
相关产品推荐

