ADT何时将BuildConfig.DEBUG设置为false?
在最新版本的ADT(r17)中,生成的常量被添加了根据构buildtypes设置的BuildConfig.DEBUG
。 我的问题是,它从来没有设置为false,我希望它做“Android工具 – >导出签名的应用程序包”,但它不适合我。
那么如何改变构buildtypes呢?
增加了一个function,只允许您在debugging模式下运行一些代码。 Builds现在生成一个名为BuildConfig的类,其中包含一个根据您的构buildtypes自动设置的DEBUG常量。 您可以检查代码中的(BuildConfig.DEBUG)常量以运行仅debuggingfunction
目前,通过禁用“自动构build”,清理项目,然后通过“Android工具 – >导出签名的应用程序包”导出,您可以获得正确的行为。 当你运行应用程序时, BuildConfig.DEBUG
应该是false。
它不能正常工作:
问题27940 :导出的应用程序包的BuildConfig.DEBUG为“true”
令人失望的是,他们有时会发布错误的function。
在Eclipse中 ,我始终在发布中导出应用程序之前禁用“自动构build”选项。 然后我清理项目并导出。 否则它开始以debugging模式编译,然后BuildConfig.DEBUG的值可能是错误的。
使用Android Studio ,我只需在build.gradle中添加自己的自定义variables:
buildTypes { debug { buildConfigField "Boolean", "DEBUG_MODE", "true" } release { buildConfigField "Boolean", "DEBUG_MODE", "false" } }
当我构build项目时,BuildConfig.java如下生成:
public final class BuildConfig { // Fields from build type: debug public static final Boolean DEBUG_MODE = true; }
然后在我的代码中,我可以使用:
if (BuildConfig.DEBUG_MODE) { // do something }
我build议在切换debugging/发布版本之后进行清理。
它可以工作,但是请注意,即使导出签名文件,代码文件也不会更改。 导出过程将此variables的值更改为false,这可能会给您错误的印象,即它不起作用。 我用类似的日志语句testing了这个
if (com.mypackage.BuildConfig.DEBUG) Log.d(TAG, location.getProvider() + " location changed");
testing时,我的Log语句不再产生任何输出。
我的解决scheme:
- 项目 – >自动生成
- 项目 – >清洁
- 项目 – >构build
- 项目导出Android应用程序
这是在r20工作
从准备发布 :
closures日志和debugging
确保在构build要发布的应用程序之前停用日志logging并禁用debugging选项。 您可以通过删除对源文件中的日志方法的调用来停用日志logging。 您可以通过从清单文件中的标记删除android:debuggable属性或通过在清单文件中将android:debuggable属性设置为false来禁用debugging。 另外,删除在您的项目中创build的任何日志文件或静态testing文件。
另外,您应该删除添加到代码中的所有debugging跟踪调用,例如startMethodTracing()和stopMethodTracing()方法调用。
更多信息在链接之后。
我想提出一个简单的解决方法,如果您在APK导出期间使用proguard。
Proguard提供了一种在发行模式中移除对特定function的呼叫的方法。 任何debugging日志的调用都可以通过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
有了这个,你不需要关心任何不必要的string计算传递给@Jeremyfa指向的debugging日志。 计算只是在发布版本中删除。
因此,BuildConfig.DEBUG的解决方法使用proguard的相同function,如下所示。
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
选项,因为这不取决于构build器的单独IDE设置,而是作为提交文件维护,这些文件在开发人员之间共享。
检查imports
,有时BuildConfig是无意中从任何类库导入的。 例如:
import io.fabric.sdk.android.BuildConfig;
在这种情况下, BuildConfig.DEBUG将总是返回false ;
import com.yourpackagename.BuildConfig;
在这种情况下, BuildConfig.DEBUG将会返回你真正的构build变体 。
PS我只是复制这个从我的答案在这里: BuildConfig.DEBUG总是假的时候用gradle构build库项目
根据我的理解,无法正常工作( Android问题22241 )
我在项目(使用Eclipse)上遇到了一些麻烦,导出签名的我的项目的APK时,常量没有设置为true 🙁
很想听到它的作品,虽然
创build自己的class级的一个好方法是:
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 ); } }
我已经看到了一些奇怪的行为,当BuildConfig中的值被设置为最终值时,这些行为都与此有关。 这可能与你的问题有关。
简单的解释是默认值是在Proguard运行之前初始设置的,然后在Proguard运行之后,BuildConfig文件会重新生成正确的值。 不过,Proguard已经在这一点上优化了你的代码,你有问题。
这是我针对Gradle创build的一个bug。 https://code.google.com/p/android/issues/detail?id=182449