最近公司要作这个,简单调研了一下,现有的大多数博客也比较旧了,不太合适,总结了这么几个方式吧,一块儿来学习下。html
是这样的,今天收到的邮件里,有这么一条任务:java
资源优化python
软件中无用的图片和布局文件,找到并验证是否无用.
这个须要设计一套工具进行分析(自行设计最好或者第三方)复制代码
嗯,好吧...说笑了! 下面是正题↓↓↓↓android
其实随着项目不断更新,需求不断变更,一改再改,UI一调再调,结果就是项目中一堆已经用不到但却没有清理的垃圾资源,不说工程大小问题,对新进入项目的人或看其余模块的代码的人来讲,这些没清理的资源可能也可能会带来困扰,因此最好仍是清理掉这些垃圾,对于一个稍微大一点的工程来讲,手工清理明显是不现实的,这就须要一个方法作这些事情。正则表达式
看了好久,总结了一下,我能找到的市面上大概有8种方法来作这件事,以为里面比较好用的整理一下分为5点,时间缘由确定不能全试啦,由于选出最合适的方法就要开始写成公司本身专门的工具了,简单说一下:shell
Android lint 删除无用图片文件和配置文件android-studio
/** * 删除 未使用的冗余资源(图片 xml布局) * * @param b * * false 显示资源列表 * * true 显示资源列表 并删除资源 * * @throws Exception */
private static void init(boolean b) throws Exception {
String encoding = "UTF-8"; // 字符格式
String projectPath = "/Users/baozi/Dev/shihui/android/";//Android工程所在地址
String filePath1 = "/Users/baozi";//result的所在路径
File file = new File(filePath1, "result.txt");//获取result.txt 文件 生成地址
if (file.isFile() && file.exists()) { // 判断文件是否存在
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
if (line.contains("UnusedResources") && !line.contains("res/value") && !line.contains("appcompat")
&& !line.contains("res/xml")) {
// System.out.println(line);
int end = line.indexOf(":");
if (end != -1) {
String file_end = line.substring(0, end);
String f = projectPath + file_end;
System.out.println(f);
if (b) {
new File(f).delete();
System.out.println("删除成功");
}
}
}
}
read.close();
}
}复制代码
- projectPath : Android工程在硬盘中的位置
- filePath1 : lint 运行结果 result.txt 所在的位置
方法 参数 传入false 仅打印结果 传入true 打印结果 并删除文件性能优化
填入正确的地址 就能批量执行删除未使用的 布局 & 图片 资源 (UnusedResources) app
若是想要删除其它操做 请修改 筛选条件
if (line.contains("UnusedResources") && !line.contains("res/value") && !line.contains("appcompat") && !line.contains("res/xml")
svn使用心得: 循环使用3-6次 能完成 删除所有未使用的资源 可是有些废弃的模块 存在代码以来关系 须要手工判断删除 缺点:判断不许确
优势:把上个方法中找出的无用资源的信息,再删除,整个步骤封装成了一个程序,而且对原GITHUB项目进行了优化:对用到的如string、style等资源进行了处理。 步骤代码较长,就不贴了,详细看原文。
利用Gradle来优雅的去除没有用到的资源文件:
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
}
}
}复制代码
缺点:不少没有用到的类仍是会被打包进去。去除无效代码的功能要依赖于混淆,混淆又是一个耗时的操做,仍是没有完全解决打包慢的问题。
固然也能够作一些忽略无用的代码优化,因此感受还不错。
该文是博主直接在公司使用的方法,以下:
#################################################
#环境: win + python 2.7
#做者:马波
#邮箱:mabo02@baidu.com
#部门:hao123-无线
#说明:首次使用时lint分析会耗几分钟,请耐心等待。
# 使用前先clean工程,确保工程bin下从新生成dex,
# 以便lint进行分析。若是要lint从新分析多余
# 资源,须要删掉(2)txt记录文件,(1)(3)(4)须要
# 根据咱们的实际工程手动设置。
# 若是清除资源后,工程缺乏文件而报错(极少
# 状况),尝试经过svn恢复该文件便可。
#################################################
import subprocess
import re
import os
import time
import thread
#(1)工程位置
projectPath="D:\/hao123\/code\/client-android"
#(2)lint输出txt记录文件
txt="D:\/hao123_unused_res.txt"
#(3)正则表达式,清除drawable和layout下多余的jpg/png/xml,
# 而且排除以sailor_|wenku_|zeus_|bdsocialshare_|floating_life_|weather_info_icon_|anthology_开头的文件
regex = re.compile(r"^res\\(drawable(-land)?(-[xn]?[mhlo](dpi))|layout)?\\(?!(sailor_|wenku_|zeus_|bdsocialshare_|floating_life_|weather_info_icon_|anthology_))[0-9a-zA-Z_\.]*\.(jpg|png|xml)", re.IGNORECASE)
#(4)lint.bat的位置
lint="D:\/sdk\/tools\/lint.bat"
isgotTxt=False
def timer(interval):
while not isgotTxt:
print 'Lint is analyzing: %s'%time.ctime()
time.sleep(interval)
if not os.path.exists(txt):
thread.start_new_thread(timer, (5,))
cmd=lint+' --check "UnusedResources" "'+ projectPath +'" >'+txt
p = subprocess.Popen(cmd, shell = True,stdout = subprocess.PIPE,stdin = subprocess.PIPE,stderr = subprocess.PIPE)
p.wait()
fobj=open(txt,'r')
isgotTxt=True
i=0
j=0
for line in fobj:
#print str(i)+":"+line
match=regex.match(line)
if match:
i=i+1
filename=projectPath+"\/"+match.group().replace('\\',"\\/")
try:
print filename
os.remove(filename)
j=j+1
print "was deleted!"
except WindowsError:
print "is not exists"
pass
print "Total Unused Resources = "+str(i)
print "Total deleted Resources = "+str(j)复制代码
虽然系统不同,仍是打算写python脚原本试一下。
多方法批量删除Android中无用的资源(更新Android Studio2.1工具) 去除无用资源文件最方便的方法
清除Android工程中没用到的资源 去除无用java代码
(1)被无用资源引用的资源不会被视为无用资源,因此须要重复执行屡次,保证清除干净。
(2)删除资源文件以前要先删除无用java代码,不然容易报错,由于代码中还(可能)存在引用.
(3)必定要提交以后,再作备份在清除资源,你懂~
1. 清除Java代码
2. 找出无用资源
3. 按需清理
具体以下:
清除Java代码
String reportPath = "**/ucdetector_reports/UCDetectorReport_001.txt";
BufferedReader reader = new BufferedReader(new FileReader(reportPath));
String line;
int count = 0;
while((line = reader.readLine()) != null) {
if (line.contains("Class") && line.contains("has 0 references") && !line.contains("Method")[ && other conditions]) {
count++;
int end = line.indexOf(".<init>");
if (end != -1){
String className = line.substring(0, end);
System.out.println(className);
}
}
}复制代码
找出无用资源 && 按需清理
在最新的版本(Studio2.1)中,lint已经能够自行删除无用资源,这样的话,咱们的python脚本也不须要写了(2.1如下仍是自行写脚本),具体操做以下:
咱们选择Remove All Unused Resources。片刻后(工程大可能会比较久,1-2min?)弹出一个确认对话框,确认之 。
上述提到的LINT:
静态代码分析工具,无需运行,无需测试用例
扫描整个项目,分析如下潜在的问题,分类指出问题描述、问题位置,并提供合理的修改建议(这是才是关键啊,无论有木有大问题,看看这些问题及描述,也能过把瘾啊):
1)性能 布局性能(之前是 layoutopt工具,能够解决无用布局、嵌套太多、布局太多、overdraw) 其余性能(如:draw/layout 时进行对象的声明等)
2)未使用到资源、资源缺乏(不一样资源的适配)
3)有更高性能的资源替换 ---- eg:SparseBooleanArray SparseIntArray
4)国际化问题(硬编码)
5)图标的问题(重复的图标,错误的大小)
6)可用性问题(如不指定的文本字段的输入型)
7)manifest文件的错误 -- 未注册activity service等等
8)内存泄露 --- 如:handle的不当使用 。
9)占内存的资源及时回收 --- 如:TypedArray未回收资源等
附:
Improve Your Code with Lint google文档