android 签名工具 autoSign jarsigner
PackageManagerService
处理各种应用的安装、卸载、管理等工作,开机时由systemServer启动此服务。就是说之前安装过的应用或者系统应用信息都会在开机扫描过程中存到mPackages这个hashMap中。
开机后用户的安装操作也会同样存到这个hashMap里面。getPackageInfo,调用generatePackageInfo,里面调用的是PackageParser中的generatePackageInfo
autoSign 签名工具
把new.apk文件(需要签名的apk文件)复制到签名软件的目录下,再用记事本打开Sign.bat,将其修改为如下代码:
java -jar signapk.jar testkey.x509.pem testkey.pk8 new.apk new_signed.apk
最后双击一下Sign.bat即可签名完成
jarsigner 签名工具
1、生成签名
用AndroidStudio或者ecplise来生成一个keystore,也可以通过执行命令:
//keytool -genkey -keystore abc.keystore -alias abc.keystore -keyalg RSA -validity 20000
keytool -genkey -keystore my.keystore -keyalg RSA -validity 10000 -alias my
//-keystore 后跟签名文件 -alias 后跟签名文件的别名,一般和普通名字一样, 执行命令后会出现密码、开发者等相关信息录入项,填入相关信息即可
2、签名打包
签名文件my.keystore和apk拷到同一个目录下,执行命令:
//jarsigner -verbose -keystore abc.keystore -signedjar 123x.apk 123.apk abc.keystore
jarsigner -verbose -keystore my.keystore -signedjar my_signed.apk my.apk my
//my.keystore即你的签名文件, my.apk即需要进行签名的apk, my_signed.apk即Android签名后的APK文件
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
意义:
以testkey.x509.pem 这个公钥文件和 testkey.pk8 这个私钥文件对 update.apk 进行签名,签名后保存为 update_signed.apk
1、
Manifest manifest = addDigestsToManifest(inputJar);
//创建Manifest,
JarFile inputJar = new JarFile(new File(args[2]), false); //输入Jar文件
manifest.getEntries().remove("META-INF/CERT.SF");
manifest.getEntries().remove("META-INF/CERT.RSA");
outputJar.putNextEntry(new JarEntry("META-INF/MANIFEST.MF"));
//为MANIFEST.MF,创建Jar文件实体类、
JarOutputStream outputJar = new JarOutputStream(new FileOutputStream(args[3]));
outputJar.setLevel(9);
manifest.write(outputJar);//遍历Apk中所有文件,对非文件夹非签名文件的文件逐个生成SHA1数字签名信息,再base64编码,然后再写入MANIFEST.MF文件中。SHA1生成的摘要信息,如果修改了某个文件,Apk安装校验时,取到的该文件的摘要与MANIFEST.MF中对应的摘要不同,则安装不成功
2、
Signature signature = Signature.getInstance("SHA1withRSA"); //对生成的Manifest使用SHA1withRSA算法
signature.initSign(privateKey); //用私钥签名, PrivateKey privateKey = readPrivateKey(new File(args[1]));
outputJar.putNextEntry(new JarEntry("META-INF/CERT.SF")); //为CERT.SF, 创建Jar文件实体类、输出
writeSignatureFile(manifest, new SignatureOutputStream(outputJar, signature));//经该函数,生成CERT.SF签名文件
//用私钥通过RSA算法对manifest里的摘要信息进行加密(安装的时候只能通过公钥解密,解密之后才能获得正确的摘要,再对比摘要是否一致,不同则安装不成功)
3、 outputJar.putNextEntry(new JarEntry("META-INF/CERT.RSA"));
//为CERT.RSA, 创建Jar文件实体类、输出 writeSignatureBlock(signature, publicKey, outputJar);
// 对输出Jar文件进行私钥签名,公钥加密
//最后就是如何生成CERT.RSA,打开这个文件看到的是乱码,说明整个文件都被编码加密了,而且这个文件和公钥有关,从源码中看出他是通过PKCS7将整个文件加密了
4、copyFiles(manifest, inputJar, outputJar);