簡體   English   中英

區分Android應用程序的調試和生產版本

[英]Differentiating debug and production build of an Android app

我最近開始學習Android應用開發。 這也是我第一次使用Java語言。

我希望以Java包依賴的形式將一些調試工具合並到我的應用程序開發中。 出於顯而易見的原因,我想僅將其包含在調試版本中。

在iOS中,我們可以使用構建配置僅與調試版本鏈接調試庫,並使用宏來刪除處理調試的部分代碼。 這使得在調試和生產版本之間切換變得非常容易。 無論如何為Android實現同樣的目標?

到目前為止,我得到的最接近的是使用Maven配置文件覆蓋應用程序加載的屬性文件,但這需要仍然導入調試庫。


為了澄清我的問題,這就是我想要做的:我構建了一個庫,可以讓你在瀏覽器上瀏覽SQLite數據庫。 它對於調試非常有用,但我不想將我的應用程序與庫一起發送。

另一個目的是使用HockeyApp。 HockeyApp提供兩個功能:更新通知和崩潰報告。 我需要三個不同的構建才能工作:

  • 生產:崩潰報告開,更新通知關閉
  • Beta:兩者都在
  • 調試:兩者都關閉

在清單的<application> ,您可以設置debuggable屬性。 如果省略該屬性,Eclipse會自動為您執行此操作。 調試版本具有debuggable=true ,導出良好的版本具有debuggable=false

這會影響Log.d,您可以使用以下方法有條件地檢入代碼:

boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));

除了Maven之外,一種方法是使用像Dagger這樣的依賴注入器

通過構建標准的javax.inject注釋(JSR-330),每個類都很容易測試。 您不需要一堆樣板來將RpcCreditCardService換成FakeCreditCardService。

依賴注入不僅僅用於測試。 它還可以輕松創建可重復使用的可互換模塊。 您可以在所有應用中共享相同的AuthenticationModule。 您可以在開發期間運行DevLoggingModule,在生產中運行ProdLoggingModule以在每種情況下獲得正確的行為。

解決此問題的一種方法是檢查PackageManager#getInstallerPackageName的返回值。 如果通過adb,網頁或HockeyApp等服務手動安裝apk,則返回null。 事實上,我最近在我們的sdk中添加了類似的檢查,請參閱此提交

請注意,只有通過Google Play分發您的(付費)應用時,此解決方案才可靠。 上次我檢查時,Amazon App Store或AndroidPIT等替代商店沒有設置安裝程序源(可以從API級別11開始設置它,請參閱PackageManager#setInstallerPackageName )。

另一種選擇是在運行時檢查包名稱。 對於您的beta版本,您可以將“.beta”附加到包名稱,然后檢查此后綴以啟用應用內更新或調試內容。 您可以通過將代碼庫移動到庫項目並設置兩個引用此庫項目的應用程序項目來實現此目的:一個用於商店應用程序,一個用於beta應用程序。 我們使用aapt選項--rename-manifest-package來更改beta版本的包名稱(詳見此處 )。

你有沒有使用BuildConfig.DEBUG,這是由android adt工具創建的

/ GEN / BuildConfig

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM