【问题标题】:Can I System.load native lib contained in a different apk?我可以 System.load 包含在不同 apk 中的本机库吗?
【发布时间】:2012-09-28 13:43:17
【问题描述】:

AFAIK 每个安卓应用都安装了自己的用户权限。如果应用 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 方法是构建一个 Service 并向它发送意图(或绑定到它)。您甚至可以将其指定为进程中以避免 IPC 惩罚。

标签: android android-ndk shared-libraries


【解决方案1】:

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

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

}

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

【讨论】:

  • 其实不是这样的。 libA.so 不是 JNI 包装器。我可以将 libA.so 包装器保留在应用程序 B 中,并且仍然可以使用它。问题更多的是关于权限和安卓标准......
  • 是的,如果你有包装器,你可以。答案是针对应用程序没有包装器并加载 lib 文件的情况。
  • @Sunny Kumar Aditya: 没有规定appB中的所有Java类都必须使用appB manifest中声明的包。 appA 也一样。因此,两者可能会为 JNI 函数使用第三个包名称,或者它们可能都使用 appA 或 appB 的包。为了让事情变得更复杂,你可以在你的本地库中提供 Java_OnLoad() 公共函数,并将相同的方法绑定到你在运行时选择的任何包。
  • @AlexCohn 可以使用第三个包名,我不确定本机库中的 Java_OnLoad() 是否可以提供一些相关链接。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多