android关闭日志

我们在开发时,经常会输出各种日志来debug代码。但是等到应用发布的apk运行时不希望它输出日志。

关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(),Log.e()等

原理:

那么我们可以通过proguard导出apk时删除各种日志输出代码。然后,将会过滤掉日志代码。

通过配置proguard,将类android.util.Log的方法给置为为无效代码,然后在导出的apk里就是被删除掉日志的。(proguard是一个代码优化的工具,也可以混淆代码)

如何关闭日志:

我的项目目录:

1)打开proguard-------修改project.properties文件。

在project.properties文件最后行添加:proguard.config=proguard

如我的project.properties文件:

target=android-18

proguard.config=proguard-project.txt

2)配置proguard-------修改proguard配置文件,

如:我的配置文件是:proguard-project.txt

配置为:

-keepclassmembers class * extends android.app.Activity {

public void *(android.view.View);

}

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

-dontwarn android.support.**

-keepclassmembers class **.R$* {

public static <fields>;

}

-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(...);

}

3)导出关闭日志的apk

proguard,在导出apk的时候才会优化代码,生成优化后的apk。(完成代码混淆也是在导出apk,proguard将代码混淆后生成apk)

通过如上两个步骤,配置project.properties文件和proguard.properties文件;那么项目就配置好了。可以直接导出签名apk,该apk不会输出日志,我们用LogCat是看不到该apk的日志。

assumenosideeffects

assumenosideeffects,proguard 配置文件里的参数。assume no side effects;假定无效;该属性也就是标识无效代码。我们就是通过这个参数来让proguard删除日志代码。

assumenosideeffects的官方解释:

In the optimization step, ProGuard will then remove calls to such methods, if it can determine that the return values aren‘t used.ProGuard will analyze your program code to find such methods automatically.It will not analyze library code, for which this option can therefore be useful.

In general, making assumptions can be dangerous; you can easily break the processed code. Only use this option if you know what you‘re doing!

如下:

-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(...);
       }

使用这个配置时,一定要注意-dontoptimize,配置。

don‘t optimize 不要优化;将会关闭优化,导致日志语句不会被优化掉。所以不能有这个配置

测试

源码1)

检验是否真的能优化掉日志。。

[java] view plaincopy

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. Log.e("MainActivity", "log" );
  7. }
  8. }

通过生成的apk反编译出如下代码1-1)

[java] view plaincopy

  1. public class MainActivity extends Activity
  2. {
  3. protected void onCreate(Bundle paramBundle)
  4. {
  5. super.onCreate(paramBundle);
  6. setContentView(2130903040);
  7. }
  8. }

运行LogCat中没有输出日志。

很明显Log.e("MainActivity","log" );被优化掉了

源码2)

Log.e("jiese1990", test() );test()函数会被一起优化掉吗?

[java] view plaincopy

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. Log.e("MainActivity", "log " + test());
  7. }
  8. private String test(){
  9. Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();
  10. return "jjyy";
  11. }
  12. }

通过生成的apk反编译出如下代码2-1)

[java] view plaincopy

  1. public class MainActivity extends Activity
  2. {
  3. protected void onCreate(Bundle paramBundle)
  4. {
  5. super.onCreate(paramBundle);
  6. setContentView(2130903040);
  7. //如下是test()函数的代码
  8. StringBuilder localStringBuilder = new StringBuilder("log ");
  9. Toast.makeText(this, "test", 0).show();
  10. localStringBuilder.append("jjyy").toString();
  11. }
  12. }

运行LogCat中没有输出日志。但是弹出toast。

很明显Log.e();被优化掉了,但是test()方法依然被保留了,

源码3):

Log.e("jiese1990", test() );test()函数会被一起优化掉吗?

[java] view plaincopy

  1. public class MainActivity extends Activity {
  2. int i = 0;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. Log.e("MainActivity", "log" + test() );
  8. Toast.makeText(this, "i = " + i, Toast.LENGTH_SHORT).show();    //i == 1;
  9. }
  10. private String test(){
  11. i++;
  12. return "test" + i;
  13. }
  14. }

通过生成的apk反编译出如下代码3-1)

[java] view plaincopy

  1. public class MainActivity extends Activity
  2. {
  3. private int a = 0;    //proguard将代码混淆后变量i变为了a
  4. protected void onCreate(Bundle paramBundle)
  5. {
  6. super.onCreate(paramBundle);
  7. setContentView(2130903040);
  8. //Log.e()代码被删除了,但是调用test()函数里的i++被直接优化到这里
  9. StringBuilder localStringBuilder = new StringBuilder("log");
  10. this.a = (1 + this.a);
  11. localStringBuilder.append("test" + this.a).toString();
  12. Toast.makeText(this, "i = " + this.a, 0).show();
  13. }
  14. }

运行LogCat中没有输出日志。但是弹出toast 显示字符串 : "i = 1"

很明显Log.e();被优化掉了,但是test()方法依然被保留了,

时间: 2024-10-13 19:24:40

android关闭日志的相关文章

关闭日志

// 关闭日志 java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

Android技术9:Android NDK日志调试

在Android中我们经常使用Log来调试程序,NDK中也为我们提供输出日志的方法. 1.引入头文件<android/log.h> #include<android/log.h> 2.定义宏 #define LOG_TAG "System.out.c"#define LOGD(...) _android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,_VA_ARGS_)#define LOGI(...) _android_log_pri

ZENCART 打开/关闭日志文件

优秀的php开源程序很多都只带生成日志文件的功能,这类功能的开发可以帮助到站长在调试网站的时候及时的改正网站存在的错误,但是这类错误日志由来并非网站出现什么严重不可挽救的错误,大部分是一些未定义变量这样的不起眼的小错误.一般使用php虚拟主机的用户要谨慎这类功能,很有可以能是你的疏忽导致生成大量的日志文件,导致磁盘无法写入.导致虚拟主机被关闭.如Thinkphp.ZenCart.等等,都存在这类问题.希望站长重视这类问题不要因为磁盘满了,导致虚拟主机被关闭,影响网站排名.本次无忧主机小编将给各位

android 关闭应用

我之前一直采用的是System.exit(0); 今天看到有人说这个方法不太好,这是J2SE里的方法,他主要是通过终止正在运行的JAVA虚拟机,导致程序终止. 推荐以下方法: 1.杀死本进程: android.os.Process.killProcess(android.os.Process.myPid()); 2.强制关闭与该包有关的一切活动(杀死其他进程): ActivityManager manager = (ActivityManager)getSystemService(Context

Android开发日志统一管理

在开发中,我们通常要对日志的输出做统一管理,下面就为大家推荐一个日志输出类,在开发阶段只需将DEBUG常量设为true,生产环境将DEBUG设为false即可控制日志的输出.啥都不说了,需要的朋友直接带走. package com.android.util; /** * 日志输出统一管理 * * @author 祁连山 * @date 2015-04-27 * @version 1.0 * */ public class Log { private static final String TAG

路由交换-关闭动态的域名解析、关闭控制台的会话超时、关闭日志同步

Router>enable Router#config t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#no ip domain lookup //关闭动态的域名解析 Router(config)#line Console 0 Router(config-line)#exec-timeout 0 0 //关闭控制台的会话超时,以保证不会被踢出去 Router(config-line)#lo

esp32 关闭日志

esp32上电以及系统运行中会从串口0打印很多日志,对于没有必要查看日志的场合,打印日志的动作显得多余并且还会占用资源,下文给出关闭日志打印的方法. 1.进入工程目录 2.make menuconfig 3.关闭Bootloader 日志: Bootloader config --> Bootloader log verbosity 选定为 No output 4.关闭程序日志:Component config -> Log output -> Default log verbosity

android log4j日志管理的使用

android中的log4j日志文件使用需要两个包,我们不需要进行配置文件的配置,一切都在代码中完成. log4j 包下载: 下载地址:http://logging.apache.org/log4j/1.2/download.html android-logging-log4j-1.0.3.jar 下载: https://code.google.com/archive/p/android-logging-log4j/downloads 全部下载完成后 eclipse中智捷导入包到libs添加饮用

Android Log日志文件的分析、查看

Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处理log文件 什么时候会产生log文件呢 ?一般在如下几种情况会产生log文件 . 1,程序异常退出 , uncaused exception2,程序强制关闭 ,Force Closed (简称FC)3,程序无响应 , Application No Response (简称ANR) , 一般主线程超过5秒么有处理就会ANR4,手动生成 . 我们用