Eclipse 打包过滤 Log.e
我们在开发时,经常会输出各种日志来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()方法依然被保留了,
Eclipse 打包过滤 Log.e的更多相关文章
- eclipse打包apk
eclipse打包apk
- tar打包过滤某个文件及文件夹
ip=ip add|grep eth0|grep -i inet|awk '{print $2}'|cut -d '/' -f 1 cd /data tar -zvcf `echo $ip`_`dat ...
- Eclipse打包出错——提示GC overhead limit exceeded
版权声明:本文为博主原创文章,未经博主允许不得转载. 在Eclipse开发环境中打包发布apk安装包的时候,有时候会出现下面的错误: 原因 在打包的时候,Eclipse占用的内存会增大,当分配给Ecl ...
- Eclipse打包Egret App (Egret4.1.0)
Egret官方提供eclipse和androidstudio打包. 这里使用eclipse. 1 下载配置android环境 2 Egret打包App 3 Eclipse设置 4 Eclipse调试 ...
- eclipse启动报错:An error has occurred.See the log file D:\eclipse\configuration\1552616709202.log
如题,Eclipse崩了,只能按它留下的线索去看了1552616709202.log: !SESSION -- ::08.739 ----------------------------------- ...
- Eclipse打包java工程
Eclipse打包java工程步骤如下: 1.选择预打包的工程->Export. 2.选择java->JAR file. 3.导出JAR文件设置. 这里有几个选项: Export gene ...
- eclipse打包插件net.sf.fjep.fatjar
eclipse打包插件安装 1)将net.sf.fjep.fatjar_0.0.32.jar拷贝到eclipse安装目录中的plugins目录下,然后重启eclipse即可. 软件获取方式: 链接:h ...
- vue webpack build 打包过滤console.log()日志
vue cli创建项目在 webpack.prod.conf.js文件 //打包时清除页面中所有打印及debugger断点 new webpack.optimize.UglifyJsPlugin({ ...
- webpack打包过滤console.log
在webpack.prod.conf.js里面的plugins里面加上 drop_debugger: true, drop_console: true new webpack.optimize.Ugl ...
随机推荐
- javascript之函数节流
对于高频率的事件触发,为了优化页面性能,我们一般会对其做函数节流.比如: resize.keydow.scroll事件等.用户的频繁操作,会导致事件高频率的执行,这样会出现页面抖动啊.频繁调接口啊等问 ...
- UVA 10410 Tree Reconstruction
题意: 给定一个树的BFS和DFS,求这棵树. 分析: 拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可. ...
- Oauth2认证以及新浪微博开放平台应用
一.OAuth2.0概述 大部分API的访问如发表微博.获取私信,关注都需要用户身份,目前新浪微博开放平台用户身份鉴权有OAuth2.0和Basic Auth(仅用于应用所属开发者调试接口),新版接口 ...
- c# 委托内部构造
以下纯属个人简介,错误之处,请随意指出. 委托是指向方法的,而事件是委托的触发器,执行事件,就会遍历委托里的方法,并且执行. 委托内部构造第一块是方法指针(methodPtr),用于指向方法的内存地址 ...
- 1.offsetParent,offsetLeft,offsetTop
offsetParent <!doctype html> <html> <head> <meta charset="utf-8"> ...
- 正则语言(转的 大额_skylar )
备注:正则表达式真的很头疼,收集起来,用起来很方便的. 常用的元字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或 ...
- Oracle日志性能查看
http://blog.chinaunix.net/uid-20784775-id-373968.html http://www.orafaq.com/wiki/Scripts https://com ...
- 关于TCP封包、粘包、半包
关于Tcp封包 很多朋友已经对此作了不少研究,也花费不少心血编写了实现代码和blog文档.当然也充斥着一些各式的评论,自己看了一下,总结一些心得. 首先我们学习一下这些朋友的心得,他们是: http: ...
- web本地存储-IndexedDB
IndexedDB, HTML5中的一种数据存储方式,索引数据库. 一个网站可能有一个或多个 IndexedDB 数据库,每个数据库必须具有惟一的名称.一个数据库可包含多个对象存储,一个对象存储相当于 ...
- POJ 3662 Telephone Lines(二分答案+SPFA)
[题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...