Основываясь на ответе Jcs , мы используем это, чтобы выяснить во время выполнения, кто создал работающий пакет:
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;
}
Для любого задействованного сертификата вам просто нужно один раз найти хеш и добавить его в список.
Самый простой способ «найти хэш один раз» может состоять в том, чтобы просто добавить всплывающий тост перед оператором switch, который отображает modulusHash
, скомпилировать приложение, запустить его, записать хеш, удалить код тоста и добавить хеш к списку.
В качестве альтернативы, когда я реализовал это, я создал небольшое стандартное приложение с одним действием и одним TextView
с идентификатором 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 всем вовлеченным разработчикам, попросив их запустить его на своем устройстве dev и сообщите мне отображаемый хэш.