深入android源码---apk生成过程综述

来源:互联网 发布:剩余windows重置计数2 编辑:程序博客网 时间:2024/06/06 14:29

Apk生成过程包括apk的打包编译最终生成apk包的过程

一、apk打包

1.Apk打包有两种方式,Eclipse或者ant,不管哪一种都包含下面七个步骤

 

第一步:编译打包资源文件

其实就是编译xml文件和编译资源生成resources.arsc文件,然后把res文件,这三样一起弄成压缩包

使用工具appt位于android-sdk\platform-tools目录下,源码在Android系统源码目录的frameworks\base\tools\appt

Resource.cppbuildResources()检测AndroidManifest.xml的合法性

makeFileResource()res目录下的资源子目录进行资源文件名合法性检测。向资源table添加条目

ResourceTable.cppcompileResourceFile()函数编译resasserts目录下的资源生成resource.arsc文件

parseAndAddEntry()函数生成R.java文件,

compileXmlFile()函数对res目录下的xml文件分别进行编译

最后将所有的资源与编译生成的resource.arsc文件以及加密过得androidManifest.xml文件压缩成resource.ap_ 

 

 

第二步:处理aidl文件,生成相应的Java文件。

aidl位于android-sdk/platform-tools目录下,源码位于android源码的frameworks\base\tools\aidl目录下。

 

 

第三步:编译工程源码生成相应的class文件

 

第四步:转换所有的class文件,生成classes.dex文件

使用android-sdk\platform-tools目录下的dx

 

 

 

第五步:打包生成apk文件

打包工具为apkbuilder,位于android-sdk\tools目录下,apkbuilder为一个脚本文件

第六步:apk文件进行签名

调试时eclipse使用debug,keystore,我们打包发布用jdkjarsigner工具,或者android源码中的

Build\tools\signapk工具

 

第七步:使用zipalign工具对签名后的APK文件进行对齐处理。

Zipalign工具位于android-sdk\tools目录,源码位于Android系统源码的build\tools\zipalign目录

 

 

2.Apk的打包过程流程图

 

3.打包过程中用到的工具

名称

功能介绍

在操作系统中的路径

aapt

Android资源打包工具

${ANDROID_SDK_HOME}/platform-tools/appt

aidl

Android接口描述语言转化为.java文件的工具

${ANDROID_SDK_HOME}/platform-tools/aidl

javac

Java Compiler

${JDK_HOME}/javac/usr/bin/javac

dex

转化.class文件为Davik VM能识别的.dex文件

${ANDROID_SDK_HOME}/platform-tools/dx

apkbuilder

生成apk

${ANDROID_SDK_HOME}/tools/opkbuilder

jarsigner

.jar文件的签名工具

${JDK_HOME}/jarsigner/usr/bin/jarsigner

zipalign

字节码对齐工具

${ANDROID_SDK_HOME}/tools/zipalign

 

4.手动实现编译和打包

Win7环境首选创建工程

使用eclipse新建一个工程handpackTest

android create project -n HandPackTest -t 1 -k com.snowtest -a HandPackTest -p ./HandPackTest

 

1、使用aapt命令编译资源文件

[1] HandPackTest目录新建gen然后cdHandPackTest目录输入下面命令

aapt package -f -m -J gen -S res -I D:/run_ProgramFile/android_sdk_new/platforms/android-19/android.jar -M AndroidManifest.xml

这里的命令参数有点多就不全部介绍了,就说明几个:

-J 后面跟着是gen目录,也就是编译之后产生的R类,存放的资源Id

-S 后面跟着是res目录,也就是需要编译的资源目录

-l 后面跟着是系统的库,因为我们在项目资源中会用到系统的一些资源文件,所以这里需要链接一下

-M 后面跟着是工程的清单文件,需要从这个文件中得到应用的包名,然后产生对应的R文件和包名。

生成文件:将多出一个文件HandPackTest\gen\com\snowtest\R.java

 

 

[2]HandPackTest目录新建assets目录然后cdHandPackTest目录输入下面命令

 

使用aapt命令生成资源包文件(编码AndroidManifest.xml,resource.arsc)

aapt package -f -A assets -S res -I D:/run_ProgramFile/android_sdk_new/platforms/android-19/android.jar -M AndroidManifest.xml -F bin/handpackTest

生成文件:/bin/handpackTest其实此文件是resAndroidManifest.xmlresources.arsc的编译后的压缩文件,可以用好压解压

 

这个命令其实就是将资源文件进行编码成二进制文件,我们之前介绍的一篇文章中,就是解析这些二进制文件:

这些二进制文件都是有自己的格式的,系统编程二进制文件是为了优化,减小包的大小。

但是这里需要注意的是assets目录是不会进行二进制编译的。

 

2、此工程不存在,省去

 

3.使用javac命令编译源文件

javac -target 1.7 -bootclasspath D:/run_ProgramFile/android_sdk_new/platforms/android-19/android.jar -d bin gen\com\snowtest\*.java src\com\snowtest\*.java

 

-target:表示编译之后的class文件运行的环境版本

-bootclasspath:表示编译需要用到的系统库

-d:表示编译之后的class文件存放的目录 这里需要把gen下和src下面的java都编译了。

 

生成文件:\bin\com\snowtest目录大量的文件

 

4.使用dx命令,将class文件转化成dex

D:\run_ProgramFile\android_sdk_new\build-tools\19.0.0\dx --dex --output=bin/classes.dex bin

生成文件:\bin目录下生成classes.dex文件

 

5.使用apkbuilder命令来编译

apkbuilderandroid sdk build tools r22里面被移除了,发现其实是调用androidsdk根目录/tools/lib/sdklib.jar这个jar

解决办法windows

\android_sdk_new\tools\android.bat文件复制一份改名为apkbuilder.bat

然后修改apkbuilder.bat里面的com.android.sdkmanager.Main com.android.sdklib.build.ApkBuilderMain就可以了

 

apkbuilder E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/bin/handpackTest.apk -v -u -z E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/bin/handpackTest -f E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/bin/classes.dex -rf E:/apk从启动到运行全解/1.apk生成过程/HandPackTest/src

生成文件:\bin目录下生成handpackTest.apk文件

 

 

6.使用keytool来产生一个keystore文件

Keytooljdk目录

keytool -genkey -keystore snowtest.keystore -keyalg RSA -validity 10000 -alias snowtest.keystore

 

 

回车之后会要求输入密码和各种信心最后生成一个snowtest.keystore文件

-genkey    产生证书文件

-keystore  指定密钥库的.keystore文件中

-keyalg     指定密钥的算法

 

-validity    为证书有效天数,这里我们写的是10000天。

-alias       产生别名

 

7.使用jarsigner签名apk文件

jarsigner -verbose -keystore snowtest.keystore -signedjar handpackTest_signed.apk handpackTest.apk snowtest.keystore

 

以上命令的说明:

-verbose:指定生成详细输出

-keystore:指定数字证书存储路径

-signedjar:该选项的三个参数为  签名后的apk包  未签名的apk包  数字证书别名

注意有效期哦。

 

参考: android软件安全与逆向分析

 

 

0 0