使用apktool 进行android APK 反编译和打包

来源:互联网 发布:多益网络有年终奖吗 编辑:程序博客网 时间:2024/06/02 11:36

APK反编译与修改后打包方法:

1、反编译:

进入到APKtool目录下:

将需要反编译的apk放到此目录下,在adb窗口输入命令:

D:\开发工具\Decompile\Decompile\apktool>apktool d D:\开发工具\Decompile\Decompil
e\apktool\4.apk D:\开发工具\Decompile\Decompile\apktool\4
I: Baksmaling...
I: Loading resource table...
I: Loaded.
decode

该命令用于进行反编译apk文件,一般用法为
apktool d <file.apk> <dir>
<file.apk>代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk
<dir>代表了反编译后的文件的存储位置,比如C:\MusicPlayer
如果你给定的<dir>已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令
apktool d –f <file.apk> <dir>
这样就会强行覆盖已经存在的文件


2、打包编译:

D:\开发工具\Decompile\Decompile\apktool>apktool b D:\开发工具\Decompile\Decompil
e\apktool\4
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...

build
该命令用于编译修改好的文件,一般用法为
apktool b <dir>
这里的<dir>就是刚才你反编译时输入的<dir>(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。


3、签名

编译成功之后无法安装,缺少签名:
签名方法:

《一》使用命令行生成签名文件 

(1)创建一个用来存放签名文件的文件夹Android_keystore
(2)在命令行窗口中输入命令:(粗体部分) 
D:\Android_keystore>keytool -genkey -alias aeo_android.keystore -keyalg RSA -val
idity 20000 -keystore aeo_android.keystore

输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  localhost
您的组织单位名称是什么?
  [Unknown]:  btbu
您的组织名称是什么?
  [Unknown]:  btbu
您所在的城市或区域名称是什么?
  [Unknown]:  beijing
您所在的省/市/自治区名称是什么?
  [Unknown]:  beijing
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=XiaoFeng, OU=btbu, O=btbu, L=beijing, ST=beijing, C=cn是否正确?
  [否]:  y

  输入 <aeo_android.keystore> 的密钥口令
        (如果和密钥库口令相同, 按回车):


这时会在D盘的Android_keystore文件夹下生成aeo_android.keystore文件,就是我们需要的签名文件,(-validity 20000 表示证书的有效天数为20000天) 


《二》用生成的签名文件对apk文件进行签名 

(1)将需要签名的apk 保存到D盘的Android_keystore文件夹下,名为testbim.apk 

(2)使用jarsigner给 testbim.apk 文件签名,如下所示:


D:\Android_keystore>"C:\Program Files\Java\jdk1.6.0_30\bin\jarsigner.exe" -verbo
se -keystore aeo_android.keystore -signedjar testbim_signed.apk testbim.apk aeo_
android.keystore




注意:这里修改为自己的jdk路径和apk名称


输入密钥库的口令短语:
   正在添加: META-INF/MANIFEST.MF
   正在添加: META-INF/AEO_ANDR.SF
   正在添加: META-INF/AEO_ANDR.RSA
  正在签名: res/drawable-hdpi/ic_action_search.png
  正在签名: res/drawable-hdpi/ic_launcher.png
  正在签名: res/drawable-ldpi/ic_launcher.png
  正在签名: res/drawable-mdpi/ic_action_search.png
  正在签名: res/drawable-mdpi/ic_launcher.png
  正在签名: res/drawable-xhdpi/ic_action_search.png
  正在签名: res/drawable-xhdpi/ic_launcher.png
  正在签名: res/layout/activity_main.xml
  正在签名: res/layout/two.xml
  正在签名: res/menu/activity_main.xml
  正在签名: AndroidManifest.xml
  正在签名: classes.dex
  正在签名: resources.arsc


keytool 是个密钥和证书管理工具。jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名 (JAR 文件将类文件、图象、声音和/或其它数字化数据打包在一个文件中)。
这两个工具都是JDK自带的,所以你当前需要先确保JDK安装正确。并且环境变量设置正确,以便可以以命令行的方式进行处理。


输入密匙的口令短语: 
...... 
通过上面的命令就可以讲未签名的testbim.apk 文件签名为   testbim_signed.apk


(3)最后验证是否签名成功 

Android_keystore>"C:\Program Files\Java\jdk1.6.0_30\bin\jarsigner.exe" -verify testbim_signed.apk
如果成功则 
输出: 

jar 已验证 


命令参数说明:
-genkey    产生证书文件 
-keystore  指定密钥库的.keystore文件中 
-keyalg     指定密钥的算法
-validity    为证书有效天数,这里我们写的是20000天。 
-alias       产生别名 
在输入密码时没有回显,只管输入就可以了,切忌需要记下来后面还要用,
注意:
1、CN(Common Name - 名字与姓氏):其实这个“名字与姓氏”应该是域名,比如说localhost或是blog.devep.net之类的。输成了姓名,
和真正运行的时候域名不符,会出问题。浏览器访问时,弹出一个对话框,提示“安全证书上的名称无效,或者与站点名称不匹配”,
用户选择继续还是可以浏览网页。但是用http client写程序访问的时候,会抛出类似于“javax.servlet.ServletException: 
HTTPS hostname wrong: should be ”的异常。
2、在用keytool生成数字证书时必须保证:-keystore androidapp.keystore -alias androidapp.keystore 两者名称必须相同。
否则下一步签名时会出现错误:jarsigner: 找不到 androidapp.keystore 的证书链。androidapp.keystore 
必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。

3、不要用高版本的jdk,用1.6版本。

参考:

http://blog.csdn.net/aeolus1019/article/details/8121031



0 0