我可以System.load包含在不同的apk中的本机库吗?

时间:2012-10-08 10:06:53

标签: android android-ndk shared-libraries

AFAIK每个Android应用程序都安装有自己的用户权限。如果app A 包含本机库(即/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系统都有效吗?

2 个答案:

答案 0 :(得分:0)

我得出的结论是,即使技术上可行,也应该高度劝阻。 Android doc对此并不清楚,但安全策略会为每个应用分配一个用户ID,以便app A不会通过Android框架干扰app B.

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

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

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

答案 1 :(得分:-1)

即使你因为权限而能够加载它,你也无法执行libA.so中的函数,因为它具有与app name中定义的包名和类名相关的不同函数签名 A

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

}

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