前言
在我们使用app的时候总会好奇,我艹,这么炫的动画怎么做的或者觉得E文版看着不舒服想给app换语言甚至看看别人app的实现思路,这个时候我们就可以选择反编译app,抱着学习的心态尝试查看下"源码"。
快速查看apk源码
apk源码主要在classes.dex中,解压apk文件即可得到这个,然后通过jadx即可将dex文件转换为jar文件,从而可以得到源码。这里主要给出一个基于jadx的封装工具.
下载地址:jadx-han_0.6.4
解压后双击\bin\jadx-gui.bat即可。
最新版本可以查看git地址。
反编译apk
- 工具
apktool_2.2.2.jar:下载地址
git地址:https://github.com/iBotPeaches/Apktool
- 命令格式
反编译apk : java -jar [apktool的绝对地址] d [apk绝对地址] -o [输出目录]
eg:
//将D盘跟目录中的Tv.apk反编译到output文件夹中 java -jar D:\apktool_2.2.2.jar d D:\Tv.apk -o output
回编译apk:java -jar apktool.jar b [反编译出来的目录]
eg:
//将D盘下output中的文件打包为apk java -jar D:\apktool_2.2.2.jar b D:\output
生成的apk文件在此文件夹中的dist文件夹中,中间文件入dex文件等在build文件夹下,本例中为D:\output\dist 以及D:\output\build文件夹。
apk的签名
通过上面的反编译以及回编译,我们只能得到一个未签名的apk文件,未签名的apk在Android系统中是无法安装的,所以这里我们要生成一个签名文件用来给apk签名。查看apk是否签名的方法是用解压软件打开apk文件,里面有/META-INF/文件夹则说明为签名文件。
- 工具
keytool:获取地址:在jdk安装目录的bin目录下面,比如: \jdk1.7.0_25\bin\
- 命令格式
生成签名文件:keytool -genkey -alias [签名的用户名] -keyalg RSA -validity [签名的有效期]-keystore [签名文件的文件名] -outfile [签名文件的存放位置]
eg:
//在当前目录下面生成一个名字为keyfile.keystore的签名文件,用户名为username keytool -genkey -alias username -keyalg RSA -validity 20000 -keystore keyfile.keystore -outfile ./
输入此条命令则会继续输入其他需要的信息:
$ keytool -genkey -alias username -keyalg RSA -validity 20000 -keystore keyfile.keystore -outfile ./ 输入密钥库口令: password 再次输入新口令: password 您的名字与姓氏是什么? [Unknown]: test 您的组织单位名称是什么? [Unknown]: test 您的组织名称是什么? [Unknown]: test 您所在的城市或区域名称是什么? [Unknown]: test 您所在的省/市/自治区名称是什么? [Unknown]: test 该单位的双字母国家/地区代码是什么? [Unknown]: test CN=test, OU=test, O=test, L=test, ST=test, C=test是否正确? [否]: Y 输入 <username> 的密钥口令 (如果和密钥库口令相同, 按回车): password 再次输入新口令: password
给apk文件签名:
工具: jarsigner
获取地址:在jdk安装目录的bin目录下面,比如: \jdk1.7.0_25\bin\
语法:jarsigner -verbose -keystore [私钥存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [签名的用户名]
//使用D盘下的keyfile.keystore签名demo.apk并将签名后的文件放在D:\a.apk //签名文件的用户名为username $ jarsigner -verbose -keystore D:\keyfile.keystore -signedjar D:\a.apk demo.apk username 输入密钥库的密码短语: password 正在更新: META-INF/MANIFEST.MF 正在添加: META-INF/USERNAME.SF 正在添加: META-INF/USERNAME.RSA 正在签名: AndroidManifest.xml 正在签名: assets/setting.json 正在签名: classes.dex 正在签名: resources.arsc
验证签名是否正确:
命令: jarsigner -verify [待验证的apk]
//验证当前目录下的3q.apk签名是否正确 $ jarsigner -verify 3a.apk jar 已验证。 警告: 此 jar 包含证书链未验证的条目。 有关详细信息, 请使用 -verbose 和 -certs 选项重新运行。
对apk进行4k对齐优化
关于4K对齐为什么能优化不是本篇博客的重点,所以这里只给出命令,需要了解详情的请自行百度。
4K对齐apk
工具: zipalign 获取地址Android SDK/tools文件夹下 如F:\adt-bundle-windows-x86_64-20131030\sdk\tools\
zipalign -v 4 [旧apk] [新apk]
$[省略前面路径]/sdk/tools/zipalign.exe -v 4 3a.apk 3a_new.apk Verifying alignment of 3a_new.apk (4)... 50 META-INF/MANIFEST.MF (OK - compressed) 647 META-INF/USERNAME.SF (OK - compressed) 1339 META-INF/USERNAME.RSA (OK - compressed) 2464 res/layout/activity_main.xml (OK - compressed) 2927 res/menu/main.xml (OK - compressed) 3238 AndroidManifest.xml (OK - compressed) 3952 resources.arsc (OK) 6216 res/drawable-hdpi/ic_launcher.png (OK) 12244 res/drawable-mdpi/ic_launcher.png (OK) 15420 res/drawable-xhdpi/ic_launcher.png (OK) 24840 res/drawable-xxhdpi/ic_launcher.png (OK) 42770 classes.dex (OK - compressed) Verification succesful
检测apk是否4K对齐
zipalign -c -v 4 [apk路径]
查看apk的签名信息
有时候我们需要接入三方服务比如百度地图的时候,需要使用包名+签名的sha1值才行,所以这里给出一种方式获取签名详细信息。
用压缩软件解压apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件,然后使用下面的命令就可以得到应用的签名信息了。
keytool -printcert -file f:/META-INF/CERT.RSA