尽量下载最新版本,因为它支持的 Android 版本越高。下载完成后重命名为 apktool.jar
在桌面创建文件夹命名为 apktool,把 apktool.jar 和 apktool 放进去。
1. 打开终端,使用 cd 命令定位到 apktool 文件夹,输入: cd /Users/weixiangyang/Desktop/apktool
2. 增加这两个文件可执行权限,chmod a+x apktool
chmod a+x apktool.jar
3. 使用 cp 命令把 apktool.jar 和 apktool 文件拷贝到/usr/local/bin
sudo cp apktool.jar apktool /usr/local/bin
4. 之后,使用sudo apktool
,可以查看 apktool 的版本
5. 现在可以使用 apktool 相关命令了,和 windows 是一样的。
把 apk 文件放到 apktool 文件夹,然后回到 apktool 文件夹下:
cd /Users/weixiangyang/Desktop/apktool/
对 bm.apk 进行反编译 (改成你自己的包名)
apktool d bm.apk
1. 下载dex2jar,解压
2. 将 dex2jar 文件夹放在 apktool 文件夹下
3. 把 apk 文件解压,可以直接解压或者修改后缀.zip 再解压,找到 classes.dex 文件,
4. 我们要用 dex2jar 将 apk 转成 jar 文件,实质是将 apk 里的 classes.dex 转成 jar。
先给 dex2jar 里的 d2j_invoke.sh/d2j-dex2jar.sh 增加可执行权限。
cd /Users/weixiangyang/Desktop/apktool/dex2jar-2.0/
chmod a+x d2j_invoke.sh
chmod a+x d2j-dex2jar.sh
5. 进到 dex2jar 这个文件夹下并运行:
cd /Users/weixiangyang/Desktop/apktool/dex2jar-2.0/
./d2j-dex2jar.sh /Users/weixiangyang/Desktop/apktool/bm.apk
dex2jar 下便生成了 bm-dex2jar.jar 文件。
打开 JD-GUI,选择 cnyaomaitongappdaily_v263_bc84e798-b15b-423f-b6d6-116616feb9a6_dex2jar.jar,就看到源码了。
cd /Users/weixiangyang/Desktop/apktool
apktool b bm
发现 build 和 dist 就是回编译 apk 过程中生成的东西,编译出来的 apk 在 dist 目录下,这时 apk 是安装不成功的,总是提示Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]
再 打开 build/apk 文件夹会发现少了 original 文件夹下的 META-INF 文件夹,也就意味着 dist 里的 apk 文件是没有签名的,如图:
(拓展:图中特意框出了AndroidManifest.xml文件,让你留意下,他是 Android 应用的入口文件,记录了程序运行所必要的组件,权限,以及一些相关信息,以后用处多多)
1. 生成 bm.keystore 文件
keytool -genkey -keystore /Users/weixiangyang/Desktop/apktool/bm.keystore -alias bm -keyalg RSA -validity 10000
翻译下哈,
-genkey
:创建新密匙
-keystore /Users/weixiangyang/Desktop/apktool/bm.keystore
:到/Users/weixiangyang/Desktop/apktool 目录下并且命名为 bm.keystore
-alias bm
:密匙别名为 bm
-keyalg RSA
:生成密钥对的算法为 DSA
-validity 10000
:创建的证书有效期为 10000 天
如图所示,执行命令后会出现下面步骤:
这些步骤操作完,看下你指定生成的 bm.keystore 文件路径:如图所示:
附上keytool常用参数用法:
1. -genkey
表示要创建一个新的密钥
2. -alias
别名,证书库中的每条证书以别名来区分,这个 alias 通常不区分大小写。
3. -keystore
证书库文件路径和名字
4. -keyalg
指定生成密钥对的算法 (如 RSA DSA,默认值为:DSA)
5. -keysize
指定密钥长度(默认 1024)
6. -validity
指定创建的证书有效期多少天 (默认 90)
7. -storepass
指定证书库的访问密码
8. -keypass
指定证书库中指定条目证书的私钥密码
9. -dname
表示证书的 Distinguished Names 发行者信息。其中"CN=commonName 证书名(一般是网站的域名),OU=organizationUnit 组织单位名称,O=organizationName 组织名称,L=localityName 城市或区域名,S=stateName 州或省份名称,C=country 两位的母国家代码"
10. -file
导出的证书位置(包含公钥和主题信息的证书)
11. -v
显示证书库中的证书详细信息
12. -rfc
以可打印的编码格式输出证书详细信息
2. 为我们的 APK 文件签名:
jarsigner -verbose -keystore /Users/weixiangyang/Desktop/apktool/bm.keystore -signedjar /Users/weixiangyang/Desktop/apktool/bm1.apk /Users/weixiangyang/Desktop/apktool/bm/dist/bm.apk bm
简单说下具体参数
-verbose
:签名命令标识符
-keystore
:签名使用的密钥文件 (keystore) 的绝对路径。
-signedjar
:此后有三个参数:
参数一:签名后生成的 apk 文件所要存放的路径
参数二:未签名的 apk 文件的存放路径以及 apk 名称。
参数三:你的证书名称,通俗点说就是你 keystore 文件的别名,就是在你 eclipse 进行签名打包时的 Alias 的值。
执行后,会提示让你输入密钥库的密码短语:就上个步骤你自己设定的那个口令,在这里我是遇到了一个报错:,这里没问题的亲就跳过这段。
jarsigner 错误: java.lang.RuntimeException: 密钥库加载: Keystore was tampered with, or password was incorrect
这个问题浪费了我好久时间,百度的各种解决办法能试的都试了,也没找到方案,最后,我赶巧的是把 keystore 文件删掉,重新生成并为 keystore 文件设定了纯数字的口令密码,问题就解决。所以这里,各位童鞋都注意下。
密钥库的密码短语输入并执行成功后,会显示如图所示:
有看到很多人在问我写这个的目的,问是干嘛的?我在这里介绍下吧