2011-12-30 69 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

這可能是一種不同的方法,但爲什麼不實施自定義權限,即基於簽名?然後,您可以使用包管理器(或廣播)來查明權限是否被授予。

如果是,那麼兩個簽名都是相同的,如果不是這樣的話。