美文网首页
Android APK编译流程

Android APK编译流程

作者: yanlong107 | 来源:发表于2020-02-25 19:57 被阅读0次

apk 是Android Package的简写, 在平时的开发过程中,通过点击Run app 按钮 或者 在命令行中输入

./gradlew ***(taskName)

这样Android Studio就会启动构建流程,最终输出一个我们想要的APK。

构建流程

直达官网介绍

image.png
如上图 所示,典型 Android 应用模块的构建流程通常按照以下步骤执行:

1.  编译器将您的源代码转换成 DEX 文件(Dalvik 可执行文件,其中包括在 Android 设备上运行的字节码),并将其他所有内容转换成编译后的资源。
2.  APK 打包器将 DEX 文件和编译后的资源合并到一个 APK 中。不过,在将应用安装并部署到 Android 设备之前,必须先为 APK 签名。
3.  APK 打包器使用调试或发布密钥库为 APK 签名:
    3.1.  如果您构建的是调试版应用(即专用于测试和分析的应用),则打包器会使用调试密钥库为应用签名。Android Studio 会自动使用调试密钥库配置新项目。
    3.2.  如果您构建的是打算对外发布的发布版应用,则打包器会使用发布密钥库为应用签名。
4.  在生成最终 APK 之前,打包器会使用 zipalign工具对应用进行优化,以减少其在设备上运行时所占用的内存。

构建流程结束时,您将获得应用的调试版 APK 或发布版 APK,以用于部署、测试或发布给外部用户。

对于小白来说,上面一张图已经可以解释apk的构建过程了,不过对于Andoid开发者而言还需要了解一些更详细的构建过程。

image.png

详细的对应步骤 和 使用工具如下:

1. aapt打包资源文件

资源文件(res文件夹下的文件)通过 AAPT(Android Asset Packaging Tool)打包生成R.java类(资源索引表)、.arsc资源文件 和res文件。

R.java

public final class R {
    public static final class anim {
        public static int abc_fade_in = 0x7f010001;
        public static int abc_fade_out = 0x7f010002;
    }
}
//第一位字节0x7f表示packageID,用来限定资源的来源。系统资源包是ox01,SharedLibrary类型资源包是0x00, 普通App包则是0x7f; 
// 次一位字节01表示typeID,用来表示资源类型,如drawable、layouts、anims、color、menu等;
// 后2字节0001/0002表示EvtryID,指的是每一个资源在对应的TypID中出现的顺序

resources.arsc 是一个App的资源索引表,通过R.java 文件 和 resources.arsc 可以定位到资源的内存地址,resources.arsc文件的作用是通过一样的ID,根据不同的配置索引到最佳的资源显示在UI中。

2. 处理 aidl files

AIDL (Android Interface Definition Language), 是Android接口定义语言,是Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。
如果有aidl文件,这个阶段会生成对应的Java接口文件。

3. 编译(Compilers)

R.java文件、工程源码文件、aidl.java文件, 在这一步通过javac生成.class文件。

  • 注解处理器在这一步会进行工作,生成相应的代码
  • 如果配置了代码混淆,也会在生成.class 文件时候进行配置,最终的.class文件混淆后可以防止被反编译

4. dex(生成dex文件)

源码.class文件和第三方jar或者library通过dx工具打包成dex文件

Android系统的Dalvik虚拟机的可执行文件为DEX格式,所以这里会将上一步中生成的.class文件 和 引用的第三方jar等过程中的.class 一起通过dx工具打包成dex文件

5.apkbuilder(生成未签名apk)

apkbuilder工具会将所有没有编译的资源、.arsc资源、.dex文件打包到一个完成apk文件中

tips:

  • res/raw和assets的相同点:
    1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
  • res/raw和assets的不同点:
    1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
    2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

6.apksigner/Jarsigner(签名)

apksigner工具会对未签名的apk验证签名。得到一个签名后的apk(signed.apk)

apksigner 是google 退出的V2签名方式
Jarsigner 是之前一直使用的V1签名方式

可以通过在命令行中输入apksigner --help来获取详情信息,如果沒有特殊需求,使用下面命令即可完成签名

${ANDROID_HOME}/build-tools/28.0.3/apksigner sign --ks **.keystore --ks-key-alias [别名] --ks-pass pass:[别名密码] --key-pass pass:[证书密码] --out [签名后文件存放路径] [未签名的文件路径]

7. zipalign(对齐)

release mode 下使用 aipalign进行align,即对签名后的apk进行对齐处理

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

zipalign是一个android平台上整理APK文件的工具,它对apk中未压缩的数据进行4字节对齐,对齐后就可以使用mmap函数读取文件,可以像读取内存一样对普通文件进行操作。如果没有4字节对齐,就必须显式的读取,这样比较缓慢并且会耗费额外的内存。

参考文章:
Android-Studio配置构建
浅谈Android打包流程
apk打包流程

END!

相关文章

  • Android Apk包瘦身

    目录 1、Android 编译打包流程2、Apk包瘦身 1、Android 编译打包流程及APK构成 1.1、An...

  • Android Apk包瘦身

    首先我们来了解Android编译打包流程 1.Android编译打包流程及APK构成 1).通过Java编译器对于...

  • 反编译Android APK及防止APK程序被反编译

    反编译Android APK及防止APK程序被反编译 怎么逆向工程对Android Apk 进行反编译 googl...

  • Android APK编译流程

    apk 是Android Package的简写, 在平时的开发过程中,通过点击Run app 按钮 或者 在命令行...

  • 学习Android apk 的编译流程

    这一篇主要是学习Android apk 的编译流程 但其实,本人还是没有成功编译成一个apk的(或则是说,编译成功...

  • Android中ClassLoader类加载机制

    Android中apk的构建过程 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将...

  • Javassist实现无侵入埋点

    Apk编译流程 Apk编译流程主要经过以下几步:1、使用javac将java文件编译成class2、使用dex工具...

  • Apk反编译

    APK反编译流程 对我们来说,apk 就是一个压缩包 。反编译 apk 就是反编译 dalvik(Dalvik 是...

  • Android APK 编译打包流程

    今天就和大家一起去探索下Android中编译打包的那些事儿。整个构建流程大概分为两部分:编译(Compile),打...

  • App 的编译和打包流程

    APK 的编译打包流程 打包所需要工具: 。 1.打包资源文件 AAPT,全称Android Asset Pack...

网友评论

      本文标题:Android APK编译流程

      本文链接:https://www.haomeiwen.com/subject/hcooxhtx.html