Android应用程序的编译和打包

应用程序的编译和打包

转载请注明:LXS, blog.csdn.net/uiop78uiop78/article/details/8504128

文章是在word上写好后,复制到csdn的,csdn不支持live writer,每次编辑都很伤脑筋,最终的效果也很差。有知道方法的朋友告知一下,感谢。

同步发布在http://www.cnblogs.com/lxs-android/archive/2013/01/15/2861822.html

  1. Android应用程序的编译和打包

    Android中应用程序的编译可以如下几种方式:

  • 借助于系统编译

我们在本书的基础篇中对Android系统的编译框架进行过分析。它利用Android.mk文件将众多小项目组织起来,并且提供了非常方便的函数来编译出各种可执行文件,库,和应用程序等等。虽然我们完全可以借助于系统编译来完成应用程序的编译,不过这种方式并不多见。一方面,这需要开发工程师对整个系统的编译框架有一定的认识,另一方面,还需要下载整个源码项目,每次编译的时间也会非常长。

 

  • 借助于IDE工具

所以一般的纯应用程序(非系统级应用)开发,都会借助于IDE工具,比如Eclipse就是使用最广泛的一种。Android为Eclipse提供了ADT组件,从而让用户可以像操作Visual Studio一样开发Android应用程序。

 

  • 命令行编译

工程师在ADT的帮助下,几乎不用做多余的操作就可以完成编译。不过,这样造成的一个副作用是很多人对于应用程序的编译、打包、签名等等基础过程都完全不清楚。因而这章的内容我们将讲解隐藏在"ADT"背后的这些细节。

  1. Ant

    完成一个软件项目编译需要哪些工具?编译器是毋庸置疑的,比如GCC,而且理论上这就足够了(在没有其它资源需要处理的情况下)。不过,随着工程源码的不断膨胀,单纯的使用GCC显然无法满足要求——Android工程有成千上万个文件,不可能手工对这些源码都执行GCC命令吧?所以必须有强大的工具来管理这些零碎的文件,由小而大地组织成最终的系统img,这就是make的意义所在。

    那么从命令行编译一个Apk,是不是也用make?

    可以这样子做,但事实上Google却并没有选择这种方式,而是采用了另外一个工具——Ant。

    Ant 是"Another Neat Tool"的缩写,由Apache开发。从"Another"可以看出,它是基于某个其它工具而开发的,而且多半是针对这个原有工具的缺点来做改进的(Neat)。事实上也确是如此,Ant的开发者原先供职于Sun公司,在开发著名的JSP/Servlet(即后来的Tomcat)时,发现传统的make方法需要依赖于操作系统环境,对他的工作造成了不少的影响。

    因此Ant采用Java语言开发,并且以XML文件(默认为build.xml)来描述编译过程和依赖关系。这相对于Makefile来说更简洁易懂,也更有扩展性,所以在Java工程中得到了广泛应用。

    下面列出Ant的几个常见命令, 其它更多用法我们这里不做详细解释,有兴趣的读者可以参见它的官方网站:

    ant release

    编译一个release版本的项目

     

    ant debug

    编译一个debug版本的项目

     

    ant installd

    安装一个已经compiled过的debug包

     

    ant installr

    安装一个已经compiled过的release包

     

    ant installt

    安装一个已经compiled过的测试包,同时安装被测试应用的.apk文件

    ant <build_target> install

    编译并安装一个程序包

     

    ant clean

    清理一个项目, 或者如果你使用了ant all clean, 则所有相关项目都会被清理。

     

    特别提醒:如果你是在Windows下开发Apk应用程序,那么要注意JDK的安装路径。因为默认情况下,JDK安装在"Program Files"目录,这中间的空格将使Ant无法正常运行。解决的办法有两个:

  • set JAVA_HOME= "c:\Progra~1\Java\<jdkdir> "
  • 或者将JDK安装到名称不带空格的路径中
  1. 通过命令行编译和打包APK

    总结而言,ant可以提供两种方式的编译,即debug和release。无论何种方式生成的应用程序,都需要经过签名和zipalign的优化,只不过debug的方式默认就会帮开发者完成这些工作。关于签名过程的一些描述,请参阅下一小节。

     

    Debug模式

    编译debug版本的项目,一般步骤如下:

  • 命令行模式下,进入你的工程目录
  • 使用ant debug命令进行编译

这样就会在项目的bin目录下生成一个后缀为-debug.apk的文件,而且它已经用debug key签过名,也经过了zipalign的优化。

 

Release模式

虽然上面的debug模式非常方便,但并不适用于将要发布出去的应用程序。因为它采用的是系统默认的签名文件,没有起到很好的安全保护作用。

在release模式下,签名和zipalign默认情况下都需要开发者手动完成。一般步骤如下:

  • 命令行模式下,进入你的工程目录
  • 使用ant release命令进行编译
  • 在bin目录下会生成以-unsigned.apk为后缀的apk文件
  • 利用Jarsigner或者其它类似工具为apk签名(用私钥签名)
  • 利用zipalign优化应用程序

     

可能有读者会认为这个过程比较繁琐,有一个简化的方法可以在release模式下自动为apk签名和优化。

  • 找到项目根目录下的ant.properties文件
  • 加入如下两条信息:

这样ant release命令在生成apk的过程中会询问密码,编译完成后的应用程序就已经用你提供的my.keystore签名了。

编译后生成的Apk还需要安装到模拟器或设备上以供用户使用。在Eclipse上,我们只要点击"Run->Run/Debug"就可以将程序安装到目标上(目标可以是模拟器或设备,具体选择哪个设备一方面取决于当前连接的实际情况,另一方面还与Run/Debug Configurations里Target页中的设置有关系),实际上这一过程是借助于adb的install功能,因而命令行模式下,我们还是可以使用adb install来达到安装要求。关于这一过程,可以参见本书的工具篇对adb的详细描述,这里不再赘述。

  1. APK编译过程

    上面我们对Ant的两种编译模式进行了概述,从使用的角度出发向读者介绍了命令行模式下的编译过程。接下来,我们进一步分析编译的实际过程,即Android是如何将项目源码一步步编译打包成最终的.apk文件。

    以apk为后缀的文件是Android应用的标准格式,它其实是一个zip压缩包,所以可以用WinRar等工具将其解压出来。可以看到,一个典型的apk应用包含以下几部分内容:

  • AndroidManifest.xml

    这个文件相信大家都不会陌生,如果应用程序是一本书,那么这个文件就是它的"封面"和"目录",记载了应用程序的名称,权限声明,所包含的组件等等一系列信息。不过从普通apk解压出来的AndroidManfiest是无法直接打开的,因为它发布时已经经过了保护处理

  • classes.dex

    Apk应用程序的核心。它是由项目源码生成的.class文件,经进一步转化而成的Android系统可识别的Dalvik Byte Code

  • resources.arsc

    编译过后的资源文件

  • res目录

    未编译的资源文件

  • META-INF目录

    保存应用程序的签名和校验信息,以保证程序的完整性。当生成apk包时,需要对内容做一次校验,并将结果保存在这里。而设备在安装这一应用时,会对内容再做一次校验,并和先前的值进行比较,以验证程序包是否已经被恶意篡改

 

下图详细描述了整个编译过程:

131 Apk的编译全过程图解

可以清楚地看到,整个编译过程涉及了多种工具,我们下面对其中的几个重要步骤进行讲解。

  • 首先.aidl(Android Interface Description Language)文件需要通过aidl工具转换成编译器能处理的Java接口文件
  • 同时资源文件将被aapt (Asset Packaging Tool)处理为最终的resources.arsc,并生成R.java文件以使源码可以方便地访问到这些资源
  • Java的编译器将R.java, Java源码以及上述生成的接口文件统一编译成.class文件
  • 不过.class并不是Android系统所能识别的格式,因而还要利用dex工具转化为Dalvik字节码。这其中还会加入所有需要的第三方库等文件
  • 接下来系统将上面生成的dex,资源包,以及其它资源通过apkbuilder生成初始的apk文件包。这时还没有签名和优化
  • 签名可以用Jarsigner,也可以用其它类似的工具。如果是在Debug模式下,所签名所用的keystore就是系统默认自带的,否则开发者需要提供自己的私钥以完成签名过程
  • 最后一步,将上述签名后的apk通过zipalign进行优化,以提高加载和运行速度。大概原理是通过对其中包含的相关数据进行边界对齐,来加快读取和处理。这也同时解释了其名称"zip"+"align"的由来

     

上面编译过程所涉及到的一部分重要工具的使用方法,可以参看本书工具篇中的讲解。至此,我们已经熟悉了整个Apk编译的流程,接下来的一个小节,将重要分析下应用程序的签名。

  1. 信息安全基础概述

    在讲解Android应用程序的签名前,我们有必要补充下信息安全与密码学 (Information security and cryptography) 的一些基础知识,这样大家对后面的学习就能轻车熟路了。

    相信读者在生活中多多少少都已经接触过密码学的知识,比如我们在浏览网页,特别是一些银行官方网站时,经常会看到"http"协议已经悄然转成了"https"。还有就是个人电子签名,它的权威性已经得到了广泛的认可,并慢慢取代了传统的签名方式具有法律效应了。这些技术的迅速发展,都得益于密码和安全学的不断突破和创新。

    安全是一个抽象的概念,换句话说,什么

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值