Android应用程序的编译流程及使用Ant编译项目的攻略

作者:阳光岛主 时间:2022-09-18 18:22:16 

Android 工程构建的持续集成,需要搭建一套编译和打包自动化流程,比如建立每日构建系统、自动生成发布文件等等。这些都需要我们对Android工程的编译和打包有一个比较深入的理解,例如知道它的每一步都做了什么,需要什么环境和工具,输入和输出是什么,等等。

首先,假定你的系统(Windows、Linux、Mac OS都行,本文默认使用Linux系统来举例子,但在 Windows中几乎没有什么差别)已经安装了JDK和Android SDK。
我们重点关心的是:
    (1)这个过程的输入是什么?
    (2)这个过程的输出是什么?
    (3)这个过程使用了什么工具?
至于使用什么参数,可以自己去看对应命令的帮助文件,或者在网上搜索,这不是本文的重点。

Android应用程序的编译流程及使用Ant编译项目的攻略

提前列出下列步骤中需要用到的工具,如下表:

Android应用程序的编译流程及使用Ant编译项目的攻略

第一步:打包资源文件,生成R.java文件
【输入】Resource文件(就是工程中res中的文件)、Assets文件(相当于另外一种资源,这种资源Android系统并不像对res中的文件那样优化它)、AndroidManifest.xml文件(包名就是从这里读取的,因为生成R.java文件需要包名)、Android基础类库(Android.jar文件)
【输出】打包好的资源(一般在Android工程的bin目录可以看到一个叫resources.ap_的文件就是它了)、R.java文件(在gen目录中,大家应该很熟悉了)
【工具】aapt工具,它的路径在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系统,按惯例路径应该这样写:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。

第二步:处理AIDL文件,生成对应的.java文件(当然,有很多工程没有用到AIDL,那这个过程就可以省了)
【输入】源码文件、aidl文件、framework.aidl文件
【输出】对应的.java文件
【工具】aidl工具

第三步:编译Java文件,生成对应的.class文件
【输入】源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)
【输出】.class文件
【工具】javac工具

第四步:把.class文件转化成Davik VM支持的.dex文件
【输入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件)
【输出】.dex文件
【工具】dex工具

第五步:打包生成未签名的.apk文件
【输入】打包后的资源文件、打包后类文件(.dex文件)、libs文件(包括.so文件,当然很多工程都没有这样的文件,如果你不使用C/C++开发的话)
【输出】未签名的.apk文件
【工具】apkbuilder工具

第六步:对未签名.apk文件进行签名
【输入】未签名的.apk文件
【输出】签名的.apk文件
【工具】jarsigner

第七步:对签名后的.apk文件进行对齐处理(不进行对齐处理是不能发布到Google Market的)
【输入】签名后的.apk文件
【输出】对齐后的.apk文件
【工具】zipalign工具

知道了上面这些细节后,就可以实现很多我们想实现东西了,比如:编译流程自动化,例如我们可以使用某种脚本,像Windows下的批处理,linux下的Bash,Java下的Ant,Python、Perl这样的脚本语言,甚至直接用Java、.Net这们的强类型语言也是可以的。
如果真正弄懂了上面的步骤,了解了编译打包过程的本质,你完全可以以你想要的任何方式实现它的自动化,这才是真正的“举一反三,以不变应万变”。再比如,对Android SDK的精简,大家知道现在Android SDK动辙几百兆,我们完全可以应用上面的知识,只保留必要的工具,把SDK精简到10M以下。当然,还可以做很多事情,前提是你真正弄懂了它。

使用编译工具Ant

1, 下载
这是官方下载页:
http://ant.apache.org/srcdownload.cgi
下面我的示例环境为Ubuntu系统。

2, 安装
1) 解压


tar zxvf apache-ant-1.9.0-bin.tar.gz

2) 配置环境


sudo vi /etc/profile
export ANT_HOME=/home/homer/Apache-maven/ant-1.9.0/
export PATH=$ANT_HOME/bin:$PATH
sudo source /etc/profile

3, 验证


homer@ubuntu:~$ ant -v
Apache Ant(TM) version 1.9.0 compiled on March 5 2013
Trying the default build file: build.xml
Buildfile: build.xml does not exist!
Build failed

安装完毕!


4, 创建项目
1) 列出android平台列表


android list targets

输出结果如下:

Android应用程序的编译流程及使用Ant编译项目的攻略

2) android命令创建项目
命令格式:


android create project   --target <target-id>   --name MyFirstApp   --path <path-to-workspace> MyFirstApp   --activity MainActivity   --package com.example.myfirstapp


创建 AntTest 为例,命令如下:


android create project   --target android-3   --name AntTest   --path /home/homer/workspace/AntTest   --activity MainActivity   --package com.homer.anttest


创建项目如下:

Android应用程序的编译流程及使用Ant编译项目的攻略

5, 编译项目
1) 进入项目目录


cd /home/homer/workspace/AntTest

2) 检查是否有build.xml 文件
build.xml 文件,在项目根目录下,用作ant的配置文件; 如果没有,则通过android update更新生成,命令如下:

android update project   --target android-3   --name AntTest   --path /home/homer/workspace/AntTest

3) ant 命令编译项目
在项目 AntTest 根目录下,输入编译命令:


ant debug

输出命令信息如下:

Android应用程序的编译流程及使用Ant编译项目的攻略

此时,bin目录下会生成  AntTest-debug.apk 等文件,如下图:
PPPPPPPPPPPPPPPPPPPPP5

6, 安装验证
1) 列出avd


android list avd

avd列表如下:

Android应用程序的编译流程及使用Ant编译项目的攻略

2) 启动模拟器


android-sdk-linux/tools/emulator -avd AVD-1.5

3) 安装apk


adb install bin/AntTest-debug.apk
标签:Android,编译
0
投稿

猜你喜欢

  • java复制文件和java移动文件的示例分享

    2023-09-17 08:18:06
  • Java使用ArrayList实现扑克牌的示例代码

    2021-10-29 15:17:17
  • Android实现调用摄像头拍照并存储照片

    2023-05-02 10:48:20
  • C#设计模式之Facade外观模式解决天河城购物问题示例

    2023-06-10 08:28:36
  • python和JavaScript通信

    2023-02-20 19:40:23
  • 浅谈对Java双冒号::的理解

    2023-09-20 02:19:21
  • android实现okHttp的get和post请求的简单封装与使用

    2023-10-06 04:20:25
  • SpringBoot实现项目健康检查与监控

    2023-10-28 19:14:25
  • OpenXml读写Excel实例代码

    2023-09-10 18:11:22
  • Java开发完整短信验证码功能的全过程

    2023-05-05 15:35:24
  • C# TextBox控件实现只能输入数字的方法

    2022-03-07 01:57:27
  • C#中TreeView实现适合两级节点的选中节点方法

    2022-10-02 19:12:42
  • c# 基于任务的异步编程模式(TAP)的异常处理

    2023-08-03 15:44:06
  • SSM Mapper文件查询出返回数据查不到个别字段的问题

    2023-10-17 01:02:08
  • Android进阶Hook拦截系统实例化View过程实现App换肤功能

    2023-12-01 21:22:12
  • java递归菜单树转换成pojo对象

    2022-08-12 04:04:40
  • Spring Boot2.0 @ConfigurationProperties使用详解

    2021-06-11 17:21:30
  • Android判断网络状态的代码

    2022-08-17 08:01:15
  • Android 自定义dialog的实现代码

    2023-12-05 08:17:29
  • Unity 实现给物体替换材质球

    2023-06-28 05:28:24
  • asp之家 软件编程 m.aspxhome.com