java - Android 应用程序的发布调试版本

标签 java android build release

在 C++ 中,我通常会设置 2 个构建 - 调试和发布,每个构建分别预定义了 DEBUGRELEASE。然后我会使用这些定义来确定常量值,例如启用/禁用日志记录、服务器 URL 等。

现在,在 Java/Android 中,我会在构建发布之前注释掉一些东西。这不是一个好方法,我可以告诉。我可能会忘记一些事情。

在构建发布版本(已签名)或调试版本(未签名)时确保不会遗漏任何内容的常见做法是什么?

最佳答案

如果您从 Eclipse 运行应用程序,它将始终是调试。

导出应用程序时(Android 工具 -> 导出(未)签名的应用程序包)

如果你想动态知道它是发布还是调试,你可以使用BuildConfig.DEBUG(它位于gen文件夹中,我不知道是否所有API级别都支持)

喜欢如下:

if (BuildConfig.DEBUG) {
    Log.d(TAG, "Text");
}

如果您查看生成的字节码,您将看到以下内容(在 Debug模式下):

public class Sample{

    private static final boolean LOG_ENABLED = true;

    public static void main(String args[]){
        if (BuildConfig.DEBUG){
            System.out.println("Hello World");
        }
    }
}

产生以下字节码:

public class Sample extends java.lang.Object{
    public Sample();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   return

    public static void main(java.lang.String[]);
      Code:
       0:   getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       3:   ldc #3; //String Hello World
       5:   invokevirtual   #4; //Method Java/io/PrintStream.println(Ljava/lang/String;)V
       8:   return

}

如果 BuildConfig.DEBUG 为 false

public class Sample extends java.lang.Object{
    public Sample();
      Code:
       0:   aload_0
       1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
       4:   return

    public static void main(java.lang.String[]);
      Code:
       0:   return
}

关于java - Android 应用程序的发布调试版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12458818/

相关文章:

java - 如何从字符串中获取经过的年数

android - Android Gradle插件3.0.1-将字节码转换为dex时出错

java - 与 Maven 相比,构建 Java Web 应用程序的更好、更简单和更现代的方法是什么?

delphi - 如何使用 Delphi 从命令行编译 Win32 程序

java - 将 Applet 集成到 Spring Web 应用程序

java - java类中的Struts2国际化

java - 如何在不使用(string== null)的情况下检查字符串是否仅为null?

android - android中的谷歌浏览器动画效果

android - android中谷歌地图上的绘图工具

gcc - 使用不同的 gcc 版本构建 boost