在android开发中常常会遇到须要反编译竞品的需求,题主也就针对反编译apk后替换sdk后从新打包的场景进行试验,下面一步一步来讲明Android如何反编译后从新打包。java
咱们知道android项目编译成应用程序后的安装文件是.apk文件,运行期间classloader加载的是dex文件中的class。因此咱们先来看看一个典型的apk包中具备哪些基本内容: android
1.打开apktool官网 git
先下载脚本文件 : mac os 对应 apktool.sh windows 对应 apktool.batgithub
再下载最新的apktool.jar windows
windows:把下载的两个文件都copy到c:/windows目录,或者放到本身指定的目录下再修改系统path也行 Mac os: 把下载的两个文件都copy到/usr/local/bin目录下,修改权限为可执行chmod a+x安全
在命令行终端模式下,输入apktool验证是否完成apktool环境配置 工具
1.命令行进入到apk包所在的文件夹路径 ui
apktool d filename
查看manifest.xml文件,icon对应的就是配置应用logo 命令行
1.回编译apkapktool b files
files就是对应刚刚修改的apk文件夹,执行完后会从新生成一个apk文件3d
注意:编译后的apk是安装不成功的,老是提示
Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]
,实质是没签名。
2.生成签名: keytool -genkey -keystore coolapk.keystore -keyalg RSA -validity 10000 -alias coolapk
注意:上面-keystore后面跟的是签名文件的名字,而-alias是别名,通常状况下-keystore后面跟-alias是同样的,但其实二者没有关系,这也是我故意搞成不同的缘由。
3.为apk增长签名: jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore coolapk.keystore -signedjar coolapk-signed.apk coolapk.apk coolapk
注意: 1.最后的”coolapk”就是-alias后面带的,必须保持一致 2.若是不带-digestalg SHA1 -sigalg MD5withRSA签名后的apk安装也会不成功,INSTALL_PARSE_FAILED_NO_CERTIFICATES的错误,若是不带-tsa会报一个时间方面的警告.
dex2jar: https://github.com/pxb1988/dex2jar jd-gui: http://jd.benow.ca/
直接覆盖原来的dex文件
看看apk文件中有什么可疑对象致使了安装失败,果真除了dex和资源文件之外,还发现了三个文件
打开文件来一探究竟,果真里面都是对打包时对文件进行了标识记录,看来这是避免文件被篡改的安全机制。
想一想既然是这些文件致使的,那先试试简单粗暴地直接把文件删了,避免防篡改检查
然而,这样的是不行的,必需要有这个文件夹才能解析apk包,可能这些至关因而读取安装文件列表清单,必须具备,看来此路不通,
既然原来的清单内容对不上,但又不能不提供,那能不能咱们给它配一个新的? 想到这里,感受能够动手试试,嘿咻嘿咻~
这些文件既然是在编译打包成apk时期自动生成的,那要想再生成一份新的,因此应该从新打包就能够。但是这个自己已经就是apk文件了,怎么再编译打包? 停下来想了想,对啊,忽然想起来能够给包签个名呗,打签名应该也会有一样的效果才对,继续嘿咻嘿咻。
找个工具来签名吧,用本身的去签名留下点什么不良记录就很差了,嘿嘿~