2011-12-12 20 views

回答

5

是的,但沒有100%可靠。如here所述,默認(自動生成的)證書具有DN'CN = Android調試,O = Android,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(); 
+0

感謝您的信息,但我怎麼能得到這個信息在運行時? – TacB0sS

+0

查看更新的答案。 –

+0

這是非常豐富的,但另一種解決方案似乎更簡單和有效。 – TacB0sS

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,如果你沒有特別添加的可調試=「true」以您的清單,調試版本將其設置爲true,並遠銷/簽署建立將有它設置假。

聽起來像這可能是一個更可靠的方法(只要你不手動設置debuggable ..)來確定它是否是debug vs release版本,但不是專門如果證書是調試證書 - 這是你的問題,所以我的答案可能與你無關。

+0

這也是我的實現,直到我看到正確的答案,你是否100%確定如果我沒有在清單中指定debuggable屬性,調試證書將其設置爲true? – TacB0sS

+1

從文檔:「支持真正的調試版本,您不再需要更改Android Manifest中debuggable屬性的值 增量構建會自動插入debuggable =」true「,但如果您執行」導出已簽名/未簽名的應用程序包「,ADT不會插入它,如果你在清單文件中手動設置debuggable =」true「,那麼發佈版本實際上會創建一個調試版本(如果你把它放在那裏,它不會刪除它)。 我已經使用這種技術來切換地圖API密鑰。 – FunkTheMonk

+0

完美...謝謝。 – TacB0sS

2

我們用一個更簡單的方法:

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

這是一個簡單的解決方案,爲一個簡單的要求...當你想擁有兩個以上的證書時,會發生什麼情況,並希望同一個應用程序以三種或四種不同的方式運行?是的,您可以在CI期間向清單中添加元數據標籤,但您需要一個CI。博客文章中提出的解決方案非常有用......我在實現它時懷疑它,但今天它不同於Debug,Staging和Production環境,並分別向證書公開特定功能。 – TacB0sS

+0

是的,我完全同意你的看法,但有時候有更簡單的需求,我的消化旨在滿足這種簡單的需求。幸運的是,儘管全球主義者希望這樣做,但這個世界並不是黑色或白色......但這是另一回事:) –

+1

確實如此。實際的原因是,在早期的ADT版本中,DEBUG字段並沒有真正指出應用程序是否處於調試模式,在它所做的一個版本中,然後它沒有,並且它發生了多次時間,所以需要一個更安全的方法,這就是這個想法如何誕生。 – TacB0sS

相關問題