android的编译和运行过程深入分析

辛远的海角

辛远的海角

2016-02-19 11:20

今天图老师小编给大家介绍下android的编译和运行过程深入分析,平时喜欢android的编译和运行过程深入分析的朋友赶紧收藏起来吧!记得点赞哦~

首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,示意图如下,其中包含编译、链接和签名等:

(1)使用aapt工具生成R.java文件

可以先通过搭建好的Eclipse开发环境创建一个未编译的Android工程,记的一定要将Eclipse中Project菜单下的Build Automatically选项前面的对勾去掉后再去创建工程。创建好未编译的工程后,在命令行中输入如下命令:

d:android-sdk-windowsplatform-toolsaapt package -f -m -M "C:Documents and Settings******workspaceHelloAndroid3AndroidManifest.xml" -J "C:Documents and Settings******workspaceHelloAndroid3gen" -S "C:Documents and Settings******workspaceHelloAndroid3res" -I "D:android-sdk-windowsplatformsandroid-10android.jar"

其中-M及紧跟其后的参数是用于指定AndroidManifest.xml(配置文件)的路径,-J及紧跟其后的参数是指定R.java生成路径,-S及后面参数是指定资源文件所在目录,-I及后面参数是指定要包含的Android平台类库;运行后会在工程目录中的gen目录下生成R.java文件。aapt的具体用法可在命令行输入aapt后会看到。

R.java文件的作用是提供给程序访问资源的入口,更详细的内容请参见后面关于Android工程的文件结构和详解的博文。

(2)使用aidl工具将.aidl文件编译成.java文件

AIDL是Android系统提供的一种进程间调用的方式,类似于IPC调用,通过aidl工具将使用Android Interface Definition Language描述的.aidl文件编译成包含java接口类的.java文件,然后进程间遵循这些接口进行相互调用。.aidl文件一般与程序源码文件存放在一起。对于该例子中自动创建的工程来说,没有用到AIDL,所以不进行这一步。aidl工具的用法如下:

usage: aidl OPTIONS INPUT [OUTPUT]
       aidl --preprocess OUTPUT INPUT...

OPTIONS:
   -IDIR    search path for import statements.
   -dFILE   generate dependency file.
   -pFILE   file created by --preprocess to import.
   -oFOLDER base output folder for generated files.
   -b         fail when trying to compile a parcelable.

INPUT:
   An aidl interface file.

OUTPUT:
   The generated interface files.
   If omitted and the -o option is not used, the input filename is used, with the .aidl extension changed to a .java extension.
   If the -o option is used, the generated files will be placed in the base output folder, under their package folder

(3)使用javac工具将.java文件编译成.class文件

d:Javajdk1.6.0_25binjavac -encoding GB18030 -target 1.6 -bootclasspath "D:android-sdk-windowsplatformsandroid-10android.jar" -d "C:Documents and Settings******workspaceHelloAndroid3bin" "C:Documents and Settings******workspaceHelloAndroid3srccom******HelloAndroid3HelloAndroid3.java" "C:Documents and Settings******workspaceHelloAndroid3gencom******HelloAndroid3R.java"

期间,我本来想使用*.java来描述需要编译的源码文件,但提示找不到,后来将源码文件指定为具体的HelloAndroid3.java文件后才编译通过,奇怪。

随后会在工程目录下的bin目录下生成.class文件。

(4)使用dx.bat批处理将众多.class文件转换成一个.dex文件

D:android-sdk-windowsplatform-toolsdx --dex --output=c:docume~1******workspaceHelloAndroid3binclasses.dexc:docume~1******workspaceHelloAndroid3bin

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

--output及后面的路径指明.dex文件的生成路径;红色标注的路径为.class所在的路径,需要注意的是,这里不能加上包路径,否则会报不匹配的错误,可能在批处理中已将添加包路径。另外,如遇windows系统路径含有空格的话一律使用缩写形式,具体有哪些系统路径及其缩写是什么,还是问度娘吧。成功后便在指定路径下生成了.dex文件。.dex文件是在Android的Dalvik虚拟机上运行的,具体内容后面的运行原理会提到。

(5)使用aapt工具打包资源文件

D:android-sdk-windowsplatform-toolsaapt package -f -M C:Docume~1******workspaceHelloAndroid3AndroidManifest.xml -S C:Docume~1******workspaceHelloAndroid3res -A C:Docume~1******workspaceHelloAndroid3assets -I D:android-sdk-windowsplatformsandroid-10android.jar -F C:Docume~1******workspaceHelloAndroid3binresources.ap_

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

对照R.java文件的生成,可以看到参数发生了变化,少了-m 和 -J,如果看aapt用法中的描述就知道,-m和-J是结对出现的,用以指明R.java文件的生成路径。-M、-S、-I之前都有提到,这里不再介绍。-F的作用是指明打包后的资源文件的路径,在最后一定要加上文件名,最好加上扩展名。这里参考Eclipse中自动编译时制定的.ap_后缀名。

(6)使用apkbuilder生成未签名的apk安装文件

D:android-sdk-windowstoolsapkbuilder C:Docume~1******workspaceHelloAndroid3binHelloAndroid3.apk -v -u -z C:Docume~1******workspaceHelloAndroid3binresources.ap_ -f C:Docume~1******workspaceHelloAndroid3binclasses.dex -rf C:Docume~1******workspaceHelloAndroid3src

其中,apkbuilder后面紧跟的路径是生成的apk安装文件的路径,-v参数的作用是指明执行中输出必要信息,具体输出内容如下:

Packaging HelloAndroid3.apk
C:Docume~1******workspaceHelloAndroid3binresources.ap_:
= res/layout/main.xml
= AndroidManifest.xml
= resources.arsc
= res/drawable-hdpi/icon.png
= res/drawable-ldpi/icon.png
= res/drawable-mdpi/icon.png
C:Docume~1******workspaceHelloAndroid3binclasses.dex = classes.dex

-u参数表示生成的是未签名的安装包,-z及后面的路径表明打包了的资源文件的路径,-f及后面的路径指明了.dex文件的路径,-rf指明了源文件的目录。

(7)使用jdk中的jarsigner对apk安装文件进行签名

签名的目的是保证应用程序的开发者的唯一性,签名需要的东西除了jarsigner工具外还有密钥文件,即.keystore文件,我们这里不产生自己的keystore文件,而是采用Android SDK提供的Debug.keystore文件,其位置是在“我的文档”下的.android目录下。签名的原理及密钥文件的产生等内容在后续的博文中补充。

D:Javajdk1.6.0_25binjarsigner -keystore C:Docume~1******.androiddebug.keystore -storepass android -keypass android -signedjar C:Docume~1******workspaceHelloAndroid3binHello3.apk C:Docume~1******workspaceHelloAndroid3binHelloAndroid3.apk androiddebugkey

-keystore及后面的路径指明密钥文件的位置,-storepass是用于密钥库完整性的口令,-keypass是专用密钥的口令,-signedjar及后面的路径指明签完名的apk文件的路径,紧接着的是需要签名的apk的路径,最后面是密钥的别名。debug.keystore的name和passwords信息是在SDK文档中找到的,具体内容如下:

The SDK tools create the debug keystore/key with predetermined names/passwords:

Keystore name: "debug.keystore" Keystore password: "android" Key alias: "androiddebugkey" Key password: "android" CN: "CN=Android Debug,O=Android,C=US"
展开更多 50%)
分享

猜你喜欢

android的编译和运行过程深入分析

编程语言 网络编程
android的编译和运行过程深入分析

android生命周期深入分析(一)

编程语言 网络编程
android生命周期深入分析(一)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

android生命周期深入分析(二)

编程语言 网络编程
android生命周期深入分析(二)

SQL Server储过程加密和解密原理深入分析

编程语言 网络编程
SQL Server储过程加密和解密原理深入分析

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

java中子类继承父类,程序运行顺序的深入分析

编程语言 网络编程
java中子类继承父类,程序运行顺序的深入分析

深入分析java文件路径的详解

编程语言 网络编程
深入分析java文件路径的详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

android导入第三方jar包报错 如何正确导入jar包

android导入第三方jar包报错 如何正确导入jar包

如何实现在硬盘上引导WinPE

如何实现在硬盘上引导WinPE
下拉加载更多内容 ↓