Android Apk 打包

这里重点介绍的是利用jdk中的两个工具对Android的应用程序包apk文件进行签名。
主要分为3个步骤:第一步生成签名文件,第二步对apk文件签名,第三步验证签名。

以下是执行命令,注意此段命令所生成的签名文件和apk文件在同一目录下。
首先进入dos命令行,运行-->cmd --> cd apk所在的路径(以下简称apk_dir)

第一步生成签名文件
apk_dir>keytool -genkey -keystore  hellos.keystore  -alias
hello -keyalg  RSA -validity 2000
输入keystore密码:1q1q1q
再次输入新密码:1q1q1q
您的名字与姓氏是什么?
  [Unknown]:  jiezzy
您的组织单位名称是什么?
  [Unknown]:  home
您的组织名称是什么?
  [Unknown]:  person
您所在的城市或区域名称是什么?
  [Unknown]:  Shanghai
您所在的州或省份名称是什么?
  [Unknown]:  Shanghai
该单位的两字母国家代码是什么
  [Unknown]:  cn
CN=mark, OU=markorg, O=markorg, L=Shanghai, ST=Shanghai, C=cn 正确吗?

  [否]:  Y

输入的主密码
        (如果和 keystore 密码相同,按回车):
再次输入新密码:
 
-----------------------------------------------------------------
以上命令执行完成在apk_dir目录中将生成一个名字为hellos.keystore的签名文件


第二步对apk文件签名

apk_dir>jarsigner -verbose -keystore  hellos.keystore -signe
djar hello_sig.apk helloworld.apk  hello
输入密钥库的口令短语:
  正在添加: META-INF/HELLO.SF
  正在添加: META-INF/HELLO.RSA
  正在签名: res/layout/linearlayout.xml
  正在签名: res/layout/main.xml
  正在签名: res/layout/progressbar.xml
  正在签名: res/layout/radio.xml
  正在签名: res/layout/relativelayout.xml
  正在签名: res/layout/tablelayout.xml
  正在签名: res/layout/user.xml
  正在签名: AndroidManifest.xml
  正在签名: resources.arsc
  正在签名: res/drawable-hdpi/icon.png
  正在签名: res/drawable-ldpi/icon.png
  正在签名: res/drawable-mdpi/icon.png
  正在签名: classes.dex


第三步验证签名

apk_dir>jarsigner -verify helloworld.apk
jar 已验证。


另外一种方法是通过eclipse差距ADT工具生成,这里也简单介绍一下:
第一步:选中你的android项目,点鼠标右键
       Android Tools --> Export Signed Application Packge...
第二步
      Project Checks(这里基本不用动) -->  Keystore selection 选择 create new keystore
      在下面依次填写签名文件的名字(要以.store结尾),密码,重复密码 --> key creation
      填写签名详细信息
第三步
      给签名后的apk文件输入一个名字,点Finsh完成!

1APK打包的步骤

首先,我们需要一个keystore,当然已经有了的话就不用这一步了:
cmd下:
进入到jdk的bin目录,这样的话,android.keystore文件就会生成在这个目录下,签名的时候我们需要这个文件
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]: Mickle您的组织单位名称是什么?
[Unknown]:
www.ioou.com
您的组织名称是什么?
[Unknown]:
www.ioou.com
您所在的城市或区域名称是什么?
[Unknown]: Shanghai
您所在的州或省份名称是什么?
[Unknown]: Shanghai
该单位的两字母国家代码是什么
[Unknown]: CN
CN=Mickle, OU=www.ioou.com, O=www.ioou.com, L=Shanghai, ST=Shanghai, C=CN 正确吗?
[否]: Y
输入<android.keystore>的主密码(如果和 keystore 密码相同,按回车):

其中参数-validity为证书有效天数,这里我们写的大些10000天。还有在输入密码时没有回显(尽管输就是啦) 并且 退格,tab等都属于密码内容,这个密码在给.apk文件签名的时候需要.

然后签名:
Eclipse中,右击需要签名的工程-->android tools-->export signed application package...
出现下面对话框,选择需要签名的工程

next,选择上面生成的android.keystore文件位置和设置的密码

next

next,选择签名生成文件的位置和名称

finish,搞定啦..

 

2. 设置打包的APK文件的图标和名称

    修改AndroidManifest.xml文件:

     <application android:icon="@drawable/fruit" android:label="@string/app_name">

      icon: 对应着你打包后显示的快捷菜单的图标

     主Intent的label字符对应你的程序名称

3.查看创建的信息
keytool -list -v -keysotre d:\app_key\alan_test(文件名) -storepass 123456

4.签名之后,用zipalign(压缩对齐)优化你的APK文件。
  未签名的apk不能使用,也不能优化。签名之后的apk谷歌推荐使用zipalign.exe(位于android-sdk-windows ools目录下)工具对其优化:

       D:>zipalign -v 4 demo_signed.apk final.apk

  如上,zipalign能够使apk文件中未压缩的数据在4个字节边界上对齐(4个字节是一个性能很好的值),这样android系统就可以使用mmap()(请自行查阅这个函数的用途)函数读取文件,可以在读取资源上获得较高的性能,
  PS:1.在4个字节边界上对齐的意思就是,一般来说,是指编译器吧4个字节作为一个单位来进行读取的结果,这样的话,CPU能够对变量进行高效、快速的访问(较之前不对齐)。
          2.对齐的根源:android系统中的Davlik虚拟机使用自己专有的格式DEX,DEX的结构是紧凑的,为了让运行时的性能更好,可以进一步用"对齐"进一步优化,但是大小一般会有所增加。

5.签名对你的App的影响。
   你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的APP都使用同一个签名证书。
   使用你自己的同一个签名证书,就没有人能够覆盖你的应用程序,即使包名相同,所以影响有:
  1) App升级。 使用相同签名的升级软件可以正常覆盖老版本的软件,否则系统比较发现新版本的签名证书和老版本的签名证书不一致,不会允许新版本安装成功的。
  2) App模块化。android系统允许具有相同的App运行在同一个进程中,如果运行在同一个进程中,则他们相当于同一个App,但是你可以单独对他们升级更新,这是一种App级别的模块化思路。
  3) 允许代码和数据共享。android中提供了一个基于签名的Permission标签。通过允许的设置,我们可以实现对不同App之间的访问和共享,如下:

  1. AndroidManifest.xml:<permission android:protectionLevel="normal" />  
  1. AndroidManifest.xml:<permission android:protectionLevel="normal" />  

其中protectionLevel标签有4种值:normal(缺省 值),dangerous, signature,signatureOrSystem。简单来说,normal是低风险的,所有的App不能访问和共享 此App。dangerous是高风险的,所有的App都能访问和共享此App。signature是指具有相同签名的App可以访问和共享此App。 signatureOrSystem是指系统image中App和具有相同签名的App可以访问和共享此App,谷歌建议不要使用这个选项,因为签名就足 够了,一般这个许可会被用在在一个image中需要共享一些特定的功能的情况下。

7.  使用jarsigner工具为Android应用程序签名
          jarsigner -verbose -keystore liufeng.keystore -signedjar notepad_signed.apk notepad.apk liufeng.keystore
          说明:
            1)jarsigner是工具名称,-verbose表示将签名过程中的详细信息打印出来,显示在dos窗口中;
            2)-keystore liufeng.keystore 表示签名所使用的数字证书所在位置,这里没有写路径,表示在当前目录下;
            3)-signedjar notepad_signed.apk notepad.apk 表示给notepad.apk文件签名,签名后的文件名称为notepad_signed.apk;
            4)最后面的liufeng.keystore 表示证书的别名,对应于生成数字证书时-alias参数后面的名称
      8.  使用zipalign工具优化已签名的apk(非必须但建议这么做)
           zipalign -v 4 notepad_signed.apk notepad_signed_aligned.apk
             说明:
             1)zipalign是工具名称,-v表示在DOS窗口打印出详细的优化信息;
             2)notepad_signed.apk notepad_signed_aligned.apk 表示对已签名文件notepad_signed.apk进行优化,优化后的文件名为   notepad_signed_aligned.apk

如果你以前的程序是采用默认签名的方式(debug签名),一旦换了新的签名应用将不能覆盖安装,必须将原先的程序卸载掉,才能安装上。

因为程序覆盖安装主要检查两点:
       1)两个程序的入口Activity是否相同。两个程序如果包名不一样,即使其它所有代码完全一样,也不会被视为同一个程序的不同版本;
       2)两个程序所采用的签名是否相同。如果两个程序所采用的签名不同,即使包名相同,也不会被视为同一个程序的不同版本,不能覆盖安装。
      另外,可能有人可能会认为反正debug签名的应用程序也能安装使用,那也没有必要自己签名了嘛。千万不要这样想,debug签名的应用程序有这样两个限制,或者说风险:
       1)debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名;

        Debug模式下签名用的证书(默认是Eclipse/ADT和Ant编译)自从它创建之日起,1年后就会失效。

       2)debug.keystore在不同的机器上所生成的可能都不一样,就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种 程序不能覆盖安装的问题。不要小视这个问题,如果你开发的程序只有你自己使用,当然无所谓,卸载再安装就可以了。但要是你的软件有很多使用客户,这就是大 问题了,就相当于软件不具备升级功能!

 

 

一个android项目开发完成之后要安装到设备上或者放到电子市场的话需要签名认证. 下面就详细简介android签名认证的过程及常见问题的解决.

 

1. 搭建java环境, 安装并配置jdk

 

2. 安装完成之后进行下列操作(本人jdk安装目录:D:\Program Files\Java\jdk1.6.0_18 )

 

2.1 生成keystore文件. 首先进入D:\Program Files\Java\jdk1.6.0_18\bin目录 (这目录下有两个文件: keytool.exe , jarsigner.exe . 签名就需要用到这两个工具)

 

如果环境配置好的话,执行命令: 

 

keytool -genkey -v -keystore crack.keystore -alias android -keyalg RSA -validity 20000

(原文)出现的问题1

完成之后. 但是在D:\Program Files\Java\jdk1.6.0_18\bin目录下始终找不到crack.keystore , 后来我将keystore文件保存指定目录.

 

本人发现在 C:\Documents and Settings\Administrator中

2.2   签名认证: 生成完keystore文件之后, 进行签名认证执行如下命令: 
   jarsigner -verbose -keystore crack.keystore -signedjar CrackMe_signed.apk CrackMe.apk crack.keystore 

出现问题2: 

执行该命令之后总是报错: jarsigner: 找不到 crack.keystore 的证书链。crack.keystore 必须引用包                           含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。
 

检查后发现: 步骤2.1中 keystore文件名与别名不一致造成, 故将步骤2.1指令更改如下:

keytool -genkey -v -keystore crack.keystore -alias crack.keystore -keyalg RSA -validity 20000 , 再执行步骤2.2就OK啦. 

 

 

在对android APK进行签名的过程中,我碰到过几种不同的问题:
问题一:jarsigner: 无法打开 jar 文件: ChangeBackgroundWidget.apk
我的解决方法是:将要进行签名的APK放到对应的文件下,如我把要签名的ChangeBackgroundWidget.apk放到JDK的bin文件里。
问题二:jarsigner: 找不到 androidapp.keystore 的证书链。androidapp.keystore 必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。
方法:在用keytool生成数字证书时必须保证:-keystore androidapp.keystore -alias androidapp.keystore 两者名称必须相同。
问题三:jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry comp
ressed size (expected 768 but got 800bytes)
这个问题,我还没解决,在网上搜了下,找到了一种方法,但我实践没完全,所以不知道这个解决方法是否正确:
方法一:Android开发网提示这些问题主要是由于资源文件造成的,对于android开发来说应该检查res文件夹中的文件,逐个排查。这个问题可以通过升级系统的JDK和JRE版本来解决。
方法二:这是因为默认给apk做了debug 签名,所以无法做新的签名这时就必须点工程右键->Android Tools ->Export Unsigned Application Package.
或者从AndroidManifest.xml的 Exporting上也是一样的
然后再基于这个导出的unsigned apk做签名,导出的时候最好将其目录选在你之前产生keystore的那个目录下,这样操作起来就方便了。

 
原文地址:https://www.cnblogs.com/jiezzy/p/2532598.html