[Android] 基于 Linux 命令行构建 Android 应用(三):构建流程
Android 应用的构建过程就是将 Android 项目中的文件和资源进行编译和打包,最后将结果输出到 .apk 文件。.apk 文件是保存二进制文件的容器,它包含了运行安卓应用所需的所有信息,例如编译后的 .dex 文件(.class 对应的 Dalvik 字节码),一个二进制的 AndroidManifest.xml 文件,编译后的资源(resources.arsc)和未编译资源。
如果你使用 Eclipse 进行开发,ADT 插件能持续构建你的项目,并将 .apk 文件自动输出到项目的 bin 文件夹,因此整个构建过程你无需做任何事情。
如果你不是使用 Eclipse 进行开发,你可以使用 Ant + build.xml,build.xml 是 Ant 构建文件,位于项目根目录下。Ant 会自动调用构建工具来完成整个构建过程。
为了让安卓应用运行在安卓设备上,你需要对安卓应用进行签名,签名分为调试(debug)和发行(release)两种模式。在开发阶段,一般使用调试模式进行签名,这时构建工具会使用一个调试密钥(debug key)和密码,这样你就不必每次构建时都输入密码。当你想正式将安卓应用通过 Google Play 公开发行时,你必须使用你的私钥在发行模式下构建你的应用。
Eclipse 和 Ant 都支持两种模式下的自动签名。
下图描述了从构建到运行安卓应用的流程与组件:
构建过程
在生成 .apk 的整个构建过程中会用到许多工具,需要处理与生成许多临时文件。
下图描述整个构建过程所使用的工具和相关文件:
整个构建过程大体如下:
● 安卓资源打包工具(Android Asset Packaging Tool,简称 aapt)负责编译所有资源文件,例如 AndroidManifest.xml 和描述 Activity 的 XML 文件,并生成一个 R.java 文件,这样你就可以在 Java 代码中引用你的资源文件。
● aidl 工具将所有 .aidl 接口转换为 Java 接口。
● Java 编译器将项目中所有 Java 代码,包括 R.java 和 .aidl 文件编译成 .class 文件。
● dex 工具将 .class 文件转换为 Dalvik 字节码。所有第三方库和 .class 文件同样也会被转换为 Dalvik 字节码,这样它们才能最终一并打包到 .apk 文件中。
● apkbuilder 工具将所有未编译资源(例如图片)、编译后的资源和 .dex 一同打包到 .apk 文件。
● 当 .apk 文件生成后,还需要对其进行签名(调试或发行模式),否则该 .apk 文件无法安装到安卓设备。
● 最后,当你使用发行模式签名后,你还需要使用 zipalign 工具调整 .apk 文件,这样做可以减少安卓应用运行在设备上的内存占用率。
注意:安卓应用有 64K method reference[1] 限制。如果达到该限制,构建过程中将打印以下错误信息:
Unable to execute dex: method ID not in [0, 0xffff]: 65536.
你可以使用 load secondary dex files at runtime 和使用 ProGuard 来消除非必要的类引用。(Proguard 只在发行模式下有效)
注:
[1] 64K method reference limit 是指安卓编译器限制每个 .dex 文件只能引用 65536 个方法。
附:
2. 了解关于应用签名:Signing Your Applications
[Android] 基于 Linux 命令行构建 Android 应用(三):构建流程的更多相关文章
- [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建
本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...
- [Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目
创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生 ...
- [Android] 基于 Linux 命令行构建 Android 应用(六):Android 应用签名
Android 要求所有应用在安装前必须使用证书进行数字签名.Android 使用该证书来确定一个应用以及其作者身份,该证书不要求由证书发行机构颁发,因此 Android 应用经常使用自我签名的证书, ...
- [Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建
谷歌提供的 Android SDK 支持 Ant 自动构建[1],你可以使用调试和发行两种模式进行构建,两种模式不同之处在于调试模式 Ant 会调用内置的调试密钥,而发行模式调用你提供的私钥. 首先安 ...
- [Android] 基于 Linux 命令行构建 Android 应用(五):Ant 构建命令
Android SDK 提供的 android 工具可以在项目根目录自动生成 Ant 构建文件 build.xml[1].进入项目根目录后,你可以使用以下 Ant 命令[2]. ant clean 清 ...
- [Android] 基于 Linux 命令行构建 Android 应用(一):关于 Android 项目
关于 Android 项目 项目是保存源代码和资源文件的容器. 谷歌提供的 Android SDK 工具只能对具有固定目录结构的项目进行编译和打包.因此强烈建议使用 Eclipse + ADT 或者 ...
- 7个基于Linux命令行的文件下载和网站浏览工具
7个基于Linux命令行的文件下载和网站浏览工具 时间:2015-06-01 09:36来源:linux.cn 编辑:linux.cn 点击: 2282 次 Linux命令行是GNU/Linux中最神 ...
- 【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用
基于Linux命令行KVM虚拟机的安装配置与基本使用 https://alex0227.github.io/2018/06/06/%E5%9F%BA%E4%BA%8ELinux%E5%91%BD%E4 ...
- 5个基于Linux命令行的文件下载和网站浏览工具
导读 命令行是GNU/Linux中最神奇迷人的部分,它是非常强大的工具;命令行本身功能多样,多种内建或者第三方的命令行应用使得Linux变得更加健壮和强大.Linux Shell支持多种不同类型的网络 ...
随机推荐
- Window Server 2008 R2系统备份
1.安装Backup 2.打开Backup工具 3.一次性备份 下一步
- jdk TreeMap工作原理分析
TreeMap是jdk中基于红黑树的一种map实现.HashMap底层是使用链表法解决冲突的哈希表,LinkedHashMap继承自HashMap,内部同样也是使用链表法解决冲突的哈希表,但是额外添加 ...
- 微信小程序- 提示不在以下合法域名列表中
第一次开发微信小程序时在访问后台数据时总是提示 提示上面问题主要有两个原因: 1.为配置安全合法域名列表: 微信小程序在开发时需要在官网配置固定的数据来源网站: 登录小程序平台中->设置: 图中 ...
- java多线程有哪些实际的应用场景?
多线程使用的主要目的在于: 1.吞吐量:你做WEB,容器帮你做了多线程,但是他只能帮你做请求层面的.简单的说,可能就是一个请求一个线程.或多个请求一个线程.如果是单线程,那同时只能处理一个用户的请求. ...
- Visual Studio 打开程序提示仅我的代码怎么办
工具-->选项--->调试---->常规-->禁用"启动仅我的代码"
- iOS关于沙盒文件拷贝manager.copyItem的一个坑
记录一下: 沙盒文件操作,当需要拷贝文件时,我们可以使用如下类似方式: // 文件拷贝 func copyFile(from:String,to:String)->Bool{ if !manag ...
- iOS 一些常见问题的整理
一.通知 对于通知,大家想必都不陌生,它是一个单例,允许当事件发生时通知一些对象,让我们在低程度耦合的情况下,来达到通信的目的. 通知的优势:1.不需要编写太多代码,实现比较简单2.对于一个发出的通知 ...
- 简单的redis测试
//这个方法会多一次 public function testRedisList(){ $num = 10; $user_id = uniqid(); //直接链接本地的redis $redis = ...
- Swift Assert 断言
前言 对每次运行都会出现的错误通常不会过于苦恼,可以使用断点调试或者 try catch 之类的方式判断并修复它.但是一些偶发(甚至是无数次运行才会出现一次)的错误单靠断点之类的方式是很难排除掉的,为 ...
- Chrome F12 温故而知新 :因为重定向导致清空Network信息
虽然我以前都是用Fiddler 4来作为解决方案.但实际上可以勾选 [Preserve log]来保存日志 这样就不担心因为页面重定向导致清空了日志了