一个android apk的编译过程 请参考:

http://www.2cto.com/kf/201312/261475.html

典型的编译过程:

aapt( Android Asset Packaging Tool): 把你的应用程序资源文件(例如: AndroidManifest.xml file and the XML files for your Activities),编译成R.java 。它可以让你从java代码中引用你的资源。

aidl :转换.aidl 接口成为java接口

java编译工具(javac):所有的java代码(包括 :java源码,R.java , .aidl 转换后的接口文件)由java编译工具(javac) 编译成中间代码(.class) 文件。

dex工具(dx):转换中间代码和第三方库的中间代码为Dalvik byte codeapk建立工具:把所有不需要编译的资源,编译的资源和Dalvik代码(.dex)打包成 .apk 文件签名(jarsigner).apk 建立后,它必须被签名才能安装到设备上,否则设备会拒绝安装。

因为编译工具包含了调试签名的私钥,所以在编译时就直接签名了。但是你要发行版本时,你必须自己对apk包进行签名。

对齐工具(zipalign):最后,还需要用zipalign工具对包进行对齐。

安装JDK,确保可以使用keytool jarsigner两个工具,因为apk格式其实就是jar,jar又是基于zip格式 添加一些扩展内容的格式.

1.制作签名工具
C:\>where keytool
C:\Program Files\Java\jdk1.7.0_45\bin\keytool.exe
2.进行签名工具
C:\>where jarsigner
C:\Program Files\Java\jdk1.7.0_45\bin\jarsigner.exe

签名分两个部分:

生成私钥

keytool:

Keytool 选项 描述
-genkey 产生一个键值对(公钥和私钥)
-v 允许动作输出
-alias<alias_name> 键的别名。只有前八位字符有效。
-keyalg 产生键的加密算法。支持DSA和RSA。
-keysize 产生键的长度。如果不支持,keytool用默认值1024 bits.通常我们用2048 bits 或更长的key。
-dname

专有名称,描述谁创建的密钥。该值被用作自签名证书的颁发者和主题字段。注意你可以不在命令行指定。如果没有指定keytool会提示你(CN, OU, and so on)。

-keypass

键的密码。

主要为了安全起见,如果没提供,keytool会提示你输入。

-validity

键的有效期,单位:天

Note: A value of 10000 or greater is recommended.

-keystore.keystore 用于存储私钥的文件。
-storepass

私钥存储文件的密码。

主要为了安全起见,如果没提供,keytool会提示你输入。这个密码不会存储在你的shell历史记录中。

keytool -genkey -v -keyalg DSA -keysize 1024 -sigalg SHA1withDSA  -validity 20000  -keystore MyDevel.keystore -alias devel   -keypass MyDevel -storepass MyDevel

用私钥进行签名

jarsigner:

Jarsigner 选项 描述
-keystore.keystore 包含你私钥的存储文件
-verbose 显示输出动作。
-sigalg 签名算法,用 SHA1withRSA.
-digestalg 消息摘要算法,用 SHA1.
-storepass

存储文件的密码。

主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。

-keypass

私钥的密码。

主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。

jarsigner  -verbose -sigalg SHA1withDSA -digestalg SHA1  -keystore myDevel.keystore -storepass MyDevel test.apk devel

用eclipse工具进行签名:

在工程上点右键->android tools->export singedappplication package

用已经存在的keystore KEY存储文件签名:

也可以创建一个新的keystore文件:

这里validity 年的有效期为1-1000哦..其他就错了,改成500试试.

同样是MyDevel.keystore,一个是jarsigner签名,一个是eclipse签名。

对齐工具(zipalign):

一旦你已经签署了APK与你的私钥,在文件上运行zipalign。此工具可确保所有未压缩的数据开始于一个特定的字节对齐,相对于文件的开始。当一个设备上安装,确保对齐在4字节边界提供了性能优化。当对齐,Android系统能够读取文件使用mmap(),即使它们包含与对齐限制二进制数据,而不是复制所有从包中的数据的。其好处是在RAM中的运行应用程序所消耗的量减少。

zipalign -v 4 HelloWorld.apk HelloWorld_Release.apk

=========================================

在使用jarsigner签名的时候,遇到无法安装,提示无签名的错误:

正常的安装应该是:

C:\>adb install test.apk
360 KB/s (19576 bytes in 0.053s)
pkg: /data/local/tmp/test.apk
Success

如果已经安装,adb貌似无法直接覆盖安装

C:\>adb install test.apk
367 KB/s (19576 bytes in 0.052s)
pkg: /data/local/tmp/test.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]

对于【没有签名或签名有错误】的安装为

C:\>adb install test_Unsigned.apk
315 KB/s (18113 bytes in 0.056s)
pkg: /data/local/tmp/test_Unsigned.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

其他人也遇到过这个问题:如这位兄弟所言

JDK1.7签名APK异常 http://blog.csdn.net/sgz_china/article/details/8060315

错误的签名为:

C:\>jarsigner  -verbose  -keystore myDevel.keystore -storepass MyDevel test.apk devel
正在添加: META-INF/DEVEL.SF
正在添加: META-INF/DEVEL.DSA
正在签名: res/layout/main.xml
正在签名: AndroidManifest.xml
正在签名: resources.arsc
正在签名: res/drawable-hdpi/icon.png
正在签名: res/drawable-ldpi/icon.png
正在签名: res/drawable-mdpi/icon.png
正在签名: classes.dex
C:\>adb install test.apk
349 KB/s (19697 bytes in 0.055s)
pkg: /data/local/tmp/test.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] C:\>

主要是去掉了 jarsigner的两个参数:  -sigalg SHA1withDSA -digestalg SHA1

其实在Android官网有说明的:

http://developer.android.com/tools/publishing/app-signing.html#setup

Caution: As of JDK 7, the default signing algorithim has changed, requiring you to specify the signature and digest algorithims (-sigalg and -digestalg) when you sign an APK.
jarsigner  -..... -sigalg SHA1withRSA -digestalg SHA1 ...

JDK1.7 由于默认签名算法改变,需要指定 签名算法 和 密钥  算法.应该是对应keytool的

-sigalg <sigalg>签名算法名称

-keyalg <keyalg> 密钥算法名称

两个参数.

===============

另外关于签名后的META-INFO中的 SF RSA文件名

不过默认的APK的META-INFO的签名后的文件名是 CERT.SF 和 CERT.RSA. 我使用jarsigner 签名后 就是 那个 <alias>.SF <alias>.RSA。;用eclipse签名的就是这种命名。

这个CERT应该不是keytool指定的alias吧? 可以通过其他方式改成这个名字么?不知道,直接修改apk,那么apk的zip头信息中的签名信息将会被修改掉,导致无法安装了。

======================

TODO:关于APK签名,还有一种是Android源码中的 signapk.jar [编译 打包后,有SignApk.java的源码文件的]

使用方法:

Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

其中

testkey.pk8 是二进制,

0?? 0
*咹嗺
???? ? 謸奁$表莃噘?>>蚻??尐杓ㄍk觴n????Y?w〤玷=Kd镐渔V疋g?坎0祒?C綥r窮?嗮8壜?幘蠌拭??申撔躂驪"
P2鄝?頹3Y姒旍,瞅劆葄斬;1 :g7./d纍mB馲唼佁訢趌菝?XH?dO哭樕(wH埘gjT
乀然?光GU3膋汍o揿處i缛⑿巟& ?檙}<?欉洰8牪?[j? ?籜攧m梭贏?錸)3濖飒]硼}呸G釶I谋捏D ?f#慤;~鷓罪?茼袠┝鈾廗霦?v?ブ瓊~荨e?NY鮷4[?z?5
?<梪垴粪o阻1鲓羄5Z痺@U?鬍uy???v銷X6≮ud?┛??)錳楛j襸櫑鼔w襡L氇|u;溭Ldg庤鼼k~饷~昗漰Do珦?玣J蓸??+R六抨d颙?I??x?H?蹽v宿柦L{亖 昀?洉'?繛桬匴憊灖?龊撪吱H魔
﹁á赟hgk3掘樆M汎祷?F?,蛅v瓴酛w掔 祿*鱃鞴wU?
柏#v媂j駖m凝@?厙o_
,交啛!y玌pzu{a?亖 辋?4ǒ7欑珬漗u柇峣fI?洧?/b$4M+垑┨濏Go0.躈鎇陊綉蝠L?4??D(郩[葡N?aC~ |硭綴彵K2`MA62r?)?e"乫7~疑?\洀?崤慇?亖 渶fhg概*i?X??rb曚p0??餻l憣餌?Le???襰l/Mr葓鳲G!g雴?歴鵘蝏ぺ?O嶼\u錡l葫?聆R筘ㄕ舉i甖J?\右Y縦8跄鍽'杇亖 ?Of#zf?re?9?鸶钲筯榣sZ?Amx3r[
茍iH贘 =夘珩?鱆?x|y{偱?@8缳邏虼@砖UW噁~鎋藝d藹3€翁LνqE狢h? 钕┽叟f?_枭A.?3亐c*荬b贂b[桐F!糸Ys顝?雚×??
症塽?j{雗Ua础,`¥i飠wX+5区U狗l氏纖HEE/便麣h拍I?鳞;喳亙)4v広z????{塭邚鬄?

使用winhex复制16进制为:

308204BD020100300D06092A864886F70D0101010500048204A7308204A30201000282010100D6931904DEC60B24B1EDC762E0D9D8253E3ECD6CEB1DE2FF068CA8E8BCA8CD6BD3786EA70AA76CE60EBB0F993559FFD93E77A943E7E83D4B64B8E4FEA2D3E656F1E267A81BBFB230B578C20443BE4C7218B846F5211586F038A14E89C2BE387F8EBECF8FCAC3DA1EE330C9EA93D0A7C3DC4AF350220D50080732E0809717EE6A053359E6A694EC2CB3F284A0A466C87A94D83B31093A67372E2F6412C06E6D42F15818DFFE0381CC0CD444DA6CDDC3B82458194801B32564134FBFDE98C9287748DBF5676A540D8154C8BBCA07B9E247553311C46B9AF76FDEECCC8E69E7C8A2D08E782620943F99727D3C04FE72991D99DF9BAE38A0B2177FA31D5B6AFEE91F02010302820101008F0CBB589484076DCBF3DA41EB3BE56E297F339DF213ECAA045DC5F07DC5DE47E25049C4B1C4F34409D20A662391553B7EFA70D7EFF028DCEDD098A9C1E2998F4BEC451ABD2A76CB23A5D6AD827EDDA165D02F4E160E59F57B16345BD7297AFFB47F350A872D3C149775DBF1B7E06FD7E831F78AC15E355AAF774055BA0FF44575A286798E35C533B40276E44E5836A1DA7564ADFAF538A493A9BF10F213A657AC12291C1BE56997FC6AD27B99A7FC8977D2654CEBAA7C753B9CDA4C64671A8EE8FD476B7EE2C37E95579D70441E6FAB93A413AB664AC998FA25943F2B52C1F9C5EA64EF4A1BCA0149E717A214017896080C48A407DC4776CBDE96BD4CA1847B02818100EAC099171C9B95278C07BF9E974518855791769EA7B52BF6BA93E0D6A848C4A70D18A6E8A8A2DA5368676B33BEF298BB144D9AF8B5BBAD2246F42C2CCD7476EAB21BE14A771F92E7ADF600B5932AF747F7B9775587110AB0D8032318768B586AF17C6DC4FD40A8181E85876F5F0A2CBDBB03869F2179AB5570A7597A757B619B02818100E9FEF71934A8AF3799E712AB979D5E027596AD8D69156649961CE4A2AD082F186224344D2B888914A9CC9DED476F302EDC4EE65BEA77BD91F2F04C3F34BA09B6394428FBB4E0555BC6CF4EEC0E61437E00037CEDCB19BE598FB14B1732604D41363272FA3429E87F651D11228166377ED2C9A8190B5C9B8FDD2DE1C5029140CD028181009C80660F6867B8C508052A69BA2E1058E50BA469C52372A47C6295E47030831A08BB19F0706C918CF044F2227F4C65D20D8911FB23D2736C2F4D72C888F84F472167EB86FA150C9A73F955CE621CA4DAA5264F8E5A0B5C75E5576CBAF9B23AF1F652F3D8A8D5C56569AE5A4A3F5C1DD3D20259BF6BA67238F5C4E651A3A79667028181009BFF4F66231B1F7A669A0C7265139401A3B9C908F0B8EEDBB968986C735ACA10416D7833725B060DC6886948DA4A201F3D89EEE7F1A5290BF74ADD7F787C06797B82C5FD234038E7D9DF89F2B440D7A95557A89E87667EE65FCB8764CC403380CECC4CA6CD7145AA4368B61700EECFA9E1DBC5660793125FE8C9412E01B62B33028180632AADD91ADDA462D995A672625B05CDA94621F4E95973EE8F9A2DEB71A1C1AC1BD31A0DD6A28975871B6A7BEB6E5561B4A12C60A3A469EF7A77582B35C7F855B9B76CCACFC0774845FEA9452FB1E3A98C05FB9AA7526819C5C4498E0DC1DB1BA58A3BD4FB8183291E34768EDA7AB4058726FD1C8D147B8965DF8F15F39EBC37

testkey.x509.pem内容是:

-----BEGIN CERTIFICATE-----
MIIEqDCCA5CgAwIBAgIJAJNurL4H8gHfMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
Fw0wODAyMjkwMTMzNDZaFw0zNTA3MTcwMTMzNDZaMIGUMQswCQYDVQQGEwJVUzET
MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
hvcNAQEBBQADggENADCCAQgCggEBANaTGQTexgskse3HYuDZ2CU+Ps1s6x3i/waM
qOi8qM1r03hupwqnbOYOuw+ZNVn/2T53qUPn6D1LZLjk/qLT5lbx4meoG7+yMLV4
wgRDvkxyGLhG9SEVhvA4oU6Jwr44f46+z4/Kw9oe4zDJ6pPQp8PcSvNQIg1QCAcy
4ICXF+5qBTNZ5qaU7Cyz8oSgpGbIepTYOzEJOmc3Li9kEsBubULxWBjf/gOBzAzU
RNps3cO4JFgZSAGzJWQTT7/emMkod0jb9WdqVA2BVMi7yge54kdVMxHEa5r3b97s
zI5p58ii0I54JiCUP5lyfTwE/nKZHZnfm644oLIXf6MdW2r+6R8CAQOjgfwwgfkw
HQYDVR0OBBYEFEhZAFY9JyxGrhGGBaR0GawJyowRMIHJBgNVHSMEgcEwgb6AFEhZ
AFY9JyxGrhGGBaR0GawJyowRoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJAJNurL4H8gHfMAwGA1Ud
EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHqvlozrUMRBBVEY0NqrrwFbinZa
J6cVosK0TyIUFf/azgMJWr+kLfcHCHJsIGnlw27drgQAvilFLAhLwn62oX6snb4Y
LCBOsVMR9FXYJLZW2+TcIkCRLXWG/oiVHQGo/rWuWkJgU134NDEFJCJGjDbiLCpe
+ZTWHdcwauTJ9pUbo8EvHRkU3cYfGmLaLfgn9gP+pWA7LFQNvXwBnDa6sppCccEX
31I828XzgXpJ4O+mDL1/dBd+ek8ZPUP0IgdyZm5MTYPhvVqGCHzzTy3sIeJFymwr
sBbmg2OAUNLEMO6nwmocSdN2ClirfxqCzJOLSDE4QyS9BAH6EhY6UFcOaE0=
-----END CERTIFICATE-----

pem文件是openSSL生成的.但是跟keystore如何转换,不知道啊...

=============================================

新问题,签名一个68.2MB的apk,遇到的问题:

C:\>jarsigner  -verbose -sigalg SHA1withDSA -digestalg SHA1  -keystore .keystore -storep
ass %PASSWORD% "test_unsignedk.apk" %ALIAS%
jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expecte
d 35608 but got 35781 bytes) C:\>

我看了一下,在apk里面的 META-INF\MANIFEST.MF 文件的大小刚刚好是35608。那么35781 又是那个获取的呢???

另外 MANIFEST.MF 文件如果缺失,也无法签名的,应该如何自动生成这个文件呢?

内容大致是:

Manifest-Version: 1.0
Created-By: 1.0 (Android) Name: assets/bin/Data/923d96261c2b64444b64f28a11275a11
SHA1-Digest: YymIJSZJWwGCNdyKcK+IbYQeXIs= Name: assets/bin/Data/b0d7c3ef6f82be742a2695674230c34e
SHA1-Digest: aUHI5vRckg5oZ4YRBtQuOn34xxo= .............
.............

使用signapk.jar 以及.pk8 .x509.pem 文件密钥 进行签名 却没有问题。

发愁啊!不知其根本,连其基本用法都搞不懂!

可以使用keystore文件,利用eclipse 工具的导出签名apk  来导出新的apk了。

最新文章

  1. some useful linux commands
  2. mysql 查询去重 distinct
  3. Android中利用ViewHolder优化自定义Adapter的典型写法
  4. POJ2112 Optimal Milking (网络流)(Dinic)
  5. Flexigrid在IE下不显示数据的处理
  6. Codeforces Round #172 (Div. 2) B. Nearest Fraction 二分
  7. 5中方式实现String反转
  8. Android Animation初识
  9. iOS开发之常用第三方框架(下载地址,使用方法,总结)
  10. C#操作Flash动画
  11. LogMaster4Net
  12. Angular Pipe的应用
  13. ord在python是什么意思?
  14. zookeeper(1)-简单介绍
  15. [转]HD钱包的助记词与密钥生成原理
  16. content-type: application/json没有设置导致的500错误
  17. C# 用 WebClient 的 Post 方法向 WebServer 传输数据
  18. 科学-天文学-天文观测站:TMT(红外天文望远镜)
  19. JavaScripts基础
  20. 【Linux】进程管理

热门文章

  1. ajax和302(转)
  2. clob字段超过4000转String类型
  3. 配置dcom时,在此计算机运行应用程序不可选
  4. C# EF Attach 与 Entry
  5. CodeForces700E Cool Slogans
  6. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E. Goods transportation 动态规划
  7. phpexcel一个bug
  8. OpenVPN选项topology subnet实现子网掩码24的子网地址扩展
  9. HDU 3976 Electric resistance (高斯消元法)
  10. Go 导入当前项目下的包