项目场景:
在无系统签名的情况下,将第三方APP内置到/system/app目录下,可以将第三方应用变为系统应用,用户无法直接卸载。不过前提是手机需要root。
问题描述
使用es文件管理工具将第三方应用的apk文件添加到/system/app目录下,可能会出现加载so文件报错,例如:
java.lang.UnsatisfiedLinkError: Couldn't load ijkffmpeg from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/system/app/tets .apk"],
nativeLibraryDirectories=[/vendor/lib, /system/lib]]]: findLibrary returned null
原因分析:
主要原因有两种:
1,apk打包时,没有添加对应的cpu架构。
2,系统在安装该目录下的app时不会自动安装相应的so文件,所以需要手动将apk所需要的so文件复制到对应的目录下。如上报错的目录:/system/lib,/vendor/lib目录。
解决方案:
一,查看项目是否添加了对应的cpu架构。
1,查看android设备的cpu架构类型:
//adb执行命令
cat /proc/cpuinfo
其中:
CPU architecuture: 7 //7为arm-v7,8为arm-v8
2,查看项目的build.gradle是否添加了对应的cpu架构
ndk {
// 设置支持的SO库架构
setAbiFilters(["armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64"])
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
gradle.properties添加
android.useDeprecatedNdk=true
3,打包成功后对应的apk文件的lib目录下会有对应架构的so文件。
二,添加到系统目录
1,先普通安装一次apk,获取其所需的so文件。正常安装的情况下,apk目录为:/data/app。对应的so文件在/data/data/包名/lib 目录下。
2,将该目录下的so文件复制到报错时指出的目录下,/system/lib下。
3,卸载正常安装的apk,并将其安装包放到/system/app目录下
4,重启安卓设备即可。