关于android的程序签名

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

一: 生成未签名的apk包.

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

 

代码

 

 

二.  对apk包进行签名.
看了博文;,下面是我的解决方法,希望有朋友用的着。
首先需要android自带的私钥 和公钥testkey.zip
还有SignApk.java.

在signApk.java中的main(String []args)方法中 参数args这里我们无法传入,我们只有到程序中自己赋值。

 

代码
复制代码
   
   
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后签名完成,可以安装应用程序了,呵呵。

原文: http://www.cnblogs.com/jeromeliu/archive/2010/11/23/1885244.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值