成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android 技巧-Debug 判斷不再用 BuildConfig

企業動態
Android 開發中一般會通過 BuildConfig.DEBUG 判斷是否是 Debug 模式,從而做一些在 Debug 模式才開啟的特殊操作,比如打印日志。這樣好處是不用在發布前去主動修改,因為這個值在 Debug 模式下為 true,Release 模式下為 false。

Android 開發中一般會通過 BuildConfig.DEBUG 判斷是否是 Debug 模式,從而做一些在 Debug 模式才開啟的特殊操作,比如打印日志。這樣好處是不用在發布前去主動修改,因為這個值在 Debug 模式下為 true,Release 模式下為 false。

1. 問題

如果應用只有一個 Module 沒有問題,Debug 模式下 BuildConfig.DEBUG 會始終為 false。如果現在有兩個 Module,分別為 App 和 Lib,且 App 依賴 Lib,在 Lib 內有工具類 LogUtils,代碼如下:

當我們在 App Module 內調用 LogUtils 時我們會發現始終無法打印日志,因為上面的 BuildConfig.DEBUG 會始終為 false。為什么呢?

2. 原因

BuildConfig.java 是編譯時自動生成的,并且每個 Module 都會生成一份,以該 Module 的 packageName 為 BuildConfig.java 的 packageName。所以如果你的應用有多個 Module 就會有多個 BuildConfig.java 生成,而上面的 Lib Module import 的是自己的 BuildConfig.java,編譯時被依賴的 Module 默認會提供 Release 版給其他 Module 或工程使用,這就導致該 BuildConfig.DEBUG 會始終為 true。

3. 解決方案

根據上面分析的原因,目前我們有兩個思路:

(1) 始終調用最終運行的 Module 的 BuildConfig,因為它沒有被任何其他 Module 依賴,所以 BuildConfig.DEBUG 值會準確。

(2) 讓被依賴的 Module 提供除 Release 版以外的其他版本。

3.1 解決方案一:使用其他的 BuildConfig.java

如果 Lib Module 中能夠 import 到外層真正運行 App 的 BuildConfig 就 ok 了,如下:

通過反射得到真正執行的 Module 的 BuildConfig,在自己的 Application 內調用:

AppUtils.syncIsDebug(getApplicationContext());

這樣看起來達到目的了。

但仔細看看會發現這種解決方案還是有問題,因為 BuildConfig.java 的 packageName 是 Module 的 Package Name,即 AndroidManifest.xml 中的 package 屬性,而 context.getPackageName() 得到的是應用的 applicationId,這個 applicationId 通過 build.gradle 是可以修改的。所以當 build.gradle 中的 applicationId 與 AndroidManifest.xml 中的 package 屬性不一致時,上面的反射查找類路徑便會出錯。

PS:這種方案還有個變種就是通過 android.app.ActivityThread.currentPackageName 得到包名,從而省去傳遞 Context 初始化的步驟,但依然有 applicationId 被修改后類查找不到類似的問題。

3.2 解決方案二:Lib publishNonDefault

讓被依賴的 Module 提供除 Release 版以外的其他版本,這種方案需要將所有被依賴 library 中添加:

  1. android {  
  2. publishNonDefault true  

表示該 Module 不使用默認配置,這樣會同時打包其他版本,包括 Debug 版。另外需要在 App Module 中將其依賴的 library 如下逐個添加:

  1. dependencies { 
  2. releaseCompile project(path: ':library', configuration: 'release'
  3. debugCompile project(path: ':library', configuration: 'debug'

表示依賴不同版本的依賴 Module。

然而這種方式所有 Module 配置都需要修改,侵入性太強。

3.3 最終解決方案:使用 ApplicationInfo.FLAG_DEBUGGABLE

既然 BuildConfig 的方式行不通,我們反編譯 Debug 包和 Release 包對比看看有沒有其他的區別,會發現他們 AndroidManifest.xml 中 application 節點的 android:debuggable 值是不同的。Debug 包值為 false,Release 包值為 true,這是編譯自動修改的。所以我們考慮通過 ApplicationInfo 的這個屬性去判斷是否是 Debug 版本,如下:

在自己的 Application 內調用進行初始化,

AppUtils.syncIsDebug(getApplicationContext());

這樣以后調用 AppUtils.isDebug() 即可判斷是否是 Debug 版本,比如在上面的 LogUtils 中。同時適用于 Module 是 Lib 和 applicationId 被修改的情況,比 BuildConfig.DEBUG 靠譜的多。

這個方案有個注意事項就是自己 App Module 中不能主動設置 android:debuggable,否則無論 Debug 還是 Release 版會始終是設置的值。當然本身就沒有自動設置的必要。

【本文是51CTO專欄作者Trinea的原創文章,轉載聯系作者本人獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2014-07-09 10:56:44

.NET框架

2022-12-05 11:44:49

PrintDebugIceCream

2018-04-26 11:37:47

蘋果iPhone命名

2025-06-03 06:00:00

margin-topCSS開發

2013-07-31 13:36:07

Windows PhoVS調試技巧Windows Pho

2014-08-07 10:03:31

debug技巧原則

2016-03-01 14:37:38

iOSLLDB調試技巧

2014-08-07 10:49:20

debugdebug技巧

2019-08-16 09:22:38

技術調試互聯網

2017-07-19 16:34:44

筆記本拆解技巧

2009-09-17 17:20:21

Android Deb

2025-04-03 08:00:51

2021-08-09 19:01:36

并行場景程序

2024-11-26 14:18:44

Python代碼技巧

2022-10-08 00:03:00

Debug技巧調試

2023-09-14 12:03:30

空指針判空

2010-01-27 17:45:15

Android應用技巧

2017-03-02 10:30:57

AndroidAndroid Stu技巧

2010-01-27 10:21:00

Android菜單

2015-03-04 10:31:16

GoogleAndroid5.0
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产真实乱全部视频 | 五月天天丁香婷婷在线中 | 亚洲精品乱码久久久久久9色 | www.99精品| 日韩中文在线视频 | 国产高清区 | 91偷拍精品一区二区三区 | 中文字幕国产第一页 | 密色视频 | 国产成人精品久久二区二区91 | 亚洲一区二区三区四区五区中文 | 国产精品区二区三区日本 | 最新日韩在线视频 | 日韩一级| 亚洲一区毛片 | 一二区视频| 激情三区 | 免费在线成人 | 久草成人网 | av大片在线 | 精品乱码一区二区三四区视频 | 免费精品 | 欧美成人综合 | 国产精品揄拍一区二区久久国内亚洲精 | 成人免费视频播放 | 在线中文字幕av | 日韩精品一区二区三区在线播放 | 精品成人 | 国产一区二区三区免费 | 欧美在线一二三 | 久久久久久久一区 | 成人在线亚洲 | 国产精品黄色 | 一区二区三区在线 | 久久久久久国产精品久久 | 一区二区三区四区在线播放 | 免费一级网站 | 午夜成人在线视频 | 国产黄色一级片 | 黄色片网站在线观看 | 九九九久久国产免费 |