首先看一张官方的流程图:

编译打包步骤:

1. 打包资源文件,生成R.java文件

打包资源的工具是aapt(The Android Asset Packaing Tool)该程序位于Android\sdk\build-tools\25.0.0\aapt.exe。

在这个过程中,项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制。

存放在APP的res目录下的资源,该类资源在APP打包前大多会被编译,变成二进制文件,并会为每个该类文件赋予一个resource id。对于该类资源的访问,应用层代码则是通过resource id进行访问的。Android应用在编译过程中aapt工具会对资源文件进行编译,并生成一个resource.arsc文件,resource.arsc文件相当于一个文件索引表,记录了很多跟资源相关的信息。

2. 处理aidl文件,生成相应的Java文件

这一过程中使用到的工具是aidl(Android Interface Definition Language)(Android\sdk\build-tools\25.0.0\aidl.exe),即Android接口描述语言。

aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步。

3. 编译项目源代码,生成class文件

项目中所有的Java代码,包括R.java.aidl文件,都会变Java编译器(javac)编译成.class文件,生成的class文件位于工程中的bin/classes目录下。

4. 转换所有的class文件,生成classes.dex文件

dx工具生成可供Android系统Dalvik虚拟机执行的classes.dex文件,该工具位于(Android\sdk\build-tools\25.0.0\dx.bat)。

任何第三方的libraries.class文件都会被转换成.dex文件。dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。

5. 打包生成APK文件

所有没有编译的资源,如images、assets目录下资源(该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问);编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中。

打包的工具apkbuilder位于 android-sdk/tools目录下。apkbuilder为一个脚本文件,实际调用的是(Android\sdk\tools\lib)文件中的com.android.sdklib.build.ApkbuilderMain类。

6. 对APK文件进行签名

一旦APK文件生成,它必须被签名才能被安装在设备上。

在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore。

另一种就是用于发布正式版本的keystore。

7. 对签名后的APK文件进行对齐处理

如果你发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign(Android\sdk\build-tools\25.0.0\zipalign.exe)

对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。

图解apk的打包过程相关推荐

  1. ❤️Android Apk 的打包过程 ❤️ 只需两幅图

    官方介绍 在分析安装过程之前,需要先了解一下 Android 项目是如何经过编译->打包生成最终的 .apk 格式的安装包.谷歌有一张官方图片来描述 apk 的打包流程,如下图所示. Andro ...

  2. android apk编译打包过程

    Android安装包的后缀都是.apk, apk是Android Package的缩写. 解压apk文件后包含AndroidManifest.xml.assets目录.classes.dex(还可能有 ...

  3. Android应用程序(APK)的编译打包过程

    前言 android系统上所识别的安装包后缀名为.apk 1.通过aapt工具打包资源文件和清单文件到R.java中. 2.通过aidl工具将aidl文件转为java文件 3.上面所产生的java文件 ...

  4. gradle编译打包过程 之 ProcessAndroidResources的源码分析

    首先,如何查看gradle源码,我们在项目里依赖com.android.tools.build:gradle即可,如下: compile gradleApi() compile 'com.androi ...

  5. Android APK 打包过程 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. android Apk打包过程概述_android是如何打包apk的

    最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程. 流程概述: 1.打包资源文件,生成R. ...

  7. Apk的编译打包过程

    今天跟着大佬的Blog来学习一下 Apk打包编译的流程.传送门 流程图 上图中的绿色部分就是APK编译打包的工具.从图中可以知道使用的工具有: APPT.AIDL.Java Compiler(java ...

  8. 【Java 虚拟机原理】动态字节码技术 | Dalvik ART 虚拟机 | Android 字节码打包过程

    文章目录 一.动态字节码技术 二.Dalvik & ART 虚拟机 三.Android 字节码打包过程 总结 一.动态字节码技术 动态字节码技术 就是在 运行时 , 动态修改 Class 字节 ...

  9. 【Android】APK的打包流程

    APK打包流程 apk其实就是一个压缩包,里面有lib,META-INF,classes.dex,res,resources.arsc等文件,我们对一个apk文件进行解压,可以发现里面其实有许多文件: ...

最新文章

  1. Windows server 2008 R2 通过策略关闭密码复杂性
  2. Linux下C程序的反汇编【转】
  3. 物流链云平台云ROS——看得见的成本节约
  4. AICompiler动态shape编译框架案例和效果数据
  5. 深入解析JNA—模拟C语言结构体
  6. (4) XOS 源码详解: os_s_xxxx.s 汇编代码的 堆栈空间定义,比较简洁的方式
  7. Dcmtk在PACS开发中的应用(基础篇) 第二章 打印影像(胶片) 作者 冷家锋
  8. 微博html5版登录网址,微博网页版登录入口
  9. matlab人口增长线性回归拟合_Matlab线性回归(拟合)
  10. 发票专用驱动sjz_收藏!增值税发票(发票勾选)选择确认平台使用手册
  11. 服务器受美国保护网站,该网站服务器受美国保护
  12. new一个对象的时候发生了什么?
  13. ELF文件格式, ELF文件是什么,里面包含什么内容
  14. CentOS 6.2 LNMP搭建
  15. 7-2 输油管道问题
  16. MediaCodec 、x264、faac 实现音视频编码并通过 rtmp 协议实现推流
  17. Centos 系统分区扩容操作指南
  18. 读论文,第三天:Physical Inertial Poser (PIP): Physics-aware Real-time Human Motion Tracking from Sparse
  19. STM32F4xx的NAND Flash应用事项
  20. 如何使用 PHP 发送 Web 推送通知

热门文章

  1. SpringBoot中集成Redis实现对redis中数据的解析和存储
  2. 【码农学编曲】关于宿主软件和插件的推荐
  3. ITECH 微电网测试解决方案
  4. 蓝牙模块HC05遇到的一些常见的问题
  5. Python有证书吗?python证书是什么级别的呢?怎么才能达到python证书的考试条件呢?
  6. android 集成第三方库和程序
  7. Datawhale组队学习周报(第027周)
  8. Linux操作系统渗透测试
  9. 【操作系统】“哲学家进餐”问题
  10. Unity协程的返回值