根据谷歌,我必须在发布我的Android应用程序谷歌播放之前“停用源代码中的Log方法的任何调用”。出版清单第3节节选:

在构建应用程序发布之前,请确保禁用了日志记录并禁用了调试选项。您可以通过删除源文件中对Log方法的调用来禁用日志记录。

我的开源项目很大,每次发布都要手动完成,这很痛苦。此外,删除Log行可能很棘手,例如:

if(condition)
  Log.d(LOG_TAG, "Something");
data.load();
data.show();

如果注释Log行,则该条件将应用于下一行,并且可能不会调用load()。这样的情况是否罕见到我可以决定它不应该存在?

那么,是否有更好的源代码级方法来做到这一点呢?或者是一些聪明的ProGuard语法,有效但安全地删除所有Log行?


当前回答

这些都是很好的答案,但是当我完成我的开发时,我既不想在所有的Log调用周围使用if语句,也不想使用外部工具。

所以我使用的解决方案是用我自己的Log类替换android.util.Log类:

public class Log {
    static final boolean LOG = BuildConfig.DEBUG;

    public static void i(String tag, String string) {
        if (LOG) android.util.Log.i(tag, string);
    }
    public static void e(String tag, String string) {
        if (LOG) android.util.Log.e(tag, string);
    }
    public static void d(String tag, String string) {
        if (LOG) android.util.Log.d(tag, string);
    }
    public static void v(String tag, String string) {
        if (LOG) android.util.Log.v(tag, string);
    }
    public static void w(String tag, String string) {
        if (LOG) android.util.Log.w(tag, string);
    }
}

在所有的源文件中,我唯一要做的就是用我自己的类替换android.util.Log的导入。

其他回答

这是我如何解决它在我的Kotlin项目前进入生产:

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int d(...);
    public static int w(...);
    public static int v(...);
    public static int i(...);
    public static int e(...);
}

我在谷歌IO示例应用程序中使用了LogUtils类。我将其修改为使用特定于应用程序的DEBUG常量而不是BuildConfig。因为BuildConfig. DEBUG。DEBUG不可靠。然后在我的课程中,我有以下内容。

import static my.app.util.LogUtils.makeLogTag;
import static my.app.util.LogUtils.LOGV;

public class MyActivity extends FragmentActivity {
  private static final String TAG = makeLogTag(MyActivity.class);

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LOGV(TAG, "my message");
  }
}

我发布的这个解决方案特别适用于Android Studio用户。我最近也发现了Timber,并通过以下方法成功地将其导入到我的应用程序中:

将最新版本的库放入build.gradle:

compile 'com.jakewharton.timber:timber:4.1.1'

然后在Android工作室,点击编辑->查找->替换路径…

输入Log。e(TAG,或任何您已经定义到“Text to find”文本框中的日志消息。然后你只需将其替换为timber。

单击“查找”,然后替换全部。

Android Studios现在将遍历项目中的所有文件,并将所有日志替换为木材。

我用这个方法遇到的唯一问题是,gradle之后会出现一百万个错误消息,因为它无法在每个java文件的导入中找到“Timber”。只需点击错误和Android工作室将自动导入“木材”到你的java。一旦你为所有的错误文件做了这些,gradle就会再次编译。

你还需要把这段代码放在你的Application类的onCreate方法中:

    if (BuildConfig.DEBUG) {
        Timber.plant(new Timber.DebugTree());
    }

这将导致只有当你处于开发模式而不是生产模式时才会出现应用日志记录。你也可以使用BuildConfig。RELEASE表示登录RELEASE模式。

你可以试试这个简单的常规方法:

Ctrl + Shift + R

取代

Log.e(

With

// Log.e(

打开“Application->app->proguard-rules.pro” 在proguard-rules.pro '中输入以下代码 android.util.Log { 公共静态*** d(…); 公共静态*** v(…); 公共静态*** w(…); 公共静态*** i(…); 公共静态*** e(…); }

#你可以删除特定的调试类,如果你想在日志中的调试类型错误

In build.gradle(app) ->android do this thing buildTypes { debug{ debuggable false minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android- optimize.txt'), 'proguard-rules.pro' } release { debuggable false minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android- optimize.txt'), 'proguard-rules.pro' } } lintOptions { checkReleaseBuilds false // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: abortOnError false }