2011-12-30 68 views
7

是否有某种方法可以在运行时检索有关apk签名的信息?在运行时为Android获取apk签名

例如我有两个不同的签名签名的应用程序:app-1.apk和app-2.apk,我希望能够在运行时区分两个apk。那可能吗?

我的目标是使用外部服务器和基于应用程序的版本代码和签名来实现许可系统。

回答

8

您可以使用PackageManager访问apk签名。 软件包管理器中定义的PackageInfo标志返回有关包中包含的签名的信息。

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES).signatures;  
for (Signature sig : sigs) 
{ 
    Log.i("App", "Signature : " + sig.hashCode()); 
} 

http://developer.android.com/reference/android/content/pm/PackageManager.html

+3

不错,只不过什么API调用 '签名' 实际上是签约_certificate_。调用'toByteArray()'获取原始证书。此外,'hashCode()'不会给你多少钱,你需要使用'MessageDigest'来计算证书哈希值以进行比较。 – 2011-12-31 04:16:14

+0

@NikolayElenkov这可能是一个旧帖子,但我需要执行此代码。签署证书和原始证书有什么区别?当我使用方法'toByteArray()'而不是'hashCode()'时,每次我运行'.apk'时,我的MD5校验和会发生变化,而只是使用'hashCode()'保持稳定,除非我重新编译应用程序。我想要的是识别用于签署'.apk'的密钥库。 – Synaero 2013-04-14 23:09:30

+1

'hashCode()'不返回MD5校验和,它是一个或多或少的随机值,用于在运行时识别对象。使用'MessageDigest.getInstance(“MD5”).digest(sigs [0] .toByteArray())'。顺便说一下,识别'密钥库'没有意义,你需要识别签名密钥/证书。 – 2013-04-15 01:34:42

2

这可能是一种不同的方法,但为什么不实施自定义权限,即基于签名?然后,您可以使用包管理器(或广播)来查明权限是否被授予。

如果是,那么两个签名都是相同的,如果不是这样的话。