您的位置:首页 > 移动开发 > Android开发

关于android的程序签名

2010-11-23 15:52 316 查看
我以前在做android杂志时候遇到一个需求,要求是开发人员开发完第一版本杂志后,后面的版本只需要通过工具改变文字内容和图片重新签名就可以出第二个版本,不用重新改源码进行编译打包。我把所有可能改变的资源都放在assets 目录下,在程序中通过名字来获取资源,这样就不用重新编译了,但是签名呢?怎样通过工具来程序签名呢?

一: 生成未签名的apk包.

  把res, resources.arsc, classes.dex, AndroidMainfest.xml, assets等资源打包成apk。 apk 是采用的zip压缩方式,但是资源中图片和音乐是不压缩的,也就是图片和音乐要保持原大小。

代码

public static void main(String[] args) {
2         args = new String[]{"d:/testkey.x509.pem","d:/testkey.pk8", "d:/lyl.apk", "d:/lyl1.apk"}; //第一个参数是公钥,第二个参数是私钥, 第三个参数是需要签名的apk, 第四个参数是签名后生成的apk
3
4         JarFile inputJar = null;
5         JarOutputStream outputJar = null;
6
7         try {
8             X509Certificate publicKey = readPublicKey(new File(args[0]));
9             PrivateKey privateKey = readPrivateKey(new File(args[1]));
10             inputJar = new JarFile(new File(args[2]), false);  // Don't verify.
11             outputJar = new JarOutputStream(new FileOutputStream(args[3]));
12             outputJar.setLevel(9);
13
14             // MANIFEST.MF
15             Manifest manifest = addDigestsToManifest(inputJar);
16             manifest.getEntries().remove("META-INF/CERT.SF");
17             manifest.getEntries().remove("META-INF/CERT.RSA");
18             outputJar.putNextEntry(new JarEntry(JarFile.MANIFEST_NAME));
19             manifest.write(outputJar);
20
21             // CERT.SF
22             Signature signature = Signature.getInstance("SHA1withRSA");
23             signature.initSign(privateKey);
24             outputJar.putNextEntry(new JarEntry("META-INF/CERT.SF"));
25             writeSignatureFile(manifest,
26                     new SignatureOutputStream(outputJar, signature));
27
28             // CERT.RSA
29             outputJar.putNextEntry(new JarEntry("META-INF/CERT.RSA"));
30             writeSignatureBlock(signature, publicKey, outputJar);
31
32             // Everything else
33             copyFiles(manifest, inputJar, outputJar);
34         } catch (Exception e) {
35             e.printStackTrace();
36             System.exit(1);
37         } finally {
38             try {
39                 if (inputJar != null) inputJar.close();
40                 if (outputJar != null) outputJar.close();
41             } catch (IOException e) {
42                 e.printStackTrace();
43                 System.exit(1);
44             }
45         }
46     }


执行完signApk后签名完成,可以安装应用程序了,呵呵。

源代码:SignApkUtil.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: