android之as自动化删除无用资源为apk瘦身
2016-10-09 20:29
323 查看
随着项目越来越大,一些无用的资源越来越多,有必要为apk瘦身了,网上一顿乱拔,有欢喜也有泪水,唉,要么是搭建python环境太复杂,要么是没有适用于android studio项目的自动化删除无用资源的。。。头痛的要死,手动一个个删除吧又不符合一个程序员懒惰的高雅气质,于是乎结合现有的,自己写一个自动删除的java demo,有不对的地方忘大家不吝赐教。。。使用也比较简单。。。。
注:一定要是java项目,因为android是无法删除pc硬盘中的项目的
大致步骤呢和网上的一样,都是通过gradle lint工具去check无用资源
1、这里不多说废话,假设已经获取到了
这里给一个博客地址:按照这个博客说的步骤就可以获取到lint-results.xml
http://blog.csdn.net/imesong/article/details/49187695
注:Android Studio 终端指的是as项目下的terminal
![](http://img.blog.csdn.net/20161009201256525?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2、直接上代码,不解释,有注释了,也比较简单,拿过来就用。。。
这里要注意的是,我已经将lint-results.xml更改为results.xml,也可以不改。。再者是将results.xml放到d盘,你随意,放在自己喜欢的目录下就行,只是要相应的修改一下;其次再删除之前我将文件备份在其它目录下,你也可以不备份,随你开心就好;还有这个是java项目不是android,所以要用eclipse打开后直接运行就可以了
demo:http://download.csdn.net/detail/zhongwn/9648920
xpullJar: http://download.csdn.net/detail/zhongwn/9656052
希望能帮到你
网上遇到的问题有一些小结也贴出来如下:
1、删除无用的(导入类)import。。。
http://jingyan.baidu.com/article/48b37f8d0580801a646488fd.html
2、
1)、方法一:使用手动删除
使用lint工具扫描
http://www.waychel.com/shi-yong-android-studiode-lintqing-chu-wu-yong-de-zi-yuan-wen-jian/
2)、方法二:使用自动化扫描,自动化删除,自行过滤
自动化删除无用资源 配置lint环境量,在cmd控制台下执行,执行完后,在执行脚本就行了
http://www.cnblogs.com/yxy8023ustc/p/4050243.html
用android tools自带的lint扫描,但是会报错说是as只能用gradle lint扫描不能使用sdk自带的lint---
3)、使用lint扫描后,用第三方自动化工具
或者使用自动构建工具删除---风险很大,删除到jar里边的可能就有问题
http://blog.csdn.net/imesong/article/details/49187695 http://blog.csdn.net/caoxiao90/article/details/51057986
4)、as或者eclipse 可以使用自动化扫描代码,作者开发的工具下载(arc.jar),双击打开,选择自己的工程下对应要扫描的目录,可以一次性将无用代码和无用资源一起扫描,也可以分开扫描
http://blog.csdn.net/androidzhaoxiaogang/article/details/7930304 ---这个我试了一下,用不起来,放弃,也没有找到as的Ucdetector的插件
总结:
所以方法2和4都是行不通的
一定要注意,删除的时候要确保删除的是无用的,毕竟项目以稳定为主要目的
方法2使用于eclipse开发的android项目,as无法使用
使用方法三:
1、需要安装python 2.7+的环境 ,配置好环境变量,安装Pip:安装pip需将get-pip.py文件下载,放到一个指定目录比如 d:\soft\get-pip.py;直接cmd到控制台执行 python get-pip.py就安装好了;将python下的script文件夹添加到系统环境变量path里
2、安装android-resource-remover;直接cmd之后,执行命令pip install android-resource-remover;之后从github下载android-resource-remover解压执行demo
根据提示会让给你安装一系列的安装包 pip install android-resource-remover pip install pyopenssl ndg-httpsclient pyasn1 以及 libxml2 and libxslt 都要安装,看着都烦。。。我就想用用这个工具而已,特么让我搭一个爬虫环境,一个挨着一个安装包。。。哭的没眼泪啊
Task 'android-resource-remover' not found in root project
参考:http://blog.csdn.net/mlj1668956679/article/details/38643145
注:一定要是java项目,因为android是无法删除pc硬盘中的项目的
大致步骤呢和网上的一样,都是通过gradle lint工具去check无用资源
1、这里不多说废话,假设已经获取到了
lint-result.xml
这里给一个博客地址:按照这个博客说的步骤就可以获取到lint-results.xml
http://blog.csdn.net/imesong/article/details/49187695
注:Android Studio 终端指的是as项目下的terminal
2、直接上代码,不解释,有注释了,也比较简单,拿过来就用。。。
package www.unused.res; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream.GetField; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; public class DeleteMain { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { DeleteMain main = new DeleteMain(); final List<String> pathList = main.parseUnusedResXml();//getFilePathList(); int size = pathList.size(); String filePath = null; // 测试使用 // main.copyFile("D:\\soft\\studio_project\\PregnancyPartner\\app\\src\\main\\res\\drawable-hdpi\\soundwave4.png", // "D:\\dele_res\\soundwave4.png"); for (int i = 0; i < size; i++) { filePath = pathList.get(i); try { main.copyFile(filePath, "D:/dele_res/" + filePath.substring(filePath.lastIndexOf("\\")+1, filePath.length())); } catch (Exception e) { e.printStackTrace(); } finally { main.deletFile(filePath); } } } }).start(); } /** * 删除 未使用的冗余资源(图片 xml布局) * <p> * false 显示资源列表 * <p> * true 显示资源列表 并删除资源 * * @throws Exception */ private void deletFile(String filePath) { File file = new File(filePath); System.out.println("file.isFile() = " + file.isFile()); if (file.isFile() && file.exists()) { // 判断文件是否存在 try { file.delete(); System.out.println("删除成功"); } catch (Exception e) { } } } /** * 复制单个文件:将删除的文件备份 * * @param oldPath * String 原文件路径 如:c:/fqf.txt * @param newPath * String 复制后路径 如:f:/fqf.txt * @return boolean * @author zhongwr */ public void copyFile(String oldPath, String newPath) { try { System.out.println("oldPath = " + oldPath + " \\n newPath = " + newPath); int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath); if (oldfile.exists()) { // 文件存在时 InputStream inStream = new FileInputStream(oldPath); // 读入原文件 FileOutputStream fs = new FileOutputStream(newPath); System.out.println("file size = " + inStream.available()); byte[] buffer = new byte[inStream.available()]; while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; // 字节数 文件大小 System.out.println("bytesum = " + bytesum); fs.write(buffer, 0, byteread); } inStream.close(); } } catch (Exception e) { System.out.println("复制单个文件操作出错"); e.printStackTrace(); } } /** * 例子: * <student id="5" group="5"> * <name>小明</name> * <sex>男</sex> * <age>18</age> * <email>xiaoming@163.com</email> * <birthday>1987-06-08</birthday> * <memo>好学生</memo> * </student> * <p> * switch (eventType) { * //文档开始 * case XmlPullParser.START_DOCUMENT: * list=new ArrayList<Student>(); * break; * //开始节点 * case XmlPullParser.START_TAG: * //判断如果其实节点为student * if("student".equals(nodeName)){ * //实例化student对象 * student=new Student(); * //设置Id属性 * student.setId(Integer.parseInt(xmlPullParser.getAttributeValue(0))); * //设置Group属性 * student.setGroup(Integer.parseInt(xmlPullParser.getAttributeValue(1))); * }else if("name".equals(nodeName)){ * //设置name * student.setName(xmlPullParser.nextText()); * <p> * } * break; * //结束节点 * case XmlPullParser.END_TAG: * if("student".equals(nodeName)){ * list.add(student); * student=null; * } * break; * default: * break; * } * eventType=xmlPullParser.next(); * } * <p> * <p> * pull解析lint的xml--获取要删除资源的路径 如:d:/results.xml * * * @return * @author zhongwr */ public List<String> parseUnusedResXml() { List<String> pathLists = new ArrayList<String>(); FileInputStream fis = null; InputStream is = null; try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); // 获取XmlPullParser实例 XmlPullParser pullParser = factory.newPullParser(); File resFile = new File("d:/results.xml"); if (!resFile.isFile()) { System.out.println("file is not exist"); return pathLists; } fis = new FileInputStream(new File("d:/results.xml")); is = new BufferedInputStream(fis); pullParser.setInput(is, "UTF-8"); // 开始 int eventType = pullParser.getEventType(); boolean isUnusedPath = false; while (eventType != XmlPullParser.END_DOCUMENT) {// 文档没读取完 String nodeName = pullParser.getName(); switch (eventType) { // 文档开始 case XmlPullParser.START_DOCUMENT: pathLists = new ArrayList<String>(); break; // 开始节点 case XmlPullParser.START_TAG: // System.out.println( "START_TAG Node = " + nodeName); // 过滤要删除的未使用的资源 if ("issue".equals(nodeName) && "UnusedResources".equals(pullParser.getAttributeValue(0))) { isUnusedPath = true; System.out.println("UnusedResources Node = " + nodeName); } else if ("location".equals(nodeName) && isUnusedPath) { System.out.println("location Node = " + nodeName); String path = pullParser.getAttributeValue(0); System.out.println("path = " + path); // 删除指定目录下的资源,防止删除lib下的资源 以及 过滤掉不需要删除的目录 if (path.startsWith("D:\\soft\\studio_project\\pp\\app\\src\\main\\res") && !path.contains("res\\values")) { pathLists.add(path); } } break; // 结束节点 case XmlPullParser.END_TAG: if ("issue".equals(nodeName)) { isUnusedPath = false; } // System.out.println( "END_TAG Node = " + nodeName); break; default: break; } // 手动的触发下一个事件 eventType = pullParser.next(); } } catch (Exception e) { e.printStackTrace(); }finally { try { if(is!=null){ is.close(); } if(fis!=null){ fis.close(); } } catch (IOException e) { e.printStackTrace(); } } System.out.println("pathLists = " + pathLists.size()); return pathLists; } /** * 获取删除的文件绝对路径集合 zhongwr 下午7:18:34 void */ private List<String> getFilePathList() { String projectPath = "D:\\soft\\studio_project\\pp"; List<String> filePathList = new ArrayList<String>(); try { BufferedReader reader = new BufferedReader(new FileReader("D:\\soft\\studio_project\\pp\\result.txt")); String line; int count = 0; // double totalSize = 0; while ((line = reader.readLine()) != null) { if (line.startsWith("app") && line.contains("UnusedResources") && !line.contains("res/value") && !line.contains("appcompat") && !line.contains("umeng")) { count++; int end = line.indexOf(":"); if (end != -1) { String fileName = line.substring(0, end); String filePath = projectPath + fileName; System.out.println(filePath); filePathList.add(filePath); } } } System.out.println("filePathList = " + filePathList.size()); System.out.println("count = " + String.valueOf(count)); // System.out.println(String.valueOf(totalSize / 1024)); } catch (Exception e) { e.printStackTrace(); } return filePathList; } }
这里要注意的是,我已经将lint-results.xml更改为results.xml,也可以不改。。再者是将results.xml放到d盘,你随意,放在自己喜欢的目录下就行,只是要相应的修改一下;其次再删除之前我将文件备份在其它目录下,你也可以不备份,随你开心就好;还有这个是java项目不是android,所以要用eclipse打开后直接运行就可以了
demo:http://download.csdn.net/detail/zhongwn/9648920
xpullJar: http://download.csdn.net/detail/zhongwn/9656052
希望能帮到你
网上遇到的问题有一些小结也贴出来如下:
1、删除无用的(导入类)import。。。
http://jingyan.baidu.com/article/48b37f8d0580801a646488fd.html
2、
1)、方法一:使用手动删除
使用lint工具扫描
http://www.waychel.com/shi-yong-android-studiode-lintqing-chu-wu-yong-de-zi-yuan-wen-jian/
2)、方法二:使用自动化扫描,自动化删除,自行过滤
自动化删除无用资源 配置lint环境量,在cmd控制台下执行,执行完后,在执行脚本就行了
http://www.cnblogs.com/yxy8023ustc/p/4050243.html
用android tools自带的lint扫描,但是会报错说是as只能用gradle lint扫描不能使用sdk自带的lint---
3)、使用lint扫描后,用第三方自动化工具
或者使用自动构建工具删除---风险很大,删除到jar里边的可能就有问题
http://blog.csdn.net/imesong/article/details/49187695 http://blog.csdn.net/caoxiao90/article/details/51057986
4)、as或者eclipse 可以使用自动化扫描代码,作者开发的工具下载(arc.jar),双击打开,选择自己的工程下对应要扫描的目录,可以一次性将无用代码和无用资源一起扫描,也可以分开扫描
http://blog.csdn.net/androidzhaoxiaogang/article/details/7930304 ---这个我试了一下,用不起来,放弃,也没有找到as的Ucdetector的插件
总结:
所以方法2和4都是行不通的
一定要注意,删除的时候要确保删除的是无用的,毕竟项目以稳定为主要目的
方法2使用于eclipse开发的android项目,as无法使用
使用方法三:
1、需要安装python 2.7+的环境 ,配置好环境变量,安装Pip:安装pip需将get-pip.py文件下载,放到一个指定目录比如 d:\soft\get-pip.py;直接cmd到控制台执行 python get-pip.py就安装好了;将python下的script文件夹添加到系统环境变量path里
2、安装android-resource-remover;直接cmd之后,执行命令pip install android-resource-remover;之后从github下载android-resource-remover解压执行demo
根据提示会让给你安装一系列的安装包 pip install android-resource-remover pip install pyopenssl ndg-httpsclient pyasn1 以及 libxml2 and libxslt 都要安装,看着都烦。。。我就想用用这个工具而已,特么让我搭一个爬虫环境,一个挨着一个安装包。。。哭的没眼泪啊
Task 'android-resource-remover' not found in root project
参考:http://blog.csdn.net/mlj1668956679/article/details/38643145
相关文章推荐
- -------------------------------android高手之路--删除工程里面无用的代码和资源
- Android lint删除无用资源文件
- APK瘦身之删除多余资源文件
- 【android】使用android-resource-remover删除项目中无用的资源,减少包的大小
- APK瘦身之删除多余资源文件
- android lint检查无用资源文件删除
- 一键删除android下面无用资源
- 利用Android studio 删除项目中无用资源文件
- 自动化清理Android中无用的资源文件。
- android高手之路--删除工程里面无用的代码和资源
- Android lint 自动检测并删除无用资源
- android 自动删除无用资源插件
- 为APP瘦身--删除无用资源文件
- android studio 删除无用资源,缩小apk体积
- 多方法批量删除Android中无用的资源(更新Android Studio2.1工具)
- android eclipse lint删除无用资源文件
- iOS ipa包瘦身---删除无用图片资源
- 多方法批量删除Android中无用的资源(更新Android Studio2.1工具)
- 使用android-resource-remover删除项目中无用的资源,减少包的大小
- android高手之路--删除工程里面无用的代码和资源