heavyle 2013-07-29
由于某些限制,会有这样的需求:拿不到apk源码的情况下要对其中的一些资源进行修改,在Android签名的限制下,直接解压修改会导致签名不一致,这样的apk文件在手机上是无法被安装的,这样就只能对apk进行重新签名来生成新的apk包。从另外一个角度上来说,这也是从系统的级别来保证安全:一个被特定私钥签名的apk是无法被篡改且无法抵赖的。
要对apk进行重新签名,首先要生成自己的公私钥对,然后删除apk中原有的签名信息再对apk进行重新签名。通过解压可知,apk的签名信息全都存在于META-INF中,删除这个文件,原apk就变成了一个未签名的apk。
后面的做法摘自http://blog.csdn.net/zengyangtech/article/details/5801708,感谢原作者的探索。
C:/ProgramFiles/Java/jdk1.6.0_10/bin>keytool-genkey-aliasandroid123.keystore
-keyalgRSA-validity20000-keystoreandroid123.keystore
输入keystore密码:[密码不回显]
再次输入新密码:[密码不回显]
您的名字与姓氏是什么?
[Unknown]:android123
您的组织单位名称是什么?
[Unknown]:www.android123.com.cn
您的组织名称是什么?
[Unknown]:www.android123.com.cn
您的组织名称是什么?
[Unknown]:www.android123.com.cn
您所在的城市或区域名称是什么?
[Unknown]:NewYork
您所在的州或省份名称是什么?
[Unknown]:NewYork
该单位的两字母国家代码是什么
[Unknown]:CN
CN=android123,OU=www.android123.com.cn,O=www.android123.com.cn,L=NewYork,ST
=NewYork,C=CN正确吗?
[否]:Y
输入<android123.keystore>的主密码[img][/img]
(如果和keystore密码相同,按回车):
通过以上步骤可以获得一个keystore,里面存储的是公私密钥信息。
接下来就可以签名了。
执行下面这句jarsigner-verbose-keystoretest.keystore-signedjartest_signed.apktest.apktest.keystore就可以生辰签名的apk文件,这里输入文件android123.apk,最终生成android123_signed.apk为Android签名后的APK执行文件。下面提示输入的密码和keytool输入的一样就行了
这里-keystore里是刚才生成的密钥
-signedjar第一个参数test_signed.apk是输出apk,test.apk是原apk,testkeystore是刚才生成的密钥对的别名
执行完毕之后就可以得到重新签名的apk了。
更加详细的参数解释可以在原作者博客里找到。
adb shell cd system/app rm *.apk21. 获取管理员权限: adb root22. 启动Activity: adb shell am start -n 包名/包名+类名。