2010-11-16 60 views
8

我有很多Log.i Log.d Log.e在我的代碼中有很多我最近做的應用程序。我即將發佈這個應用程序,並且我不想讓人們在將手機插入adb時看到它,但我確實希望在那裏進行自己的調試。android.util.Log發佈時 - 我能做什麼/不能做

我想擴展android.util.log,只是在那裏有一個布爾開關,所以我可以關閉日誌,當我發佈並在開發時打開它,但這個類是最終的,我錯過了一個把戲?

我真的不想通過我的代碼一個刪除所有,如果最壞的情況是真的,我可以做一個CTRL + H全局替換日誌爲//日誌,但這確實吸引作爲答案。

我也意識到Log.d在運行時被剝離出來,但它仍然運行(失去一點性能),所以不運行這將是一個額外的獎勵。

是的,所以基本上我正在尋找一種方法來以編程方式打開和關閉我的調試,這也可以讓我稍後使它成爲一種偏好或某些事情,如果人們想要查看它或幫助併發送它。

你們爲此做了什麼?

由於使用ProGuard作爲proguard的擁有使用時,你寫你的ProGuard配置file..nice和簡單過濾出來的命令和它的作品

回答

16

正如Octavian指出的那樣插入一個日誌記錄常量是最好的方法。如果啓用調試,爲此編寫一個調用原始日誌記錄方法的新類不是一個好主意。

良好做法:

if (C.D) { Log.d(C.T, "your log text here " + foo + bar); } 

錯誤做法:

YourLog.d("your log text here " + foo + bar); 

// and in YourLog.java's d() method: 
... { if (debugging) Log.d(tag, text); } 

第一個解決方案是非常快的,如果C類的常數d是假的。如果您在創建日誌字符串時有複雜的字符串操作,那麼在調試停用時它們將不會被執行。如果D爲假,編譯器甚至可以在編譯時刪除這些操作,這可能導致運行時開銷爲零。第二個(壞)解決方案將始終構建整個字符串並調用一個方法,這是您不需要的開銷。

一般來說,第一種解決方案是最好的。是的,我打電話給班級和成員C,D和T(常量/調試/標籤) - 出於性能方面的原因。 ;-)

+1

啊,是的,我有一個靜態導入在我的課堂頂部,並會做(D)Log.d ....感謝最小的入侵和一個很好的切換! – Blundell 2010-11-17 20:03:12

+4

我投了這個答案,但值得一提的是,如今在Proguard中很好地集成了Android Eclipse構建過程,使用'YourLog.d()'的「壞習慣」可以很好:只需添加'YourLog.d ()「列出Proguard將要剝離的事物列表。 – ahcox 2012-05-08 15:32:46

+1

另外值得指出的是,當您構建時,會生成一個BuildConfig類,其DEBUG標誌在發佈版本時設置爲false(例如,使用「ant release」構建的那可能是這種情況下的CD – frenziedherring 2012-10-12 01:12:59

2

模糊處理他們在你的發行代碼中的任何方式,因爲他們將需要處理,這隻會導致不必要的電池消耗。

你可以在你的應用程序的某個地方設置一個布爾值來表示你的代碼的開發或發佈版本,並且有很多if塊檢查標誌並執行你的日誌代碼,但這隻會導致代碼膨脹。

你應該擺脫它們,一旦你不再需要它們。

+1

我想這樣做,只是從來沒有看過與android的proguard聽說它很粘,是的eclipse插件:-加另外,這不會讓我打開和關閉,如果說一個用戶發現錯誤。 – Blundell 2010-11-17 20:04:26

2

這通常是一個很好的做法不包括