一、混淆打包
1. 在工程中配置 proguard.cfg 文件的内容, 比如哪些不混淆,或者保留等;
2. project.properties 中,加上 proguard.config= proguard.cfg
3. 打 release模式 或者 export signed apk ,就会打出混淆后的包
参考网址 :
http://blog.csdn.net/kangbulb/article/details/40625149 :
http://developer.android.com/tools/help/proguard.html#enabling
问题: 混淆打包遇到错误,则根据日志解决,另外,可能proguard版本低了;
注意事项:entity、enum 等,如果需要反射,如使用 alibaba.json、dbutils等,不要混淆这些类。
二、混淆后的 stack trace 日志查看
由于 混淆后的包的日志 中,类名等是a b c…等,所以需要 逆过来查看
工具 : retrace, 工具目录: sdk\tools\proguard\bin
命令: retrace.bat|retrace.sh [-verbose] mapping.txt trace.txt
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt[日志文件]
反过来的 日志就跟未混淆过的日志一样 是“明文”了
ps: 每次打的包的 mapping.txt文件保存着,需要与 日志文件对应起来
没有mapping文件的方法:
1. 解压apk,取出 classes.dex文件;
2. dex2jar工具,将 classes.dex反编译为 jar文件;
3. jd-gui 工具查看jar包,找到对应的类,混淆后的代码类 按 a ~ z 的顺序排序,从代码猜测出是哪个类,从而找到对应的源码
4.
三、反编译
1. 查看资源文件
工具:apktool,
命令:apktool d -f demo.apk
ps: 该命令反编译出的 也有 smali文件, 与 bakSmali工具反编译出来的 貌似一样
- 查看反编译出的工程
工具:dex2jar、jd-gui
(1)解压apk文件[.apk重命名为.zip],取出 classes.dex文件
(2)dex2jar工具,将 classes.dex转换为 classes.jar文件
命令:dex2jar classes.dex
生成classes.jar文件
(3)使用jd-gui,打开classes.jar文件
参考网址:http://blog.csdn.net/vipzjyno1/article/details/21039349
四、smali查看 及 修改
工具:baksmali.jar[将classes.dex 转成整个工程的 smali文件]、smali.jar[将工程的smali文件转为一个 classes.dex文件]
1. 从 .apk文件中取出 classes.dex文件
2. baksmali.jar工具将其转为smali工程文件
命令:java -jar baksmali-2.0.3.jar -o classout/ classes.dex
其中 -o classout/ 表示转换出的smali工程文件 输出到 当前相对的 classout目录中
- 可以随意修改 .smali文件啦
如上面这个文件,将里面的“hello”字符串修改为 “hello after smali”; - 将修改后的 smali工程文件重新转换为 classes.dex文件
此时使用 smarli.jar工具
命令:java -jar smali-2.0.3.jar classout/ -o newclasses.dex
此时,转换出 newclasses.dex文件
工具下载地址:http://download.csdn.net/detail/cxsjabcabc/8131635
五、重新打包、签名
在步骤四的基础上, 重新打包、签名;
1. 将 newclasses.dex 重命名为 classes.dex, 替换掉 apk包中原来的 classes.dex文件;
2. 如果该apk文件已经签过名了,那么 删除apk包中的 “META-INF”目录
3. 使用jdk中的 jarsigner.exe工具进行签名 [估计不重签名也能用吧]
命令:
签名结束后,得到签名后的包了;
注意:
(1) jdk1.7签名后安装时,提示
Failure[INSTALL_PARSE_FAILED_NO_CERTIRICATES]
原因:jdk1.7 与android有不兼容之处;
解决:改用jdk1.6进行签名;
(2)签名时需要 keystore,如果没有,则需要创建一个,参考网址: http://blog.csdn.net/aeolus1019/article/details/8121031