Android手动打包

概述

在日常开发过程中,我们经常需要打包。现在的开发平台都已经集成了打包的功能或插件,可以很容易的打包。但是我们并不清楚其中的具体原理和过程,所以有必要理解打包的过程,以便加强对安卓应用的认识和理解。
手动打包主要是利用安卓提供的aapt工具和jdk命令,将资源压缩的成一个apk文件的过程。aapt工具在android-sdk/build-tools/相应版本/目录下面。为了方便,可以将该路径添加到环境变量里面。
通过aapt工具打包,主要经过以下几个过程:
首先利用android studio创建一个演示项目HelloWrold。该项目仅包括一个MainActivity.java及其它一些资源文件。

1、利用aapt命令生成R.java文件

我们知道,android程序中是通过资源索引文件来找到资源文件的。所以我们首先必须生成R文件。而R文件则是通过aapt(Android Asset Package Tool)命令生成的。aapt的命令内容非常丰富,其中aapt打包相关命令如下:

图1

图1 aapt打包命令

根据aapt的命令说明,利用如下命令产生R.java文件

图2

图2 生成R文件

其中,-f 使强制覆盖已有文件,-m 使在-J所指定的目录下以包名创建文件夹,-S 指定资源所在的路径,有多个资源目录可以使用多个-S参数,-M 指定AndroidManifest.xml文件路径,-I 指定android.jar系统文件。需要注意的是,R文件所指定的存放位置gen是需要手动创建的,否则会报Unable to open class file R.java : No such file or directory 错误。
成功运行命令后,在项目根目录的gen目录下,已经成功创建了R文件,如下图:

图3

图3 R文件

扫描二维码关注公众号,回复: 4884816 查看本文章

2、利用javac命令生成class文件

使用如下命令,将java源文件编译成class文件

图4

图4 编译java文件

其中,-bootclasspath指定编译需要的系统类文件,-d 指定编译后class文件存放位置。需要注意的是,同gen目录一样,bin目录也需要手动创建。
成功运行后,可以看到java文件已经被编译为class文件,如下图:

图5

图5 生成class文件

3、将class文件打成jar包

生成class文件后,使用如下命令将class文件打成jar包:

图6

图6 将class文件打成jar包

成功执行后,就可以在bin目录下看到helloworld.jar文件,如下图:

图7

图7 生成的jar文件

4、生成dex文件

生成了jar文件后,需要将其转化为android虚拟机可以识别的dex文件。利用如下命令将jar转化为dex文件:

图8

图8 生成dex文件

成功运行后会在bin目录生成classes.dex文件。

图9

图9 dex文件

在此过程中需要注意的是,如果之前的jdk版本过高,可能会出现Dx bad class file magic (cafebabe) or version (0033.0000)错误。

5、将资源打包

生成apk之前,还需要将资源都整合到一个文件里。例用如下的aapt命令将资源打包:

图10

图10 打包资源

其中resource.ap_为指定的打包后文件名。成功运行后,在bin目录下就可以看到resource.ap_文件。

6、生成未签名apk文件

最后将dex文件和资源文件生成apk文件,使用如下命令:

图11

图11 生成未签名apk

其中com.android.sdklib.build.ApkBuilderMain是sdklib.jar文件中的类文件。-v -u -z均是ApkBuilderMain的参数。在项目目录下,可以看到已经生成了相应的apk文件了。此时,该apk文件是未经过签名的。所以该程序是无法在设备上安装并运行的。尝试安装该未签名的apk文件时会报没有认证的错误。

7、手动为apk签名

首先,利用keytool工具生成私钥,如图:

图12

图12 通过keytool生成私钥

在运行keytool后,系统会要求输入一连串的相关信息来创建私钥,如上图。最后会在制定的目录产生相应的 *.keystore文件。

有了keystore文件,便可以对apk进行签名了。用如下命令完成对apk的签名:

这里写图片描述

图13 对apk进行签名

完成了对apk的签名后,可以利用如下命令对其是否签名进行验证:

图14

图14 验证签名

该命令会输出相关已认证信息和证书有效时间警告。

8、优化apk文件

最后对已经签名的apk文件进行zipaligin优化,如下:

图15

图15 对apk进行align优化

从图中可以看到,该命令对apk进行了压缩和优化。最后,将生成的apk文件安装到设备。如下图

这里写图片描述

图16 运行已签名和优化过的apk

以上即是打包的主要流程。摘取一张谷歌官网的打包流程图概括整个流程,如下:

图17

图17 打包流程

总结

1.打包的主要过程为,将生成的R文件,dex文件,资源文件,整体打包成apk安装文件,最后再签名和优化。
2.手工打包时需要特别注意各个工具的版本问题。例如android-19版本的aapt无法识别mipmap-xxxdpi文件夹。
3.此次只利用较简单的项目实践。尝试加入library时打包还未成功,还有一些问题需要克服。

猜你喜欢

转载自blog.csdn.net/honeysx/article/details/50865975