有沒有一種方法可以確定Android應用程序是否在運行時簽署了生產或調試?有沒有方法可以確定Android應用程序是否在運行時簽署了生產或調試?
回答
是的,但沒有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();
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版本,但不是專門如果證書是調試證書 - 這是你的問題,所以我的答案可能與你無關。
這也是我的實現,直到我看到正確的答案,你是否100%確定如果我沒有在清單中指定debuggable屬性,調試證書將其設置爲true? – TacB0sS
從文檔:「支持真正的調試版本,您不再需要更改Android Manifest中debuggable屬性的值 增量構建會自動插入debuggable =」true「,但如果您執行」導出已簽名/未簽名的應用程序包「,ADT不會插入它,如果你在清單文件中手動設置debuggable =」true「,那麼發佈版本實際上會創建一個調試版本(如果你把它放在那裏,它不會刪除它)。 我已經使用這種技術來切換地圖API密鑰。 – FunkTheMonk
完美...謝謝。 – TacB0sS
該帖子android-automatically-choose-debug-release-maps-api-key有另一個基於packagemanger的解決方案。基本上你比較實際簽名的hashCode。工作很適合我對於整理出的地圖鍵automaticaly
我們用一個更簡單的方法:
if (BuildConfig.DEBUG) {
// we're in debug mode
} else {
// we're in production mode
}
這是一個簡單的解決方案,爲一個簡單的要求...當你想擁有兩個以上的證書時,會發生什麼情況,並希望同一個應用程序以三種或四種不同的方式運行?是的,您可以在CI期間向清單中添加元數據標籤,但您需要一個CI。博客文章中提出的解決方案非常有用......我在實現它時懷疑它,但今天它不同於Debug,Staging和Production環境,並分別向證書公開特定功能。 – TacB0sS
是的,我完全同意你的看法,但有時候有更簡單的需求,我的消化旨在滿足這種簡單的需求。幸運的是,儘管全球主義者希望這樣做,但這個世界並不是黑色或白色......但這是另一回事:) –
確實如此。實際的原因是,在早期的ADT版本中,DEBUG字段並沒有真正指出應用程序是否處於調試模式,在它所做的一個版本中,然後它沒有,並且它發生了多次時間,所以需要一個更安全的方法,這就是這個想法如何誕生。 – TacB0sS
- 1. 有沒有辦法檢查應用程序簽名是否調試或發佈?
- 2. 當應用程序未在ios中運行時是否可以調用方法?
- 3. 有沒有辦法在運行時確定對象是否可以在C++中執行方法?
- 4. Androguard有沒有辦法確定某個方法是否可以實際調用?
- 5. 有沒有辦法以編程方式檢測應用程序在chrome調試模式下運行的時間?
- 6. 有沒有辦法確定是否安裝了iPhone/iPad應用程序?
- 7. 確定程序是否以調試模式運行
- 8. 有沒有一種方法可以確定是否在jython shell /腳本中使用conntype = NONE調用了wsadmin?
- 9. 有沒有辦法在運行時確定是否使用Lambdaj.on()方法創建了一個對象?
- 10. 是否有可能從android應用程序運行android應用程序?
- 11. 有什麼方法可以確定它是否是測試(.NET)?
- 12. 我是否可以將我的Android應用程序構建爲調試版,但簽署了發佈密鑰庫
- 13. 有沒有一種方法可以在Objective-C中運行程序時不斷調用方法?
- 14. 是否有可能在啓動時運行AIR應用程序?
- 15. C#應用程序運行調試,但不是沒有
- 16. Windows沒有產生調試窗口,當應用程序崩潰
- 17. 有沒有什麼辦法可以發佈Android應用程序進行測試?
- 18. 是否可以確定GHUnit測試方法的執行順序?
- 19. 有沒有一種方式讓應用程序[iphone]以編程方式確定另一個特定應用程序是否正在運行?
- 20. 是否可以調試當前正在運行的生產節點應用程序?
- 21. 沒有可調試的應用程序
- 22. 有沒有辦法在android上運行windows mobile應用程序?
- 23. 是否有它可以產生一個有效的C程序
- 24. 有沒有一種方法可以在運行時指定方法c#
- 25. 是否可以在沒有GNOME的情況下運行GTK +應用程序?
- 26. 運行方法沒有調用線程
- 27. ejabberd:有沒有一種方法可以確定用戶是否是管理員?
- 28. 是否可以確定Adobe AIR應用程序是否從瀏覽器運行?
- 29. 是否有可能找出另一個應用程序運行了多久? Android
- 30. 有沒有方法可以測試VB6中是否有Function/Sub?
它已經有一段時間,從那時起我已經長大了... :)這裏是一個鏈接到一個完整的解決方案:http://android-know-how-to.blogspot.co.il/2013/08/android-apk-signature-check.html#chitika_close_button – TacB0sS