android Apk打包过程概述

来源:互联网 发布:射频版图设计软件 编辑:程序博客网 时间:2024/04/27 05:14

使用ant命令行打包android应用程序

首先我们来了解一下android打包到底做了哪些事?
(1)打包资源文件,生成R.java文件
(2)处理aidl文件,生成相应java 文件
(3)编译所有java文件,生成相应class 文件
(4)打包class文件和jar包,生成classes.dex文件
(5)打包assets和res资源,生成资源压缩包(例如res.zip,名字可以自己定义);
(6) 组合classes.dex和res.zip,生成未签名的APK;
(7)生成有签名的APK;
(8)对签名包进行zipalign优化;

用一句话说就是先把java文件编译成class文件,再将class文件和所依赖的jar打包成classes.dex文件,然后再打包aaset和res文件等资源文件resource.zip,再把dex和zip文件合并为未签名apk,最后进行签名,这就完成整个打包等过程。
这里写图片描述

那我们就一步一步来吧。

准备工作:我们新建一个eclipse工程,代码很简单,做一行显示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" /></RelativeLayout>

我们在桌面新建Ant文件夹,里面再新建文件夹gen和bin,供后续使用。

  • 打包资源文件,生成R.java文件

这里要使用android官方提供的aapt工具,生成R.java文件,这个工具存于/SDK/build-tools下,因此需要配置好环境变量。
先cd到该项目根目录下(注意别忘),命令行输入如下命令:

aapt package -f -m -J C:\Users\huanxuan\Desktop\ant\gen -S res -M AndroidManifest.xml -I D:\sdk\platforms\android-24\android.jar  

参数含义:
-f 如果编译生成的文件已经存在,强制覆盖。
-m 使生成的包的目录存放在-J参数指定的目录
-J 指定生成的R.java 的输出目录路径(存放在桌面的gen)
-S 指定res文件夹的路径
-I 指定某个版本平台的android.jar文件的路径(我使用的是API-24)

会在桌面Ant/gen目录下生成R.java文件:
这里写图片描述

  • 编译所有java文件,生成相应class 文件

我这里没有编写aidl文件,所以省去上面第二步。如果需要可以参考[Android]aidl命令这篇文章。
编译所有java文件为class文件(包括刚刚生成的R.java文件和src下的*.java文件);我们将使用javac命令进行编译(我使用的java版本是jdk1.7):

在命令行输入:

javac -source 1.7 -target 1.7 -bootclasspath D:\sdk\platforms\android-24\android.jar -d C:\Users\huanxuan\Desktop\ant\bin src\com\hx\test\*.java C:\Users\huanxuan\Desktop\ant\gen\com\hx\test\R.java 

参数含义:
-target <\jdk版本> 生成特定 jdk 版本的类文件
-bootclasspath <路径> 覆盖引导类文件的位置
-d <目录> 指定存放生成的类文件的位置
-sourcepath <路径> 指定查找输入源文件的位置(这里包含两个地方一个是src,一个是桌面gen生成的R.java)

会在桌面bin目录下生成如下文件:
这里写图片描述

  • 打包class文件和jar包,生成classes.dex文件

主要使用到android官方提供的构建工具dx ,存在于/SDK/build-tools目录下(记得配置该路径的环境变量哈);
在命令行输如下命令:

dx --dex --output=C:\Users\huanxuan\Desktop\ant\bin\classes.dex C:\Users\huanxuan\Desktop\ant\bin

参数含义:
–output=<要生成的classes.dex路径> <要处理的class文件的路径>
这里我存放classes.dex文件的路径跟要处理文件是一样的。

会在桌面Ant/bin目录下生成class.dex文件:
这里写图片描述

  • 打包assets和res资源,生成资源压缩包

这个还是要使用android官方提供的aapt工具,命令如下:

aapt package -f -M AndroidManifest.xml -S res -I D:\sdk\platforms\android-24\android.jar -A assets -F C:\Users\huanxuan\Desktop\ant\bin\res.zip

参数含义:
-f 如果编译生成的文件已经存在,强制覆盖
-m 使生成的包的目录存放在-J参数指定的目录
-S 指定res文件夹的路径
-I 指定某个版本平台的android.jar文件的路径
-A 指定assert文件夹的路径
-F 指定输出文件完整路径

会在桌面Ant/bin目录下生成res.zip文件:
这里写图片描述

  • 组合classes.dex和res.zip生成未签名的APK

这里主要使用apkbuilder脚本,其实是个批处理文件,不过android 3.0后已经被删除,但网上还是可以找到这个脚本的,下载地址,直接拷贝放到/SDK/tools下即可(添加环境变量)。

apkbuilder C:\Users\huanxuan\Desktop\ant\bin\Ant.apk -v -u -z C:\Users\huanxuan\Desktop\ant\bin\res.zip -f C:\Users\huanxuan\Desktop\ant\bin\classes.dex    

参数含义:
第一个参数是存放打包后的文件完整路径
-v Verbose 显示过程信息
-u 创建一个无签名的包
-z 指定apk资源路径
-f 指定dex文件路径

运行成功,会在桌面Ant/bin目录下生成未签名的Ant.apk文件:
这里写图片描述

  • 生成有签名的APK

上面生成的APK还不能立即安装,会提示APK未签名,所以我们需要使用签名工具对其进行签名。 这里主要使用jarsigner脚本。

将keystore和刚才生成的未签名的APK文件放在同一目录下,使用命令行进行签名。关于keystore的生成可以参考Android APK的反编译和重新打包这篇文章。

jarsigner -verbose -keystore eastday_sign.keystore -storepass eastday100 -signedjar Ant_signed.apk Ant.apk eastday

参数含义:
-verbose 签名/验证时输出详细信息
-keystore 密钥库路径
-storepass 用于密钥库完整性的口令(密码)
-keypass 专用密钥的口令(密码)
-signedjar 已签名的 apk 文件的名称 (第一个apk是签名之后的文件, 第二个apk是需要签名的文件)
最后是keystore 的“别名”(也就是alias),一定要保证正确。

会在桌面Ant/bin目录下生成签名后的Ant_signed.apk文件:
这里写图片描述

  • 对签名包进行zipalign优化

zipalign是一种文档对齐工具,主要用于优化android应用程序即apk,使用zipalign的主要目的是确保apk安装包中所有未进行数据压缩的文档文件可以从一个特定的相对位置开始读取。需要特别说明的是,它将会导致apk中所有未压缩的数据,例如图片资源,raw文件等被进行4字节对齐的优化。这将允许所有被分配的内存数据可以用mmap()直接访问,即使这些数据包含二进制数据的限制。这样做的益处是可以减少应用运行时所占用的内存大小。
我们使用android studio进行gradle签名打包时,as会自动帮我们完成zipalign优化操作。
zipalign优化一定要在签名后进行,如果在我们在签名前,进行zipalign优化的话,当我们再次进行签名时,zipalign优化将会被破坏。

对齐操作使用的是zipalign工具,该工具存放于<\Android SDK>/build-tools/目录下,配置环境变量。

zipalign -f -v 4 Ant_signed.apk Ant_aligned.apk

参数含义:
-f 如果文件已经存在,强制覆盖
-v 输出详细信息
- 需要zipalign优化的apk,优化后的apk名称以及存放位置

压缩对齐成功,在相同目录下会生成对齐后的APK文件。
这里写图片描述

注:我们还可以使用以下命令进行zipalign优化检测,如果没进行过zipalign优化的apk将会认证失败。

zipalign -c -v 4 Ant_aligned.apk

参数含义:
-c 表示进行zipalign优化检测
-v 输出过程信息

原创粉丝点击