最近研究了一下Android打包apk的流程,简要描述一下。
我们可以跟随android的sdk目录下的tools/ant/build.xml文件的描述来一窥打包apk流程究竟。
首先这是用ant打包的过程,eclipse打包流程应该大抵一样。用ant打包前,如果project不是用ant创建的,先需要执行android update project -p /path/to/project。该命令会在project目录下生成相应的配置文件。如build.xml(与sdk下的那个不同),project.properties,local.properties等。生成的几个文件都是项目相关的配置参数等。ant打包需要build.xml配置文件,project下的配置文件包含sdk/tools/ant/build.xml文件。
project下的build.xml相对简单了,设定一些project属性,引用了project.properties,local.properties等文件。build.xml设定了ant的默认行为(target)是help。显示相应帮助。
sdk/tools/ant/build.xml相对复杂很多,一共有1300+行。乍看很多,粗粗分析开来,一块一块也相对较为明朗。即便我对ant配置一知半解,也看个大概明白。<property>就是设定一些key-value的属性,<target>就是ant对应的目标,类似于Makefile的那个目标。
这个build.xml相应地方做了良好的注释。这个文件内容分布大概如下:
1.定义一些覆盖默认设置的属性。还是有一些挺有意思的属性值得一看的,比如android.package.excludes,设定该属性可以排除编译一部分代码。再比如version.code,version.name可以替换AndroidManifest.xml中的相关版本内容。
2.自定义了一些任务。凭借我的揣测,这是ant提供的一些扩展,这些任务是通过${sdk.dir}/tools/lib/anttasks.jar这个jar包来导入定义的。定义了很多,列举一二,如com.android.ant.NewSetupTask,com.android.ant.AaptExecTask,com.android.ant.IfElseTask等等。
3.其它属性。主要是编译流程用到的一些变量属性,包含输入目录,输出目录,工具位置等。这里可以看见一些经常看到用到的目录和工具。比如src自不用多说,还有gen目录,libs目录等。此处加一段故事,很久之前,我是用Eclipse好的project在带我的bear那里用ant编译有问题,问题在于我将外部的jar包放在了lib目录下,ant编译的时候会找不到这个jar包了,但是放在libs里就可以了,到了这就可以解释了,因为build.xml暗暗的定义了这个默认的文件夹的名字。再插一句最新的adt也支持放在libs中而不需要做多余路径设定了。
4.宏定义。定义了一些多次用的流程为宏。比如do-only-if-not-library,如果不是android library project就怎样做。package-helper等等。
5.Build过程的一些Target。第一个是nodeps,很简单是设定了一个属性,来设定targets间是否存在依赖关系。然后有-per-clean,clean清空bin,gen目录做了这么些事。(前面加-的target,从某种程度来说是private的target,因为输入ant -xxx的时候,-xxx会当作ant的参数,而不是build的目标)
然后就涉及打包流程了。-setup,做一些初始化工作,创建bin目录等,设定一些属性等。-build-setup,也是做一些build的初始化工作。然后是-per-build这个是空的,这个是用来给用户做一些自定义设定或者实现预留的,后面类似这样预留的无内容的部分我就不讲了。然后是-code-gen,这个就有意思一些了,最为人熟知的android中的R文件就要生成了,生成R文件在这个过程做了定义,通过aapt程序(这个程序很有意思,这里略去不讲,没准下回会讲)生成R文件。-code-gen过程还有一些重量级的东西。比如生成用于进程通信的aidl文件相应类的生成,还有renderscript的生成。还有BuildConfig文件的生成。然后就是激动人心的compile编译过程了,就是javac做编译,生成class文件。这里有些令人激动的事情。就是Android为了代码复用,提出了library project的概念,某种程度上还不错,但是扩展能力有限,还是有些坑爹的,而且有一些限制。此处再插故事一则,我有3个project,分别标记为a,b,c,a,b分别是library project,然后依赖是c=>b=>a(c依赖于b,b依赖于a),我想对b做代码混淆,但是出现一些依赖问题。因为android的现在的这个build过程并不把在前面-code-gen生成的依赖的子library的R文件编译到这个library自己的这里,所以在混淆b的时候,会出现a中的R无法找到的问题,因为a中的R会被便已到c中,很混乱吧。事情是这样,但是错误在自己,因为对android的library和整个project的打包流程不清楚,所以造成了上面的窘境。其实根本不用混淆b工程,因为b工程的class会最终放到c中,最后在c中混淆就行了。晕了。。。
继续说打包流程,编译完了,然后就是-obfuscate混淆过程了,混淆默认只在release模式下才进行,内部有一些判断。关于混淆的一些介绍,可以参见我的上一篇博文《ProGuard总结和混淆Android代码中遇到的问题的解决方法以及寻找getSomething游戏》。然后是-dex,转.class到.dex过程。开发Android的都知道,Android没有用标准的jvm,而是自己专门为移动设备优化实现的dalvik vm。这个过程会把所有的.class文件打包到一个.dex文件中。
至此,代码build过程就结束了。全都结束了吗?还没有,Android还有编译资源,再说还没打成apk包呢。
跟资源处理有关的过程先是-crunch这个过程就是对png图片做一些压缩处理。具体怎么处理的咱就不细究了,想知道的话可以研究源代码去。然后又到了激动人心的资源打包过程-package-resources,这个过程就是用牛x的aapt,将所有res目录下的资源文件manifest等文件打包编译处理。这其中有一个对于.9.png的说明。我们知道.9.png的图片是带一圈透明画有黑点的图片。这个过程aapt会将.9.png处理,将透明带黑点写入二进制。和原来的图是不一样了的,逆向工程的时候对.9.png有很多限制。apktool的wiki上有相关说明。xda论坛上也有相关讨论。还有一点是将普通.png改为.9.png的后,ant全程打包是不会有问题的。但是aapt确实对这种情况做了抛出异常处理,所以我猜想是在crunch时做了什么处理,还未证实。
资源文件也build好了,然后对于debug或release。就是打包成apk。然后给apk签名,签名方式上两种模式有些不同处理。debug会进行debug签名,release需要你提供你的签名文件等。然后或进行zipalign操作,字节对齐。
至此,整个过程就结束了。
还有一些关于测试和安装卸载的target就不写了。
(重点过程,加粗标识了,看一遍加粗部分,基本就能知道个大概了)
分享到:
相关推荐
下面,我们将详细介绍两种常见的Android工程打包APK的方法。 **方法1:使用Android Studio** 1. **打开Android Studio**:首先,启动Android Studio并打开你的项目。 2. **构建APK**:在菜单栏中选择`Build`,...
以下是关于Android打包APK的详细过程: 一、准备工作 在开始打包之前,确保你的Android项目已经完成了开发,并且进行了必要的测试。同时,你需要安装Android SDK和集成开发环境(IDE),如Eclipse或Android Studio...
通过以上步骤,我们可以清晰地了解到在 Android Studio 中打包 APK 的基本流程。值得注意的是,在实际操作过程中,还需要关注以下几个方面: - **密钥管理**:无论是使用现有的 `.jks` 文件还是创建新的,都应该...
HTML打包APK是一种技术,它允许开发者将HTML、CSS和JavaScript等Web前端代码转换成可以在Android设备上运行的APK应用程序。这个最新的1.9.0版本是专为Windows用户设计的工具,简化了Android应用的开发流程,尤其是...
本文将详细讲解“android_apk_打包工具”这一主题,它旨在简化APK打包过程,使得即便是初学者也能快速有效地完成任务。 首先,让我们了解Android APK的基本概念。APK是Android系统的应用程序包,包含了所有Android...
在默认情况下,Android Studio并不会自动将外部的SQLite数据库文件打包进APK。因此,我们需要手动干预这个过程。一种常见的方法是在`assets`目录下放置SQLite数据库文件,因为该目录下的文件会在应用安装时被复制到...
在Android开发过程中,将开发完成的项目打包成APK(Android Package)是至关重要的一步,因为这标志着应用程序从开发环境走向用户终端的关键转变。本文将深入解析如何在Android开发环境中,利用Eclipse集成开发环境...
HTML一键打包APK工具1.8.7是一款方便快捷的软件,专为前端开发者设计,旨在将HTML、CSS和JavaScript等网页内容转化为Android应用程序(APK)。这款工具省去了传统安卓应用开发过程中需要配置Android Studio和其他...
Gradle编译打包Android apk详细介绍 理解Gradle构建过程,解读Android Gradle插件的配置 阅读本文一定是要使用过Gradle生成apk,文中不会讲如何安装运行Gradle,如有需要可先看文末的参考文章。 APK包是一个ZIP...
3. **优化和打包**:签名后的APK经过Zipalign优化,然后使用APK打包工具打包成最终的安装文件。 四、使用“Gen_Signature_Android.apk”工具 "Gen_Signature_Android.apk"很可能是一款用于查看和分析Android应用...
【Android Studio打包生成APK教程】 在Android应用开发过程中,将项目转化为可供用户下载和安装的APK(Android Package)文件是最终阶段的关键步骤。Android Studio作为官方推荐的集成开发环境,提供了简单而高效的...
这个工具的主要优点在于简化了传统的安卓应用开发流程,无需复杂的Android Studio环境配置,只需要几个简单的步骤就能完成打包过程。 在标题中提到的是HTML一键打包APK工具的版本1.7.8,它附带了一个解压密码“1234...
在Android应用开发中,APK打包是发布应用的最后步骤,它将编译后的代码、资源文件、配置信息等组合成一个可安装的文件。"Android APK打包工具"旨在简化这个过程,尤其对于需要批量打包或者针对不同渠道进行个性化...
8. **打包APK** - 最后,所有编译后的文件(包括Dex、资源、证书等)会被合并成一个APK文件。使用`apkbuilder`或`zipalign`工具完成这一步。 - `<exec>`任务调用这些工具,并指定输出APK的路径和名称。 9. **签名...
"一键打包APK"是指通过特定工具简化了原本繁琐的APK构建过程,使得开发者或者非专业编程人员也能快速将HTML、CSS和JavaScript等Web内容转化为可以在Android设备上运行的应用程序。 HTML是一种标记语言,它与CSS和...
最后,我们准备打包APK。在Unity中选择`File > Build Settings`,选择Android平台,点击`Player Settings`进行必要的配置,如调整图标、添加元数据等。然后点击`Build and Run`,Unity将生成APK文件。 在实际操作...
以下是对Android Studio打包APK以及将APK上传到蒲公英平台的详细流程。 首先,打开Android Studio项目,进入项目的根目录,在Gradle Scripts文件夹下找到`build.gradle`文件。在这个文件中,确认你的应用版本信息...
在Android开发过程中,APK打包签名是一个至关重要的环节,它涉及到应用的安全性和可分发性。本文将详细讲解Android APK的打包和签名过程,以及如何使用Eclipse、IntelliJ IDEA等工具进行签名操作。 首先,理解签名...
### Android应用APK打包签名方法详解 #### 一、引言 在Android开发过程中,APK的打包与签名是一项至关重要的环节。无论是开发者在本地测试应用,还是将应用提交到Google Play商店,都需要确保APK文件正确地进行了...
#### 三、使用Eclipse打包APK 1. **打开Eclipse**: - 打开Eclipse IDE,并加载已完成的Android项目。 2. **选择项目**: - 右键点击要打包的项目,选择`Android Tools` > `Export Signed Application Package`...