Android的编译、打包流程以及手动打包编译的方法

来源:互联网 发布:软件分发平台 编辑:程序博客网 时间:2024/05/21 05:58


一、Android的编译
Android使用dalvik虚拟机,java的bytecode不能直接使用,编译后的java字节码需要使用dx工具转换成dalvik虚拟机用的字节码(扩展名dex)。

手动编译分为两个步骤
首先将java源码,编译成字节码。
javac -encoding UTF8 -target 1.5 -bootclasspath %ANDROID_SDK_HOME%\platforms\android-9\android.jar -d bin src\com\lsn\test\*.java gen\com\t4game\test\*.java

javac:java的编译命令
-encoding UTF8 这个参数指定了所要编译的java源码的编码类型,这里使用UTF8
-target 1.5 这个参数指定了所要编译的java源码在编译后使用的jre的版本,Android使用java 1.5的便准 所以这里一定要写1.5
-bootclasspath 这个参数指定了类加载器,如果不写这个参数,java会使用默认的类加载器(这里会产生错误),这里我们制定android sdk下面的android.jar文件作为类加载器
-d bin 这个参数指定了输出方式和输出目录,-d表示编译后按包名创建目录存放各个源码,并且指定输出路径为当前路径下的bin
后面的两个参数指定了源码的路径,注意这里我们要把源码和android sdk自动生成的资源索引文件R.java以及转换过的AIDL文件(如果有)一并包含进来


如果没有错误应该不会有任何提示,完成后bin文件夹就会出现相应的java字节码文件(class)

接下来我们要使用编译后的字节码文件生成dalvik字节码文件
dx --dex --output=e:\test\bin\test.dex e:\test\bin\
--dex 第一个参数告诉命令 我们要做有java字节码转换成dalvik虚拟机字节码的工作
--output 第二个参数指定了 我们的输出位置,dalvik字节码会议dex扩展名结尾 (不知为什么 这里必须要指定绝对路径)
e:\test\bin\第三个参数指定了 所愿转换的java字节码的位置(不知为什么 这里必须要指定绝对路径)


(这里我们还需要说明一下,如何手动生成R.java文件)
在Eclipse中,插件会自动帮我们生成R.java文件。我们每次更改res目录下的内容,ADT都会帮我们做这项工作。
我们也是可以通过命令行手动完成这一工作的

aapt package -f -m -S res -J gen -I %ANDROID_SDK_HOME%\platforms\android-9\android.jar -M AndroidManifest.xml

aapt这是一个android sdk自带的工具 专门用于打包资源使用
package 参数表示我们要打包
-f 强制覆盖原来的档案,如果我们原来已经生成了R.java 加入这个参数会重新覆盖
-m 这个参数将告诉aapt我们资源包的输出路径将和-J参数指定的R.java路径保持一致
-S 指定我们RES资源的位置(注意这是大写的小写无效)
-J 指定我们GEN目录的位置,也就是生成R.java文件的输出位置
-I 指定android基础包的位置(这里还是使用android sdk的android.jar)
-M 指定该工程的manifest

如果没有错误不会收到任何提示,如果我们收到提示找不到目录,这里我们如果是第一次创建gen目录可能会不存在 
我们要手动创建gen
md gen\com\lsn\test



二、Android的打包
Android应用的安装包称作apk文件,事实上他是一个标准的ZIP压缩文件。我们可以使用任何支持ZIP压缩的工具打开它
它里面包含了资源文件(一般叫resources.arsc)和程序文件dex,前面的内容中程序文件我们已经转换过了。下面我们要说明一下如何打包资源

Android的资源文件分为两种

Res 这部分资源文件是APP直接用到的,如图片、布局、动画、样式等。这些资源内容在打包前是被预编译过的,比如xml会被编译成binary xml,图片会根据配置自动调整大小
Assets 这部分资源在打包的时候会原封不动的直接拷贝进去包,比较适合自定义资源,或者较大的资源。


aapt package -f -m -S res -A assets -J gen -I %ANDROID_SDK_HOME%\platforms\android-9\android.jar -M AndroidManifest.xml -F bin\resources.arsc
前面编译的时候我已经解释过这个命令,这里不赘。需要说明一下的是 -A参数用来指定assets所在目录 如果没有可以不指定

如果没有错误我们会在bin文件夹下看到 resources.arsc

资源和程序文件我们都有了 现在可以打包apk了

apkbuilder  ${output.apk.file} -u -z  ${packagedresource.file} -f  ${dex.file}  -rf  ${source.dir}  -rj  ${libraries.dir} 

最后还没有完成,打包好的apk不能直接安装到手机上,因为我们还没有签名

jarsigner  -keystore ${keystore} -storepass  ${keystore.password} -keypass ${keypass} -signedjar ${signed.apkfile} ${unsigned.apkfile} ${keyalias}


三、打包编译的自动化步骤


以上我们讲解编译打包的过程只是让大家了解,事实上android sdk在生成一个工程的时候已经给我们提供了ANT脚本build.xml 我们只要运行这个脚本就可以自动完成上面编译打包的工作

进入工程目录 ANT就可以了(前提是你把ANT的bin目录添加进了path环境变量,这里不会自己百度吧、前面的所有的android sdk命令也都需要配置环境变量)

下面说明一下ANT脚本的所做的工作

1使用aapt生成R.java类文件: 


2使用android SDK提供的aidl.exe把.aidl转成.java文件: 
 
3第三步 编译.java类文件生成class文件: 


4使用android SDK提供的dx.bat命令行脚本生成classes.dex文件:


5使用Android SDK提供的aapt.exe生成资源包文件(包括res、assets、androidmanifest.xml等): 


6第六步 生成未签名的apk安装文件: 


7使用jdk的jarsigner对未签名的包进行apk签名: use jarsigner 
jarsigner  -keystore ${keystore} -storepass  ${keystore.password} -keypass ${keypass} -signedjar ${signed.apkfile} ${unsigned.apkfile} ${keyalias}


参考:http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/ 




四、关于ANT

Ant是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make ,但没有make的缺陷。目前的最新版本为:Ant 1.8.2。

Android也是用ANT连编译打包
想了解的百度传送门http://baike.baidu.com/view/42824.htm#3

五、ANDROID SDK的一些其他控制台实用工具


创建一个工程
android create project --package com.lsn.android --name test --target 9 --path e:\test --activity main


更新一个工程
android update project --path e:\test --target 9
原创粉丝点击