基礎的在Jcs' answer上,我們使用這個在運行時找出構建運行包的人:
private enum BuildSigner {
unknown,
Joe,
Carl,
Linda
}
private BuildSigner whoBuiltThis() {
try {
PackageManager packageManager = getPackageManager();
PackageInfo info = packageManager.getPackageInfo(getPackageName(),
PackageManager.GET_SIGNATURES);
Signature[] signs = info.signatures;
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(
new ByteArrayInputStream(signs[0].toByteArray()));
PublicKey key = cert.getPublicKey();
int modulusHash = ((RSAPublicKey)key).getModulus().hashCode();
switch (modulusHash) {
case 123456789:
return BuildSigner.Joe;
case 424242424:
return BuildSigner.Carl;
case -975318462:
return BuildSigner.Linda;
}
} catch (Exception e) {
}
return BuildSigner.unknown;
}
對於任何涉及的證書,您只需找到一次散列並將其添加到列表中。
「查找散列一次」的最簡單方法可能是在顯示modulusHash
的switch語句之前添加彈出式烤麪包,編譯您的應用,運行它,記下散列,刪除烘烤代碼並添加散列到名單。
或者,當我實現這一點,我創建具有單個活性和單TextView
與主佈局ID tv
一點樣板的應用程序,把這種成活動:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int hash = 0;
try{
PackageManager packageManager = getPackageManager();
PackageInfo info = packageManager.getPackageInfo(
"com.stackexchange.marvin", PackageManager.GET_SIGNATURES);
Signature[] signs = info.signatures;
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(
new ByteArrayInputStream(signs[0].toByteArray()));
PublicKey key = cert.getPublicKey();
hash = ((RSAPublicKey) key).getModulus().hashCode();
}catch(Exception e){}
TextView tv = ((TextView)findViewById(R.id.tv));
tv.setText("The Stack Exchange app's signature hash is " + hash + ".");
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 24);
}
(改變com.stackexchange.marvin
到你的應用程序的名稱),編譯這個迷你應用程序,並將APK發送給所有相關的開發人員,要求他們在他們的開發設備上運行它,並讓我知道顯示的散列。
現在,我使用1個靜態布爾值,每次執行產品發佈時都必須更改這些值。發生了,我忘了。 :( – zmeda 2011-05-25 10:13:22