我在 android 中动态加载 SO 库时遇到问题,为了让人们理解为什么我实际上需要这样做,并且可能会建议不同的方法来做这件事,我将简要解释一下这个项目。我正在开展一个研究项目,以测试代码卸载我一直在研究的流程的好处,如下所示:
用户触发一个预先确定为耗时的函数,该过程使用 Xposed Hooks 拦截,应用程序的 Apk 被发送到服务器,然后在服务器上我从 APK 动态运行 android nougat 甚至 oreo 的方法不会像我想的那样造成任何麻烦,但主要问题是我正在使用的一些应用程序使用非 NDK 库,这会导致一些问题,因为系统不允许我动态加载库我需要将这些库添加到我的应用程序中,这对我不起作用,因为我的服务器应用程序是一个适合所有应用程序的应用程序,它接收方法名称 apk 和包名称以及一些参数,它应该使用参数运行函数并返回结果不管apk或函数名,所以直接切入问题
我需要能够运行此代码而不会遇到代码问题:
val classLoader = DexClassLoader("/storage/emulated/0/ApkDir/base.apk", applicationContext.codeCacheDir.absolutePath,
"/storage/emulated/0/ApkDir/lib/arm64/" , this.javaClass.classLoader
代码对android oreo及以上版本提出的问题
01-15 03:19:22.729 10712-10712/com.sablab.myapplication W/b.myapplication: type=1400 audit(0.0:11387): avc: denied { execute } for path="/storage/emulated/0/APKDir/libs/libpngt.so" dev="fuse" ino=79 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:fuse:s0 tclass=file permissive=0
如果不是这个我得到
Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: couldn't map "/storage/emulated/0/APKDir/libs/libpngt.so" segment 1: Permission denied