2012-03-24 97 views
96

在最新版本的ADT(r17)中,生成的常量增加了BuildConfig.DEBUG,該值是根據構建類型設置的。我遇到的問題是,它從來沒有設置爲false,我希望它在執行「Android工具 - >導出簽名的應用程序包」時發生變化,但它不適用於我。ADT何時將BuildConfig.DEBUG設置爲false?

那麼如何更改構建類型?

Added a feature that allows you to run some code only in debug mode. Builds now generate a class called BuildConfig containing a DEBUG constant that is automatically set according to your build type. You can check the (BuildConfig.DEBUG) constant in your code to run debug-only functions

+2

BuildConfig.java構建工具,並放置到根文件夾。已簽名的APK應該具有BuildConfig.DEBUG = false。它不應該是你的問題。您不應該手動觸摸該文件... – 2013-11-27 19:27:11

+1

如果使用gradle釋放此標誌是100%可靠的。所以當你做一個./gradlew assembleDebug它的真實情況,並且在做彙編時它的錯誤。 – slott 2013-12-26 17:27:37

回答

53

目前,您可以通過禁用「自動構建」,清除項目,然後通過「Android工具 - >導出簽名的應用程序包」導出來獲得正確的行爲。當您運行應用程序BuildConfig.DEBUG應該是錯誤的。

+6

沒有爲我工作(r21p2,六月,Win7) – Tom 2012-09-11 20:43:01

+3

我同意湯姆。在r21 ... – ChuongPham 2012-11-16 14:04:15

+0

也被破壞了。其結果是顯示所有應該被該標誌省略的Log.d消息。 ps。在哪裏提交錯誤報告? – tomi 2013-01-24 10:37:14

1

正常,據我瞭解(Android issue 22241

我曾在一個項目的一些麻煩(使用Eclipse工作)不工作,出口的簽署APK時常數未設置爲true我項目:(

很想聽到它的工作原理雖然

+1

它應該已經在r17中修復了,它在bug跟蹤器中被標記爲這樣。 – smith324 2012-03-24 22:59:59

+2

我剛剛嘗試過它,它爲我工作。 – 2012-03-28 22:24:39

+1

實際上,在導出(在Ant中工作)時,libs不會在ADT中以發佈模式進行編譯。我更新了http://code.google.com/p/android/issues/detail?id=27940 – 2012-03-28 22:51:41

5

Preparing for Release

Turn off logging and debugging

Make sure you deactivate logging and disable the debugging option before you build your application for release. You can deactivate logging by removing calls to Log methods in your source files. You can disable debugging by removing the android:debuggable attribute from the tag in your manifest file, or by setting the android:debuggable attribute to false in your manifest file. Also, remove any log files or static test files that were created in your project.

Also, you should remove all Debug tracing calls that you added to your code, such as startMethodTracing() and stopMethodTracing() method calls.

更多信息正在關注該鏈接。

+1

我認爲這個過程現在在編譯時自動發生:http://developer.android.com/tools/sdk/tools-notes.html – 2013-11-27 19:40:45

+0

導致編譯時錯誤:«避免硬編碼調試模式;留下它允許調試和發佈版本自動分配一個» – 2015-04-07 21:30:41

32

它不能正常工作:

問題27940:BuildConfig.DEBUG是導出的應用程序包

這是令人失望的是,他們有時會釋放出越野車的特點「真」。

+9

請轉到上面提到的問題的鏈接,如果您希望修復此問題,請點擊「星號」。 – Guy 2012-07-30 05:56:13

5

對我來說,解決辦法:

  1. 項目 - >自動構建
  2. 項目 - >清潔
  3. 項目 - >構建
  4. 項目導出Android應用

這是工作r20

+1

看起來它在r21中再次被打破。該死的,谷歌... – ChuongPham 2012-11-16 14:02:51

+1

這剛剛爲我工作(使用最新的ADT我猜)。也許清潔固定它,不知道。 – Jonny 2013-01-15 09:03:16

9

它確實有效,bu請注意,即使導出簽名文件,代碼文件也不會更改。輸出進程將此變量的值更改爲false,這可能會給您錯誤的印象,即它不起作用。 我的日誌語句測試這個喜歡

if (com.mypackage.BuildConfig.DEBUG) 
      Log.d(TAG, location.getProvider() + " location changed"); 

測試時,我的日誌報表不再產生任何輸出。

+1

這對我來說不起作用(R22)。 – 2013-06-10 16:02:58

+1

你到底做了什麼? – pbhowmick 2013-06-11 13:56:06

+1

我將BuildConfig.DEBUG的實例更改爲com.mypackage.BuildConfig.DEBUG,然後重新運行應用程序...並且它始終返回true。也許我誤解了你的建議。 – 2013-06-12 11:27:02

1

的好方法是創建自己的類:

public class Log { 

public static void d(String message) { 
    if (BuildConfig.DEBUG) 
     android.util.Log.d(
      "[" + (new Exception().getStackTrace()[1].getClassName()) + "]", 
      "{" + (new Exception().getStackTrace()[1].getMethodName()) + "} " 
      + message 
     ); 
} 

} 
+12

這個方法的問題是,當DEBUG爲false的事件,Java仍然會計算每個字符串以將其傳遞給您的自定義類。 if(DEBUG)Log.d(...)不太優雅,但更高效。 – Jeremyfa 2013-09-27 21:42:26

30

隨着Eclipse的,我總是在釋放導出應用程序之前禁用「自動構建」選項。然後我清理項目並導出。否則它開始以調試模式編譯,然後BuildConfig.DEBUG的值可能是錯誤的。

隨着的Android工作室,我只需添加在的build.gradle自己的自定義變量:

buildTypes { 
    debug { 
     buildConfigField "Boolean", "DEBUG_MODE", "true" 
    } 
    release { 
     buildConfigField "Boolean", "DEBUG_MODE", "false" 
    } 
} 

當我生成項目,生成BuildConfig.java如下:

public final class BuildConfig { 
    // Fields from build type: debug 
    public static final Boolean DEBUG_MODE = true; 
} 

然後在我的代碼,我可以使用:

if (BuildConfig.DEBUG_MODE) { 
    // do something 
} 

我建議在切換調試/發佈版本後進行清理。

3

我想,如果你APK出口過程中使用的ProGuard提出一個簡單的解決方法。

Proguard的提供了一種方法,以消除在釋放模式特定函數的調用。任何調試日誌的調用都可以使用proguard-project.txt中的以下設置刪除。

# Remove debug logs 
-assumenosideeffects class android.util.Log { 
    public static *** d(...); 
    public static *** v(...); 
} 

並優化設置在project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt 

有了這個,你不需要關心任何不必要的字符串計算傳遞給@Jeremyfa指向的調試日誌。計算只是在發佈版本中刪除。

所以對於BuildConfig.DEBUG解決辦法使用類似以下的ProGuard的相同特徵。

public class DebugConfig { 

    private static boolean debug = false; 

    static { 
     setDebug(); // This line will be removed by proguard in release. 
    } 

    private static void setDebug() { 
     debug = true; 
    } 

    public static boolean isDebug() { 
     return debug; 
    } 
} 

以下設置在proguard-project.txt

-assumenosideeffects class com.neofect.rapael.client.DebugConfig { 
    private static *** setDebug(); 
} 

我寧願用這個來禁用Build Automatically選項,因爲這不依賴於製造商的個人IDE設置,而是維持作爲其開發者之間共享文件的承諾。

0

我見過有當BuildConfig的值設置爲它們的最終值與做一些奇怪的行爲。這可能與您的問題有關。

簡單的解釋是,默認值設置最初運行Proguard的之前,Proguard的運行在此之後,BuildConfig文件再生與正確的價值觀。但是,Proguard已經通過這一點優化了您的代碼,並且您遇到了問題。

這是我針對Gradle創建的一個bug。 https://code.google.com/p/android/issues/detail?id=182449

3

檢查imports,有時BuildConfig是無意中從任何類庫導入的。例如:

import io.fabric.sdk.android.BuildConfig; 

在這種情況下BuildConfig.DEBUG將始終返回;

import com.yourpackagename.BuildConfig; 

在這種情況下BuildConfig。DEBUG將返回您的實體構建變體

P.S我只是複製這一個從這裏我的答案是:是自動生成的Android BuildConfig.DEBUG always false when building library projects with gradle

+0

是的,對我來說,它是從'android.support.compat'無意中導入的。我想這是另一個用不同的名字來定義你自己的領域的原因。 – arekolek 2017-04-24 10:45:20

相關問題