Android 项目是如何编译成.apk的

虽然Android Studio集成了完整的编译工具,但我们仍需了解Android 项目的编译过程。

本篇博客则是总结Android 项目的编译过程。

编译过程流程图 

官方流程图

谷歌Android开发网址提供了下列的Android的编译打包流程:

扩展后的流程图

官网的介绍比较笼统,我们将其展开如下图的流程:具体过程我们在介绍编译工具之后叙述

编译工具 

​​​​​​​​​​编译过程所用到的编译工具如下:
编译工具用途
aapt Android Asset Packaging Tool

Android资源打包工具,用于Assets目录和Res目录非图片资源的打包

(xml文件打包成R.java文件和resources.arsc文件)

aidl Android Interface definition languageAndroid接口定义语言,用于Android  AIDL文件的编译。如果项目没有aidl文件即不需要用此工具
javacjava文件编译工具,可以将java源文件编译成class文件
dex用于将编译出的class文件编译成Android可执行文件classes.dex,目的是其中各个类能够共享数据,也在一定程度上更加紧凑降低了冗余度

apkbuild

将classes.dex文件与项目中用到的非java文件和aapt生成的resources.arsc文件打包成未签名的apk
jarsignerapk签名工具。debug版本默认签名,release用开发者的签名进行签名
zipalignapk内的内存对齐。这里内存按4字节对齐(R.java内的控件以及其他资源id均是4字节),加快存取效率
kotlin文件用kotlinc编译工具将.kt文件编译成class字节码文件

编译过程 

  • aapt工具将Android项目中Res目录和Assert目录下的xml资源文件编译成R.java文件和resources.arsc二进制文件。

R.java文件内是控件和资源的id,值为4字节的二进制,如下列代码。其中最高的1字节表示Package ID,次高1个字节表示Type ID,最低2字节表示Entry ID​​​​​​​。这个Id与resources中的二进制资源相对应。

可以将R.java文件中的Id与resources.arsc中的资源结合成map来看待,key即id,value即.arsc中的资源。

public final class R {
    public static final class anim {
        public static final int abc_fade_in=0x7f050000;
        public static final int abc_fade_out=0x7f050001;
        public static final int abc_grow_fade_in_from_bottom=0x7f050002;
      
    }
    public static final class animator {
        public static final int design_appbar_state_list_animator=0x7f060000;
        public static final int slide_in_left=0x7f060001;
        public static final int slide_out_left=0x7f060002;
    }
  • 如果项目中有.aidl接口定义文件,需要用aidl工具编译。
  • 将可能存在的aidl编译结果、aapt生成的R.java文件以及项目源代码中的java文件在javac工具的编译下生成class字节码文件
  • 将javac生成的class字节码文件与第三方包中的jar文件在dex工具的作用下编译成Android可执行文件集classes.dex
  • classes.dex以及源代码中的非java文件、第三方包中的非java文件(如.so文件),aapt所生成的resources.arsc文件共同在apkbuild工具的作用下编译成未签名的apk文件
  • 未签名的apk文件在jarsigner签名工具的作用下生成签名的apk文件。

debug版本apk采用默认签名,release版本apk采用开发者签名

  • 最后利用zipalig工具对已签名的apk文件进行4字节内存对齐。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值