有没有办法确定Android应用程序是否在运行时签名生产或调试?

时间:2011-12-12 20:59:04

标签: android eclipse debugging signing

有没有办法确定Android应用程序是否在运行时签名生产或调试?

4 个答案:

答案 0 :(得分:7)

private static Boolean isDebugBuild = null;
    protected boolean isDebugBuild() {
        if(isDebugBuild == null) {
            PackageManager pm = getPackageManager();
            try {
                PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
                isSignedWithDebugKey = (pi.applicationInfo.flags &
                    ApplicationInfo.FLAG_DEBUGGABLE) != 0;
            }
            catch(NameNotFoundException nnfe) {
                nnfe.printStackTrace();
                isDebugBuild = false;
            }
        }

        return isDebugBuild;
    }

ADT 8开始,如果你没有专门为你的清单添加debuggable =“true”,调试版本将把它设置为true,导出/签名版本将把它设置为false。

听起来这可能是一种更可靠的方法(只要你不手动设置debuggable ..)来确定它是否是一个debug vs release版本,但是如果证书是一个调试证书则不具体 - 这是你的问题,所以我的回答可能与你无关。

答案 1 :(得分:5)

是的,但不是100%可靠。默认(自动生成)证书具有DN'CN = Android Debug,O = Android,C = US',如here所述。如果检查DN并且它与默认值匹配,则很可能是调试证书。没有什么能阻止人们生成自己的调试证书或使用相同的调试证书进行生产和调试。

您可以使用PackageManager获取签名证书。类似的东西:

PackageManager pm = context.getPackageManager();
Signature sig = packageManager.getPackageInfo(getPackageName(), 
   PackageManager.GET_SIGNATURES).signatures[0];
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(
    new ByteArrayInputStream(sig.toByteArray()));
String dn = cert.getIssuerDN().getName();

答案 2 :(得分:2)

我们使用更简单的方法:

if (BuildConfig.DEBUG) {
    // we're in debug mode
} else {
    // we're in production mode
}

答案 3 :(得分:0)

帖子android-automatically-choose-debug-release-maps-api-key有另一个基于包管理器的解决方案。基本上你比较实际signatuse的hashCode。适合我自动整理地图键