android apk音频瘦身,android之as自动化删除无用资源为apk瘦身

随着项目越来越大,一些无用的资源越来越多,有必要为apk瘦身了,网上一顿乱拔,有欢喜也有泪水,唉,要么是搭建python环境太复杂,要么是没有适用于android studio项目的自动化删除无用资源的。。。头痛的要死,手动一个个删除吧又不符合一个程序员懒惰的高雅气质,于是乎结合现有的,自己写一个自动删除的java demo,有不对的地方忘大家不吝赐教。。。使用也比较简单。。。。

注:一定要是java项目,因为android是无法删除pc硬盘中的项目的

大致步骤呢和网上的一样,都是通过gradle lint工具去check无用资源

1、这里不多说废话,假设已经获取到了

lint-result.xml

这里给一个博客地址:按照这个博客说的步骤就可以获取到lint-results.xml

http://blog..net/imesong/article/details/49187695

注:Android Studio 终端指的是as项目下的terminal

4668573f89f2c11e380f73f5371ed9b0.png

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 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布局)

*

* false 显示资源列表

*

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

}

}

/**

* 例子:

*

* 小明

* 男

* 18

* xiaoming@163.com

* 1987-06-08

* 好学生

*

*

* switch (eventType) {

* //文档开始

* case XmlPullParser.START_DOCUMENT:

* list=new ArrayList();

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

*

* }

* break;

* //结束节点

* case XmlPullParser.END_TAG:

* if("student".equals(nodeName)){

* list.add(student);

* student=null;

* }

* break;

* default:

* break;

* }

* eventType=xmlPullParser.next();

* }

*

*

* pull解析lint的xml--获取要删除资源的路径 如:d:/results.xml

*

*

* @return

* @author zhongwr

*/

public List parseUnusedResXml() {

List pathLists = new ArrayList();

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

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 getFilePathList() {

String projectPath = "D:\\soft\\studio_project\\pp";

List filePathList = new ArrayList();

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..net/detail/zhongwn/9648920

xpullJar: http://download..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..com/yxy8023ustc/p/4050243.html

用android tools自带的lint扫描,但是会报错说是as只能用gradle lint扫描不能使用sdk自带的lint---

3)、使用lint扫描后,用第三方自动化工具

或者使用自动构建工具删除---风险很大,删除到jar里边的可能就有问题

http://blog..net/imesong/article/details/49187695

http://blog..net/caoxiao90/article/details/51057986

4)、as或者eclipse 可以使用自动化扫描代码,作者开发的工具下载(arc.jar),双击打开,选择自己的工程下对应要扫描的目录,可以一次性将无用代码和无用资源一起扫描,也可以分开扫描

http://blog..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..net/mlj1668956679/article/details/38643145

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值