Eclipse 打包过滤 Log.e

简介: 我们在开发时,经常会输出各种日志来debug代码。但是等到应用发布的apk运行时不希望它输出日志。 关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(),Log.e()等 原理: 那么我们可以通过proguard来删除各种日志输出代码。

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

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

原理:

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

通过配置proguard,将类android.util.Log的方法给置为为无效代码。(proguard是一个代码优化的工具,也可以混淆代码)

 

assumenosideeffects

assumenosideeffects,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)打开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 ;

}

-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的日志。

\




测试

源码1)

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


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

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


运行LogCat中没有输出日志。

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


源码2)

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


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

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



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

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

 

源码3):

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

 

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

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

 

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

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

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
webpack 打包去掉控制台的console.log()
webpack 打包去掉控制台的console.log()
776 0
webpack 打包去掉控制台的console.log()
|
17天前
|
Android开发
双击eclipse提示an error has occurred See the log file E:\javatool\eclipse-mars-2\configuration\156991769
双击eclipse提示an error has occurred See the log file E:\javatool\eclipse-mars-2\configuration\156991769
21 1
|
6月前
|
Unix Linux Shell
Linux 下使用crontab 定时打包日志并删除已被打包的日志
f=`ls /home/hls/apache-tomcat-7.0.61/logs -1 -c` #获取logs下文件列表( /home/hls/apache-tomcat-7.0.61/logs 是日志的所在的路径)
42 0
|
9月前
|
JavaScript
Vue Cli 3 打包配置--自动忽略 console.log 语句
Vue Cli 3 打包配置--自动忽略 console.log 语句
104 0
在vuecli3怎么压缩代码以及打包怎么去除console.log?
在vuecli3怎么压缩代码以及打包怎么去除console.log?
94 0
|
IDE Java 开发工具
解决办法:eclipse查看安卓8.0及以上设备的LOG
解决办法:eclipse查看安卓8.0及以上设备的LOG
78 0
|
分布式计算 监控 Java
about云日志分析实战之清洗日志小实例2:导入日志清洗代码并打包
about云日志分析实战之清洗日志小实例2:导入日志清洗代码并打包
93 0
about云日志分析实战之清洗日志小实例2:导入日志清洗代码并打包
|
Java Android开发
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
618 0
Eclipse打不开,出现an error has occured see the log file(日志中出现!MESSAGE FrameworkEvent ERROR !STACK 0)问题
|
数据采集 分布式计算 监控
网站流量日志分析--工作流调度--预处理调度--程序打包 job 编写 | 学习笔记
快速学习网站流量日志分析--工作流调度--预处理调度--程序打包 job 编写
82 0
网站流量日志分析--工作流调度--预处理调度--程序打包 job 编写 | 学习笔记
|
Java Android开发
Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

推荐镜像

更多