重新打包apk,使用java bin目录里的jarsigner进行签名
反编译android apk包使用apktool工具,下载地址http://download.csdn.net/detail/fancylovejava/8447801
命令:
cmd>cd /d E:\apktool
apktool d xxxx.apk执行后会在当前apktool目录下生成一个xxxx名的文件,此文件就是apk包反编译后的文件
然后如果想在asset目录下添加个文件,可以放在文件下,不过代码需要修改预先写入读取asset的逻辑
然后使用命令apktool b xxxx<这个是目录> 然后会在xxxx目录里多出个dist文件,里面包含个重新打包好的apk,但是这个apk没有使用keystore签名,所以需要使用java的jarsigner进行签名
命令如下
C:\Program Files\Java\jdk1.8.025\bin>jarsigner -verbose -keystore keybaohuai -digestalg SHA1 -sigalg MD5withRSA -signedjar AndroidTestsigned.apk zhaocaixiong_101.apk baohuai
会出现一行警告
警告:未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期日期 (2113-10-30) 或以后的任何撤销日期之后, 用户可能无法验证此 jar。
注意
jarsigner 签名命令里加入如下参数来解决:-digestalg SHA1 -sigalg MD5withRSA
可以忽略,安装后测试是否可行!
利用标准的java工具keytool.exe(位于jdk\jre\bin目录下)创建key,利用jarsigner.exe工具使用生成证书和给程序签名(位于jdk\bin目录下)。
win+R运行cmd,进入目录D:\temp(注:使用该目录为示例工作目录)
a)、创建可以,运行如下命令
keytool -genkey -alias demo.keystore -keyalg RSA -validity 20000 -keystore demo.keystore
/*说明:keytool工具是Java JDK自带的证书工具
-genkey参数表示:要生成一个证书(版权、身份识别的安全证书)
-alias参数表示:证书有别名,-alias demo.keystore表示证书别名为:demo
-keyalg RSA表示加密类型,RSA表示需要加密,以防止别人盗取
-validity 20000表示有效时间20000天
-keystore demo.keystore表示要生成的证书名称为demo
b)、删除之前的签名文件
用解压缩工具解打开apk文件(如:更改a.apk为a.zip,便可用压缩工具打开,并找到下面的目录META-INF下的CERT.RSA和CERT.SF文件,并删除该文件。删除后,再次更改后缀名为.apk;)
注:
META-INF目录:存放签名后的CERT和MANIFEST文件,用于识别软件的签名及版权。
res目录:存放各种Android原始资源,包括:动画anim、图片drawable、布局layout、menu菜单、xml等等
AndroidManifest.xml编码后的Android项目描述文件,包括了Android项目的名称、版本、权限、程序组件描述等等
classes.dex编译后Class被dx程序转换成Dalvik虚拟机的可执行字节码文件
resources.arsc所有文本资源的编译产物,里面包含了各Location对应的字符串资源。
c)、使用生成的key对apk签名,运行如下命令:
jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demoAlias
/*说明:jarsigner是java的签名工具
-verbose参数表示:显示出签名详细信息
-keystore表示:使用当前目录中的demo.keystore签名证书文件。
-signedjar demo_signed.apk demo.apk demo正式签名,三个参数中依次为签名后产生的文件
demo_signed,要签名的文件demo.apk和秘钥库demo.keystore.*/
(注:查看某个apk是否经过了签名方法,jarsigner -verify demo.apk。优化:签名后需要做对齐优化处理zipalign -v 4 yourprojectname-unaligned.apk yourprojectname.apk)