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

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

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

#1楼 票数:16

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

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

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

如下所示:

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

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

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
}

#2楼 票数:8 已采纳

没有(默认情况下)Java的任何预处理器,所以在编译时没有#ifdef东西。 但是如果您不介意在您的应用程序中保留调试代码,那么您可以使用以下代码检查应用程序是否在运行时发布或调试:

Boolean release = (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE);

它检查debuggable标志值。 并且对于发布版本,flad会自动设置为false ,对于调试版本则为true

如果您想摆脱一些调试代码,可以尝试使用ProGuard去除某些类或方法。 默认情况下,ProGuard仅参与构建发布版本的过程。

#3楼 票数:0

我通常创建一个单独的日志类,其中我设置一个静态DEBUG变量。 现在我需要在获得生成构建之前将DEBUG变量设置为false。

public class Log {
     public final static String LOGTAG = "APP NAME";

      public static final boolean DEBUG = true;

      public static void v(String msg) {
        android.util.Log.v(LOGTAG, msg);
      }

      public static void e(String msg) {
        android.util.Log.e(LOGTAG, msg);
      }

      public static void d(String msg) {
          android.util.Log.d(LOGTAG, msg);
      }
}

用于记录 -

if(Log.DEBUG) Log.v("In some function x. Doing y.");

#4楼 票数:0

我遇到了同样的问题,因为每次我运行项目时,它都是用于在调试器模式下打开的android应用程序,但问题解决了。

- 如果您在eclipse中工作,则必须使用Java EE透视图 - 而不是选择Java透视图。

- 清理你的应用程序。 - 从设备上卸载应用程序。 - 重新启动您的设备(就像这样,以便不存储缓存) - 运行您的应用程序。

调试器模式此时不会显示。 复制bin文件夹中生成的apk,并在其他设备上试用

#5楼 票数:0

我找到了一种方法来正确模拟预处理指令:

在我的Gradle buildTypes我定义:

release {
    buildConfigField "boolean", "isDebug", "false"
    ...
}

debug {
    buildConfigField "boolean", "isDebug", "true"
    ...
}

然后,在我的代码中,我做如下:

if (BuildConfig.isDebug) {
    ... do debug stuff ...
}

如果需要,当然:

else {
    ... do release stuff ...
}

这两个块都存在于debug APK中,但是在构建release版本时, Proguard足够聪明地确定可以删除debug块,因为它依赖于if (false) (也从结果代码中删除)。

你应该从debug块调用一些特定于调试的类,并且只从那里调用它们,它们将从生成的APK中被删除,因为它们被认为是未使用的 ,这也是一个有趣的观点:你的代码不能以它将使用的方式进行调整那段代码。

我可以通过检查我的dumpmappingusage Proguard输出文件来确定所有这些。

  ask by Pijusn translate from so

未解决问题?本站智能推荐:

2回复

Android-发布签名版本中的不同行为?

我的Android应用程序有一些非常奇怪的“错误”,我从Eclipse运行它运行良好,非常完美。 它包含一个登录屏幕,我可以在Eclipse中运行时访问并进入我的主屏幕。 当我按下主页并返回到我的应用程序时,它返回到应用程序所在的最后位置(活动)。 然而,当我发布一个构建标志并将其部署
1回复

Android:在AndroidStudio中生成调试版本apk和发布版本apk的过程

在Android Studio中,有两种生成APK的方法-即Debug build Apk和Release Build Apk。 现在的问题是如何生成两种Apk? 此问题对Freshers Android开发人员有帮助。 谢谢
1回复

为发布而构建的Android应用程序仍在尝试连接到localhost:8081

我试图在我的 Android 手机上获得我的 React Native 应用程序的 alpha 版本,但是当我打开它时,它立即崩溃。 幸运的是,它已经过检测,所以我可以看到所有错误都是因为它仍在尝试连接到 Metro 服务器,这是我期望从调试版本中获得的,但我无法弄清楚如何在发布版本中阻止这些调用。
3回复

导出Android应用程序到底有什么作用?

http://developer.android.com/tools/publishing/preparing.html上的说明表明,在将我的android应用程序发布给公众之前,我应该先导出它。 导出中执行哪些步骤? 这是我所了解的: <Application>中的an
2回复

Android-多个应用程序具有相同的核心功能

我目前正在开发一个Android应用,该应用需要以单独apk的形式分发给n个客户的商店。 全部具有相同的功能,只是设计有所不同,有时甚至是文字。 您将如何处理? 您会推荐哪些最佳做法? 我绝对可以再次从头开始。 这是一个附带项目,因此最佳实践首先是:)
1回复

为什么要使用调试版本?[关闭]

我有一个简单的问题: 为什么要在Android Apps中使用调试配置? 我提出这个问题的原因是,我遇到了一些仅发布的错误,如果我总是在发布版本中调试代码,则可以完全避免。 因此,在发行版中,我只是将debuggable标志设置为true并在调试期间禁用ProGuard。 ->
1回复

免费上传Playstore免费和付费应用程序

你是否可以在印度和其他国家/地区免费发布相同的APK文件? 如果是,那怎么样? 我搜索过 ,发现我们需要释放两个不同的apk用于类似的情况。
6回复

如何使Android应用程序自动配置调试与发布值?

我正在开发Android应用程序,特别是使用Facebook Android SDK的应用程序。 在开发模式中,我正在使用一个带有一个ID的测试Facebook应用程序。 但是,在发布模式下,该应用程序将使用具有不同ID的第二个Facebook应用程序。 我想知道大多数Android(或