Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我可以加载其他apk中包含的本机库吗?_Android_Android Ndk_Shared Libraries - Fatal编程技术网

Android 我可以加载其他apk中包含的本机库吗?

Android 我可以加载其他apk中包含的本机库吗?,android,android-ndk,shared-libraries,Android,Android Ndk,Shared Libraries,AFAIK每个android应用程序都安装有自己的用户权限。如果应用程序A包含本机lib(即/data/data/com.app.A/lib/libA.so),我可以从应用程序B使用System.load(“/data/data/com.app.A/lib/libA.so”) 在我拥有的设备上,/data/data/com.app.A/lib/libA.so设置了其他读取权限,因此我可以从其他应用加载它。但这在所有android系统上都有效吗?即使您能够加载它,但您将无法在libA中执行函数。因

AFAIK每个android应用程序都安装有自己的用户权限。如果应用程序A包含本机lib(即
/data/data/com.app.A/lib/libA.so
),我可以从应用程序B使用
System.load(“/data/data/com.app.A/lib/libA.so”)


在我拥有的设备上,
/data/data/com.app.A/lib/libA.so
设置了其他读取权限,因此我可以从其他应用加载它。但这在所有android系统上都有效吗?

即使您能够加载它,但您将无法在libA中执行函数。因此,因为它具有与appA中定义的包名和类名相关的不同函数签名

JNIEXPORT jint JNICALL Java_com_android_A_class_method(JNIEnv *d, jobject e, jstring f)
{
//some action

}

因此,即使您能够从另一个应用程序B加载它,也不会造成任何伤害。

我得出结论,即使在技术上可行,也应该强烈反对这样做。安卓文档对此并不清楚,但安全策略为每个应用程序分配了一个用户ID,这样应用程序a除了通过安卓框架之外不能干扰应用程序B

我能看到的唯一例外是,这两个应用程序由同一个密钥签名,例如由同一个开发人员签名

因此,不应允许加载外部应用程序的本机库,如果在未来版本的Android中删除“其他人读取”权限,也就不足为奇了


不确定当一个应用程序实际上是一个库项目时会发生什么,比如OpenCV Manager。在这种情况下,应用程序A与应用程序B(包含本机库)一起编译,System.load()由应用程序B的代码执行,即使是在应用程序A的运行时进程中执行。(欢迎对此发表评论;)

事实并非如此。libA.so不是JNI包装器。我可以在应用程序B中保留libA.so包装器,并且仍然可以使用它。问题更多的是权限和安卓标准……是的,如果你有包装器,你可以。答案是针对应用程序没有您提到的包装器并加载lib文件的情况的:没有规则要求appB中的所有Java类都必须使用appB清单中声明的包。阿帕也一样。因此,这两个函数可以为JNI函数使用第三个包名,或者它们都可以使用appA或appB的包。为了使事情更加复杂,您可以在本机库中提供Java_OnLoad()公共函数,并将相同的方法绑定到运行时选择的任何包。@AlexCohn可以使用第三个包名,我不确定Java_OnLoad()是否正确在native library中,您能为我提供一些相关链接吗?作为记录,Android将功能从一个包公开到另一个包的正确方法是构建一个
服务
,并向它发送意图(或绑定到它)。您甚至可以将其指定为进程中,以避免IPC惩罚。