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

Tac*_*0sS 4 eclipse debugging android signing

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

Fun*_*onk 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;
    }
Run Code Online (Sandbox Code Playgroud)

ADT 8开始,如果您没有在清单中专门添加debuggable ="true",则调试版本将其设置为true,导出/签名版本将其设置为false.

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


Nik*_*kov 5

是的,但没有100%可靠.默认(自动生成的)证书具有DN 'CN = Android的调试,O =机器人,C = US'作为描述在这里.如果检查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();
Run Code Online (Sandbox Code Playgroud)