将我自己的应用程序的LogCat输出关闭,然后再将其发布到市场上很简单。我也知道如何为我自己的调试方便性按标签和/或ID选择性过滤LogCat消息。
但是现在我对可能更困难(也许不可能吗?)感兴趣:禁用所有LogCat输出,包括&尤其是那些来自第三方服务(如TtsService,GoogleLoginService等)的输出
这可能吗?
进一步说明:我不是有兴趣自行过滤邮件。无论是谁从Android电子市场下载我的应用,我都想禁用第三方消息。这可能吗?
您可以通过告诉ProGuard假定没有问题,使用ProGuard完全删除不使用返回值的任何行。
以下proguard.cfg块指示删除Log.d,Log.v和Log.i调用。
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** w(...);
public static *** v(...);
public static *** i(...);
}
最终结果是这些日志行不在您的发行版APK中,因此任何使用logcat的用户都不会看到d / v / i日志。
如果不使用proguard,则必须自己管理日志,并在清单文件中将其设置为dubugable false
<application
android:name="MyApplication"
android:icon="@drawable/gift"
android:label="@string/app_name" android:debuggable="@bool/build_log">
这里是我的自定义日志类
public class Lol {
public static final boolean ENABLE_LOG = true & MyApplication.sDebug;
private static final boolean DEBUG = true & ENABLE_LOG;
private static final boolean VERBOSE = true & ENABLE_LOG;
private static final boolean TEMP = true & ENABLE_LOG;
private static final boolean WARNING = true & ENABLE_LOG;
private static final boolean INFO = true & ENABLE_LOG;
private static final boolean ERROR = true & ENABLE_LOG;
public static void obvious(String tag, String msg) {
if (DEBUG) {
msg = "*********************************\n" + msg
+ "\n*********************************";
Log.d(tag, msg);
}
}
public static void d(String tag, String msg) {
if (DEBUG)
Log.d(tag, msg);
}
public static void d(boolean bool, String tag, String msg) {
if (TEMP&bool)
Log.d(tag, msg);
}
public static void i(String tag, String msg) {
if (INFO)
Log.i(tag, msg);
}
public static void e(String tag, String msg) {
if (ERROR)
Log.e(tag, msg);
}
public static void e(boolean bool, String tag, String msg) {
if (TEMP&bool)
Log.e(tag, msg);
}
public static void v(String tag, String msg) {
if (VERBOSE)
Log.v(tag, msg);
}
public static void w(String tag, String msg) {
if (WARNING)
Log.w(tag, msg);
}
public static String getStackTraceString(Exception e) {
return Log.getStackTraceString(e);
}
public static void w(String tag, String msg, Exception e) {
if (WARNING)
Log.w(tag, msg,e);
}
}
在应用程序build.gradle文件中:
release {
minifyEnabled true
……
}
在proguard-rules.pro中:
-assumenosideeffects class android.util.Log {
public static *** v(...);
public static *** d(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
}
-ignorewarnings
对我有用。
David Caunt提供的好答案似乎不适用于proguard-android-optimize.txt
中定义的规则。
[而不是使用通配符***
,当前版本的ProGuard似乎期望返回参数的类型限定符:
-assumenosideeffects class android.util.Log {
public static int d(...);
public static int w(...);
public static int v(...);
public static int i(...);
public static int wtf(...);
}
您可以在buildTypes版本上放入debuggable false。
buildTypes {
release {
debuggable false
...
}
}
我通常接下来做:
if (BuildConfig.DEBUG) Log.i(TAG, msg);
尽管如果您有很多依赖项(库)并且它们写得不好,那么请使用https://stackoverflow.com/a/5553290/4548520
缩短行数:
private final static boolean DEBUG = BuildConfig.DEBUG;
if (DEBUG) Log.i(TAG, msg_1);
if (DEBUG) Log.e(TAG, msg_error_2);
我合并了David Snabel-Caunt's接受的答案,除了将Android SDK中的默认ProGuard设置(“ proguard-android.txt”文件)换成“ proguard-android-optimize”。 txt”优化文件。该文件在此Android SDK文件夹中也可用,具有相同的规则,但启用了优化。
implementation 'androidx.webkit:webkit:1.2.0'
<"meta-data android:name="android.webkit.WebView.EnableSafeBrowsing">
android:value="true" />
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'
}
}
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
public static int wtf(...);
}
mWebView.loadUrl(url);
CookieManager.getInstance().setAcceptCookie(false);
WebViewDatabase.getInstance(this).clearFormData();
mWebView.getSettings().setAppCacheEnabled(false);
mWebView.getSettings().setSavePassword(false);
mWebView.getSettings().setSaveFormData(false);
mWebView.clearCache(true);
mWebView.clearFormData();
mWebView.clearHistory();
mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setLoadWithOverviewMode(false);
mWebView.getSettings().setUseWideViewPort(false);
mWebView.getSettings().setBuiltInZoomControls(false);
mWebView.getSettings().setSupportZoom(false);
mWebView.getSettings().setPluginState(WebSettings.PluginState.OFF);
PackageInfo webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(getActContext());
Log.d("MY_APP_TAG", "WebView version: " + webViewPackageInfo.versionName);