Android:如何在使用相同证书签名的项目之间共享代码

Posted

技术标签:

【中文标题】Android:如何在使用相同证书签名的项目之间共享代码【英文标题】:Android: how to share code between projects signed with the same certificate 【发布时间】:2011-02-12 20:44:36 【问题描述】:

android documentation 中,关于代码签名,我们可以读到:“通过使用相同的证书为多个应用程序签名并使用基于签名的权限检查,您的应用程序可以共享代码和数据一种安全的方式。"

这种代码共享究竟是如何实现的?是否可以发布主应用程序和多个可交换插件,然后在运行时发现它们?源代码是什么样的?与从/到不同 APK 包的“标准”意图调用相比有什么优势?

【问题讨论】:

【参考方案1】:

假设您要调用动态加载的类的公共函数。使用以下代码sn -p:

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);

【讨论】:

【参考方案2】:

使用 Context.createPackageContext() 为您感兴趣的另一个 .apk 实例化一个包。如果它使用与您相同的证书进行签名,并且您都使用相同的共享用户 ID,那么您可以使用该标志将其代码加载到您的进程中,允许您从上下文中获取 ClassLoader 并实例化您想要的任何类。

否则,如果它们的签名不同,并且没有明确使用相同的共享使用 ID,则只能加载其资源。

请注意,一旦应用程序上市,您就无法更改应用程序的共享用户 ID(更改为其他内容或在拥有和不拥有共享用户 ID 之间切换)。

【讨论】:

更多信息:developer.android.com/intl/de/guide/topics/security/… 和 developer.android.com/intl/de/guide/topics/manifest/… "否则,如果它们的签名不同,并且没有明确使用相同的共享使用 ID,则只能加载其资源。"如果被调用的上下文是恶意的,这会对调用应用程序构成安全风险吗?我问这个是因为我使用 createPackageContext("packagename", ignore_security) 向 Google 员工展示了我的代码,他说我不应该使用该代码,因为它可能会给我的应用程序添加一个我还不太了解的安全漏洞。 由于 sharedUserID 标志在 API 级别 29 中已被弃用并且不建议使用,现在如何共享数据?使用相同的证书签署应用程序就足够了吗?还是这种方法不再有效? @KashishMalhotra 限制和以前一样,所以如果你不使用sharedUserID,你将无法共享资源以外的数据。不过,Google 建议您使用其他技术(例如 ContentProvider)来共享非资源数据。 @AdamBurley 是的,我们最终使用ContentProvider 作为我们的用例。感谢您的回复。

以上是关于Android:如何在使用相同证书签名的项目之间共享代码的主要内容,如果未能解决你的问题,请参考以下文章

Android签名打包详解

Android 签名密钥库

Appium (Android):应用程序未使用调试证书签名

Android使用SSL自签名证书

Android使用SSL自签名证书

Android使用SSL自签名证书