在有关代码签名的Android文档中,我们可以阅读:“通过使用相同的证书为多个应用程序签名并使用基于签名的权限检查,您的应用程序可以以安全的方式共享代码和数据。 ”
这种代码共享究竟是如何做到的?是否可以发布主应用程序和多个可交换插件,然后在运行时发现它们?源代码是什么样的,与从/到不同 APK 包的“标准”意图调用相比有什么优势?
在有关代码签名的Android文档中,我们可以阅读:“通过使用相同的证书为多个应用程序签名并使用基于签名的权限检查,您的应用程序可以以安全的方式共享代码和数据。 ”
这种代码共享究竟是如何做到的?是否可以发布主应用程序和多个可交换插件,然后在运行时发现它们?源代码是什么样的,与从/到不同 APK 包的“标准”意图调用相比有什么优势?
使用 Context.createPackageContext() 为您感兴趣的另一个 .apk 实例化一个包。如果它使用与您相同的证书进行签名,并且您都使用相同的共享用户 ID,那么您可以使用该标志来加载其代码到您的流程中,允许您从上下文中获取 ClassLoader 并实例化您想要的任何类。
否则,如果它们的签名不同并且没有明确使用相同的共享使用 ID,则您只能加载其资源。
请注意,一旦应用程序上市,您就无法更改应用程序的共享用户 ID(更改为其他内容或在拥有和不拥有共享用户 ID 之间移动)。
假设您要调用动态加载的类的公共函数。使用以下代码片段:
Context friendContext = this.createPackageContext("packageName", Context.CONTEXT_INCLUDE_CODE);
Class friendClass = friendContext.getClassLoader().loadClass("packageName.className");
Class noparams[] = {}; //say the function (functionName) required no inputs
friendClass.getMethod("functionName", noparams).invoke(friendClass.newInstance(), null);