有没有办法检查应用程序签名是否已调试或发布?

我目前正在开发RPC服务供开发人员使用,但我想确保我可以区分另一个应用程序的调试密钥和他们的公钥。 有没有办法检查另一个应用程序的密钥,并告诉它是否是调试密钥而不是已发布的应用程序密钥?

这样做的目的是能够告诉他们的应用程序何时处于开发或发布状态,因为我需要能够判断他们是应该访问我的开发服务器还是我的生产服务器。

默认情况下,Eclipse使用的androiddebugkey(例如)具有notAfter日期和时间,未来最多1年 – Android市场不接受这样的短值 – 您可以使用它来区分开发人员签名的构建? 或者..你可以检查应用程序使用的publickey – 让他们用他们的应用程序的android.content.pm.Signature签署RPC请求?

 PackageInfo pkgInfo = getPackageManager()。getPackageInfo(getPackageName(),PackageManager.GET_SIGNATURES);

 for(签名appSignature:pkgInfo.signatures){
     // javax.security  - 不是 java.security!
     X509Certificate appCertificate = X509Certificate.getInstance(appSignature.toByteArray());
     // appCertificate.getNotAfter()可以为您提供证书过期的日期和时间
     // appCertificate.getPublicKey()可以为您提供使用RPC签名的公钥。
     // appCertificate.getSubjectDN()将为任何未由开发人员手工制作的调试证书提供名为“CN = Android Debug,O = Android,C = US”的Principal。
 }
 static final String DEBUGKEY = " key "; public static boolean signedWithDebugKey(Context context, Class< ?> cls) { boolean result = false; try { PackageInfo pinfo = context.getPackageManager().getPackageInfo("your package name",PackageManager.GET_SIGNATURES); Signature sigs[] = pinfo.signatures; Log.d(TAG,sigs[0].toCharsString()); if (DEBUGKEY.equals(sigs[0].toCharsString())) { result = true; Log.d(TAG,"package has been signed with the debug key"); } else { Log.d(TAG,"package signed with a key other than the debug key"); } } catch (android.content.pm.PackageManager.NameNotFoundException e) { return false; } return result; } 

使用debugkey首次运行此代码,这将始终返回false,但您将获得Logcat中的编码密钥。 复制该编码密钥,并替换DEBUGKEY的值“key”,它将正常工作。