是否有办法确定是将Android应用程序签名用于生产还是在运行时进行调试?
是,但不是100%可靠。默认的(自动生成的)证书具有DN'CN = Android Debug,O = Android,C = US',如here所述。如果您检查DN并且它与默认值匹配,则很可能是调试证书。但是,没有什么能阻止人们生成自己的调试证书或将同一证书用于生产和调试。
您可以使用PackageManager
获得签名证书。类似于:
PackageManager pm = context.getPackageManager();
Signature sig = pm.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();
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。
听起来这可能是一种更可靠的方法(只要您不手动设置可调试..),就可以确定它是否是调试版本或发布版本,而不是专门确定证书是否为调试证书-是您的问题,所以我的答案可能与您无关。
我们使用一种简单得多的方法:
if (BuildConfig.DEBUG) {
// we're in debug mode
} else {
// we're in production mode
}
帖子android-automatically-choose-debug-release-maps-api-key有另一个基于packagemanger的解决方案。基本上,您将与实际签署的hashCode进行比较。对我来说很好,可以自动整理地图密钥