转自:http://blog.csdn.net/xiexiangyu92/article/details/73958604
1. 打包编译
主要包括两个过程:
1,编译过程,编译的内容包括本工程的文件以及依赖的各种库文件,编译的输出包括dex文件和 编译后的资源文件。
2,打包过程。配合Keystore对第一步的输出进行签名对齐,生成最终的apk文件。
具体步骤如下:
1,Java编译器对工程本身的java代码进行编译,这些java代码有三个来源:app的源代码,由资源文件生成的R文件(aapt工具),以及有aidl文件生成的java接口文件(aidl工具)。产出为.class文件。
2,.class文件和依赖的三方库文件通过dex工具生成Delvik虚拟机可执行的.dex文件,可能有一个或多个,包含了所有的class信息,包括项目自身的class和依赖的class。产出为.dex文件。
3,apkbuilder工具将.dex文件和编译后的资源文件生成未经签名对齐的apk文件。这里编译后的资源文件包括两部分,一是由aapt编译产生的编译后的资源文件,二是依赖的三方库里的资源文件。产出为未经签名的.apk文件。
4,分别由Jarsigner和zipalign对apk文件进行签名和对齐,生成最终的apk文件。
总结为:编译-->DEX-->打包-->签名和对齐
2. Android 签名与对齐相关知识详解
1 什么是Android 应用的签名
–Android 要求所有 APK 必须先使用证书进行数字签署,然后才能安装。在签署 APK 时,签署工具会将公钥证书附加到 APK。公钥证书充当“指纹”,用于将 APK 唯一关联到对应私钥。这有助于 Android 确保您 APK 的任何将来更新都是原版更新并来自原始作者。
简而言之,签名机制可以让系统知道当前apk的作者是谁。
2 IDE自动签名
从 IDE 中运行或调试项目时,Android Studio 将自动使用通过 Android SDK 工具生成的调试证书签署 APK。当您在 Android Studio 中首次运行或调试项目时,IDE 将自动在
$HOME/.android/debug.keystore 中创建调试密钥库和证书,并设置密钥库和密钥密码。
3 自定义签名
使用 Android Studio 生成应用签名或上传密钥,步骤如下:
在菜单栏中,点击 Build > Generate Signed APK。
从下拉菜单中选择一个模块,然后点击 Next。
点击 Create new 以创建一个新密钥和密钥库。
在 New Key Store 窗口上,为您的密钥库和密钥提供所需信息
密钥库
Key store path:选择创建密钥库的位置。
Password:为您的密钥库创建并确认一个安全的密码。
密钥
Alias:为您的密钥输入一个标识名。
Password:为您的密钥创建并确认一个安全的密码。此密码应当与您为密钥库选择的密码不同
Validity (years):以年为单位设置密钥的有效时长。密钥的有效期应至少为 25 年,以便您可以在应用的整个生命期内使用相同的密钥签署应用更新。
Certificate:为证书输入一些关于您自己的信息。此信息不会显示在应用中,但会作为 APK 的一部分包含在您的证书中。
填写完表单后,请点击 OK。
4 自动签署您的 APK
在 Project 窗口中,右键点击您的应用并点击 Open Module Settings。
在 Project Structure 窗口左面板中的 Modules 下,点击您想要签署的模块。
点击 Signing 标签,然后点击 Add。 。
选择您的密钥库文件,为此签署配置输入一个名称(因为您可能创建多个配置),然后输入所需的信息。
点击 Build Types 标签。
点击 release 构建。
在 Signing Config 下,选择您刚创建的签署配置。
5 优化apk包大小:对齐
zipalign 可以确保所有未压缩的数据的开头均相对于文件开头部分执行特定的字节对齐,这样可减少应用消耗的 RAM 量。
Zipalign对apk文件中未压缩的数据在4个字节边界上对齐,当资源文件通过内存映射对齐到4字节边 界时,访问资源文件的代码才是有效率的。4字节对齐后,android系统就可以通过调用mmap函数读取文件,进程可以像读写内存一样对普通文件的操 作,系统共享内存IPC,以在读取资源上获得较高的性能。 如果资源本身没有进行对齐处理,它就必须显式地读取它们——这个过程将会比较缓慢且会花费额外的内存。
在4个字节边界上对齐的意思就是指编译器吧4个字节作为一个单位来进行读取的结果,这样的话,CPU能够对变量进行高效、快速的访问(较之前不对齐)。