Android将当前包的签名与debug.keystore进行比较

zme*_*eda 15 android signature apk

正如我们所做的那样,当它处于开发模式(构建)时,我有一个由debug.keystore(默认情况下)签名的应用程序.当它投入生产时,我们用我们的私钥签名.有没有办法在运行时确定当前包是用debug.keystore签名的(处于开发模式)还是用我们的私钥签名(处于生产模式).

我尝试过类似的东西

    PackageManager packageManager = getPackageManager();
    try {
        Signature[] signs = packageManager.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures;
        for (Signature signature : signs) {
            Log.d(TAG, "sign = " + signature.toCharsString());
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

我不知道下一步该做什么?这是正确的做法吗?如何获得类似的debug.keystore签名?

我知道存在MD5指纹,keytool -list -keystore ~/.android/debug.keystore但在Signature类中没有"md5指纹"式方法.我想这样做是因为MapView Key,Logging,LicenseChecker和类似的东西.

Jcs*_*Jcs 18

PackageInfo由于tha字段不包含包签名而是签名者X509证书链,因此签名似乎没有很好地命名.请注意(大多数情况下)此链似乎仅限于一个单一的自签名证书.

根据Android开发人员页面签名您的应用程序,使用此DN生成调试签名证书:CN=Android Debug,O=Android,C=US

因此,很容易测试应用程序是否已在调试模式下签名:

private static final X500Principal DEBUG_DN = new X500Principal("CN=Android Debug,O=Android,C=US");
/* ... */
Signature raw = packageManager.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures[0];
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(raw.toByteArray()));
boolean debug = cert.getSubjectX500Principal().equals(DEBUG_DN);
Run Code Online (Sandbox Code Playgroud)