简述androidapk打包流程

一、 APK 组成解析


在开始解析 Android 构建流程之前,我们先来看下构建的最终产物 APK 的整体组成

APK 是怎么来的?Android 构建流程解析

APK 主要由五个部分组成,分别是: Dex:.class 文件处理后的产物,Android 系统的可执行文件 Resource:资源文件,主要包括 layout、drawable、animator,通过 R.XXX.id 引用 Assets:资源文件,通过 AssetManager 进行加载 Library:so 库存放目录 META-INF:APK 签名有关的信息

更多开发资料获取方法: 关注公众号<Android苦做舟> 领取这些开发文档

APK 是怎么来的?Android 构建流程解析

1.Android高级开发工程师必备基础技能2.Android性能优化核心知识笔记3.Android+音视频进阶开发面试题冲刺合集4.Android 音视频开发入门到实战学习手册5.Android Framework精编内核解析6.Flutter实战进阶技术手册7.近百个Android录播视频+音视频视频dome8.Android Handler机制解析

1.1 Apk 分析工具

工欲善其事,必先利其器,既然想分析 APK 必然少不了好用的工具

① Android Studio 自带的 APK 分析器

通过 APK 分析器,我们可以完成这些操作 1、查看 APK 中文件(如 DEX 和 Android 资源文件)的绝对大小和相对大小 2、了解 DEX 文件的组成 3、快速查看 APK 中文件(如 AndroidManifest.xml)的最终版本 4、对两个 APK 进行并排比较

APK 是怎么来的?Android 构建流程解析APK 是怎么来的?Android 构建流程解析

② ClassyShark

ClassyShark 可以作为 AS 自带 APK 分析器的补充,帮我们分析 dex 中的详细数据,以及查看 APK 中的总方法数以及各个模块的方法数分布。

APK 是怎么来的?Android 构建流程解析APK 是怎么来的?Android 构建流程解析

1.2 Dex 知识点拓展

当我们在 Android 查看一个 APK 的时候,可以看到右上角有 Defined Methods 和 Referenced Methods,但大多数人可能不知道这两者的区别,这里简单说明下:

Defined Methods:在这个 Dex 中定义的方法 Referenced Methods:Defined Methods 以及 Defined Methods 引用到的方法

APK 是怎么来的?Android 构建流程解析

Android 有 64K 引用限制,当 type_ids、method_ids 或者 field_ids 超过 65536(64 * 1024)的时候,需要进行 dex 分包,为了 Dex 的数量尽可能少,我们需要尽量实现「Dex 信息有效率」的提升

Dex 信息有效率 = Defined Methods 数量 / Referenced Methods 数量

APK 是怎么来的?Android 构建流程解析

二、 构建源码导读


当我们用 Android Studio 进行安装包构建的时候,会发现其实是运行了一连串的 Task,也就是说其实是这些 task 的配合,最终构建出我们的 APK 的。

APK 是怎么来的?Android 构建流程解析

2.1 源码引入

如果我们想更了解 Android 的构建流程,对于相关的源码肯定是要有所了解的。那我们如何看到这些 Task 相关的源码呢,我们知道 Android 是用 Gradle 进行构建的,也就意味着这些 task 其实都是放在 Gradle 中,我们想看 Gradle 中源码的话,可以在 build.gradle 将 Gradle 进行编译。

compileOnly "com.android.tools.build:gradle:3.0.1"

编译完之后,可以在 ApplicationTaskManager#createTasksForVariantScope 中找到创建这些 Task 相关的代码,也就意味着顺藤摸瓜找到这些 Task 的真正实现逻辑。

2.2 BuildConfig Task 详解

这里以 BuildConfig 文件的生成为例,来梳理下如何查看某个 task 的代码逻辑。

APK 是怎么来的?Android 构建流程解析

生成 BuildConfig 文件,是通过 ApplicationTaskManager 中通过 createBuildConfigTask 来创建对应的 task。

APK 是怎么来的?Android 构建流程解析APK 是怎么来的?Android 构建流程解析

顺着代码逻辑,我们找到最终真正实现这个逻辑的是:GenerateBuildConfig 这个 task,GenerateBuildConfig 是继承自 BaseTask,这里有个小技巧是,Task 中真正的执行逻辑都是在带着 @TaskAction 注解的方法上的,所以我们能很快找到对应的 generate() 方法。可以看到生成 BuildConfig 整体的逻辑还是比较简单的,其实就是将 build.gradle 中自带的属性以及我们自定义的属性进行读取,然后通过 JavaWriter 生成对应的 BuildConfig 文件。

APK 是怎么来的?Android 构建流程解析APK 是怎么来的?Android 构建流程解析

2.3 获取所有 task 对应的类名

看到上面的例子,可能有些人会抛出一个疑问就是那我们怎么确定构建中执行的 task 具体对应哪个类呢,这里提供一个小技巧,其实我们可以在 taskGraph 构建完成之后,将所有 task name 以及对应的 class 进行打印。例如在 build.gradle 中加入这个代码之后,我们在运行的时候,就会把 task 所对应的类名也都一起打印出来。

APK 是怎么来的?Android 构建流程解析APK 是怎么来的?Android 构建流程解析

三、构建流程梳理


APK 是怎么来的?Android 构建流程解析

可以看到 Android 构建中会涉及到多个工具,我们可以通过 open $ANDROID_HOME/build-tools 来查看相关的构建工具

APK 是怎么来的?Android 构建流程解析

四、手动构建 APK


最后我们通过命令行来手动打包一个可执行的 APK,能让我们对 APK 构建的理解更加深入。首先需要准备下 代码、资源文件、AndroidManifest 这些构建 APK 的必要文件

APK 是怎么来的?Android 构建流程解析

① 通过 aapt2 compile 将 res 资源编译成 .flat 的二进制文件

aapt2 compile -o build/res.zip --dir res

② 通过 aapt2 link 将 .flat 和 AndroidManifest 进行连接,转化成不包含 dex 的 apk 和 R.java

aapt2 link build/res.zip -I $ANDROID_HOME/platforms/android-30/android.jar --java build --manifest AndroidManifest.xml -o build/app-debug.apk

③ 通过 javac 将 Java 文件编译成 .class 文件

javac -d build -cp $ANDROID_HOME/platforms/android-30/android.jar com/**/**/**/*.java

④ 通过 d8 将 .class 文件转化成 dex 文件

d8 --output build/ --lib $ANDROID_HOME/platforms/android-30/android.jar build/com/tencent/hockeyli/androidbuild/*.class

⑤ 合并 dex ⽂件和资源⽂件

zip -j build/app-debug.apk build/classes.dex

⑥ 对 apk 通过 apksigner 进行签名

apksigner sign -ks ~/.android/debug.keystore build/appdebug.apk

作者:developerHaoz
链接:***/post/7166047548551987213
来源:稀土掘金

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 6月 14日 下午1:22
下一篇 2023年 6月 14日 下午1:31

相关推荐

  • 华为平板和ipad能同时登录微信吗

    不知不觉,入手华为MatePad Pad一年,当初买它是因为颜值,确实,华为MatePad Pad的超大屏占比堪称平板界的一股清流,但使用一年,发现并我没想象中的那么好,尤其是在我…

    2023年 5月 14日
  • 支付宝正规的借贷平台有哪些

    一、花呗 支付宝推出的一款“先消费,后付款”的服务,芝麻分600分以上的用户,都有机会申请开通“花呗”。目前“花呗”额度在2500-30000元之间,用户可以拿它在天猫商城或淘宝购…

    数码教程 2023年 7月 4日
  • 苹果pay支付如何使用,苹果手机applepay怎么设置

    大家好,又见面了~ 我是每天 分享数码一线资讯 和 专注二手数码回收 的 换换回收~ Apple Pay,是苹果公司在2014苹果秋季新品发布会上发布的一种基于NFC的手机支付功能…

    2023年 1月 27日
  • 为什么换了5g手机网速还慢了,打开5g和没打开5g网速一样吗知乎

    就像4G开启了移动互联网新时代一样,5G正在重塑我们的生活。为了抢先体验最前沿的移动通信生活,身边越来越多的朋友已经换成了5G手机。然而还是有很多朋友并不知道想要使用5G上网需要在…

    数码教程 2023年 5月 6日
  • 没有密码手机怎么连接网络(不需要密码就能直接连接wifi网络)

    #暑期创作大赛##图文作者打造计划# 原来不需要密码,手机也能快速连接wifi上网你知道吗?朋友们大家好,我是小俊,平时我们在使用手机的时候啊,经常会用到手机连接wifi来进行上网…

    2023年 9月 23日
  • 微信解封好友辅助验证的详细步骤

    如果你遇到了微信封号或者功能被限制,这个时候你需要找一位好友帮你辅助解开。下面,我们就来看看辅助的过程中的注意事项,高手请忽略,新手看仔细了哦! 第一步:临时登录 临时登录指的是封…

    2023年 4月 7日
  • 手机怎么贴膜,手机怎么贴膜摆摊

    智能手机保护膜,是贴在手机表面保护智能手机的、屏幕以及他有形化物件的一种保护膜,类型多种多样,依据其主要用途可分成:智能手机屏幕保护膜、智能手机机身保护膜;作用由最开始的单纯性防划…

    2023年 10月 9日
  • 花呗借呗逾期协商方法

    欠支付宝花呗借呗想延期的朋友往这看,看完这个文章你就会了,当我们现支付宝花呗借呗逾期了之后,完全可以申请一个停催延期的政策,一般都可以申请一到两年,只需要做对以下三步就可以了啊。 …

    2023年 9月 4日
  • 10年前买的第一部手机

    2012年在深圳坪山比亚迪门口买的,应该是1500元左右买的中兴V889D ,本来想多看看多逛逛再买的,被卖手机的一通忽悠,就直接买了,也不知道是不是被坑了 那时候这手机刚上市,正…

    2023年 4月 14日
  • 手机来电显示未知号码扣费吗(手机来电显示收费合法吗)

    手机是我们日常生活的必需品,也带给了我们很多便利,信息传递都可以通过手机电话实现,但是很多人在接听电话时,都会发现一些不一样的问题。有的人在接听电话前,看到手机来电显示的是“未知”…

    2024年 1月 10日