共计 18541 个字符,预计需要花费 47 分钟才能阅读完成。
作者:扬州
本文次要介绍支付宝 Android 端拥抱 AndroidX 过程中的一些新 (xin) 鲜(suan)事(lei),通过文章能够理解到以下内容:
- 支付宝降级到 AndroidX 有何不同 / 难点?
- Android Studio 的 Migrate AndroidX 是如何实现的?
- APK 产物怎么适配 AndroidX?
背景
自 2018 年 Android Support 被“革了命”后,Support 扩大库被尘封,享年 28(最初的一个官网版本)。而 AndroidX 失去了社区的宽泛接收,泛滥出名框架纷纷推出 AndroidX 适配的版本,各大 App 厂家也跟进 AndroidX 降级。
不负责任的说,缺失 AndroidX 久远来看将与 Android 社区组件脱节,无奈享受到组件的保护,新的组件也难以融入,比方 Paging 3.0,CameraX 1.0.0,Hilt 1.0.0,AppSearch 1.0.0,更不用说后起新秀 Jetpack Compose。
AndroidX 业内状况
这里不细数 AndroidX 的内容,一句话概括:AndroidX 是 Support 的接班人,承接了原有 Support 28 的性能,并且继续迭代出了更多的扩大库。
通过查看某利用市场,榜单 50 的 App 软件包,剖析这些 APK 的 AndroidX 适配状况,咱们失去了一个数据,目标群体排序前 50 的有 70% 适配了 AndroidX(列表并不权威,不用过于关注排名):
利用数 | 适配 AndroidX | 百分比 |
---|---|---|
50 | 35 | 70% |
利用宝列表:[分类页面 – 利用首页]()
业内 App 适配 AndroidX 状况还是比拟好的,尽管抽样有 70% 适配了,那剩下的也有 30%,而且都是体量靠前的 App。
读到这儿,你可能就要问了:为什么还有多利用还没有适配?
在软件开发中常常会提到“技术债”,也就是说每次面临零碎重大调整,对研发人员都是一种考验。具体到每个独立的 App,架构差别、业务研发模式、组件应用诉求、研发饱和状况等,都会造成降级的阻力。
那么,同样会面临以上阻力的支付宝 App,遇见 AndroidX,会擦出怎么的“火花”?
钱包适配 AndroidX
为了让宏大的支付宝 App 顺利披上 AndroidX 的战袍,咱们须要设计一个技术计划,可能灵便和泛滥业务进行适配工作,有志愿和诉求的业务,进行深度源码适配;临时“实力不容许”的业务,咱们想方法提供兜底的计划。
AndroidX 适配点
适配 AndroidX,通过剖析计划,咱们晓得次要解决以下内容:
- Java/Class 源码,各种 support 的类,包替换
- xml 布局,替换 support 组件名字
- build.gradle,批改 dependency 中的 GAV
- proguard,混同规定替换
- pom 依赖,dependency 解决
钱包架构现状
蚂蚁的 Android 开发对支付宝的构建体系都十分相熟,他与原生是有一些差别的。这里咱们简略做个形象,以便非蚂蚁的 Android 开发能疾速理解一个全貌。
从我的项目的构建上来看,咱们能够画出两张图,我给取名别离是:“传统 Android 开发”,“支付宝 Android 开发”。这里不探讨 Android 的插件化(这简直是国内特有的风尚)。
PS:这里没有涵盖 Google Play 2021.8 月行将强推的 AAB 上架计划,感兴趣的同学能够本人脑补下大图。
比照两张图,次要区别在用 AGP 构建的差别,mPaas 目前也是钱包体系商业化的一个输入。依靠于深度的构建定制,联合钱包的运行时框架,咱们充沛的实现了业务的并行开发和和动静交付能力。如果要用几个简略的词汇来形容,我会这样表述:
- 业务隔离 =》Bundle
- 构建拆散 =》mPaas+Bundle
- 产物聚合,动静公布 =》mPaas+Portal+Bundle
这个体系长处很多,前人种树后人乘凉,然而也须要承当深度定制后遗留的痛点和坑位。
理解完了 AndroidX 的适配点和钱包的开发模式,你因该能猜到,钱包要适配 AndroidX 的遇到的第一个问题:适配须要 Java 源码或者 Class 字节码的批改,而钱包中业务是通过 APK 隔离的,简直没有 AAR。
阻力与能源
在支付宝这边,对于 Android 开发来说,咱们是有对标原生开发的,包含研发效力,编译链对齐等。
咱们降级 AndroidX 的阻力包含:
- Support 类库宽泛应用,API 兼容性挑战;
- 泛滥跨团队模块,改一下就是“百团大战”;
- 官网降级机制不实用,不实用钱包的构建;
- 布局动静容器,存在抵触。
能源也不少(不分先后):
- Android Support 已不再保护;
- AndroidX 社区融入度晋升;
- 古代 Android 开发基于 AndroidX;
- 业务上有应用的诉求。
在屡次的沟通和调整后,咱们的钻研的计划几个点要保障:
- 关联方尽量少;
- 兼容能力;
- 侵入性小;
- 可插拔的适配。
不能要求所有业务开发一起源码适配 AndroidX,否则你可能会问本人:我是谁?我在哪?我要干什么?
须要兼容自身就很少迭代的历史模块,比方 16 年开始的就没有变更的模块,你要找人配合是不是事实?
站在业务开发的立场,适配不要比官网计划更简单,尽量做到无感知适配。适配能力向 Andoird 聚拢,提供开关,不便业务选择性解决。
钱包适配实现
这里是一张新近绘制的,在构建中适配 AndroidX 的流程和卡点。
类替换
Java/Class 代码解决是针对与源码工程和 AAR 的,钱包的 bundle 是 apk,外部是编译后的 dex 和二进制 xml。在类替换环节,咱们通过解析 dex 文件构造,将 support 替换汇合中的映射关系逐个批改到 dex 中。
xml 替换
apk 中的 xml 是二进制的的 plain 格局,他不是文本文件,有本人的格局。这个格局简略来说就是 Chunk,咱们找到其中的寄存的 xml node 节点,把节点对应的值使用 support 替换汇合,批改完后从新保留为二进制的 xml。
Bundle 替换
联合后面两个步骤,失去一个新的 apk。替换 dependency 中的 bundle/devbundle 依赖。
产物
当咱们对一个业开启适配后,他的产物会发生变化。
批改实现后,咱们会输入一份 txt 报告,共开发者查看应用,这里有一份示例:
OLD: /Users/█████/work/android-phone-█████-git/build/build/outputs/apk/debug/█████-build-debug.apk
NEW: /Users/█████/work/android-phone-█████-git/build/build/bundle-cache/█████-build-debug.apk
class count: 53
xml count: 1
=================
==== DEX ====
=================
* com/alipay/android/█████/█████/█████ (3)
* com/alipay/android/█████/██████████$█████ (3)
* com/alipay/mobile/██████████/███/██████████$12 (9)
* com/alipay/mobile/█████/█/█████ (45)
* com/alipay/mobile/██/██/█████$██████████ (28)
* com/alipay/mobile/█/███/███████████████ (3)
* com/alipay/android/█████/█████/███████ (3)
* com/alipay/mobile/██████/█/██████$████ (9)
* com/alipay/mobile/███/███/█████████ (13)
* com/alipay/android/███/██/█████ (20)
* com/alipay/mobile/███/█/████$█████ (9)
* com/alipay/android/███/█████████$█████ (12)
* com/alipay/mobile/██/█/██████████████ (27)
* com/alipay/mobile/█/███/███████████████ (3)
* com/alipay/mobile/██/██/█████/████████ (9)
* com/alipay/android/██/█/██████████████████ (6)
* com/alipay/mobile/█/███/███████████████ (3)
* com/alipay/android/█████/███/██████ (23)
* com/alipay/android/██/██/████████████ (30)
* com/huawei/android/█████/████████$███████████ (2880)
* com/alipay/android/████/██████$14 (4)
* com/alipay/android/█████/██/█████████ (41)
* com/alipay/android/████/████/██████████████████ (129)
* com/alipay/android/████/████████████ (22)
* com/alipay/android/████████/███████/█████████████████ (3)
* com/alipay/mobile/████/██████/███████/█████████████████████████ (3)
* com/alipay/android/████████/████/███████████████ (18)
* com/alipay/mobile/████████/███/████████████████████████ (27)
* com/alipay/android/████████/██████████████████$21 (17)
* com/alipay/mobile/██████/██████/████████████████████████████████$██████████████████████ (6)
* com/alipay/android/████████/██████████████████$22 (8)
* com/alipay/mobile/████████/███/██████████████████$5 (9)
* com/alipay/android/████████/██████████████████$20 (6)
* com/alipay/android/████████/████/█████████████ (23)
* com/alipay/mobile/██████/██████/██████████████████████████$4 (3)
* com/alipay/mobile/██████/██████/████████████████████████████████$████████████████████ (38)
* com/alipay/mobile/██████/██████/██████████████████████████$2 (4)
* com/alipay/mobile/██████/██████/██████████████████████████$8 (6)
* com/alipay/android/████████/██████████████████ (293)
* com/alipay/mobile/██████/██████/██████████████████████████$6 (3)
* com/alipay/mobile/██████/██████/█████████/███████████████$5 (9)
* com/alipay/android/████/████████████$1$1 (11)
* com/alipay/mobile/██████/██████/████████████████████████████████ (87)
* com/alipay/android/████████/█████/██████████████████████ (7)
* com/alipay/android/████████/tab/█████████████████$2 (4)
* com/alipay/android/████████/tab/█████████████████$1 (4)
* com/alipay/mobile/██████/██████/████████████████████████████████$2$1 (7)
* com/alipay/android/████/████████████$1 (5)
* com/alipay/android/████████/████/███████████████$████████████████████$1$1 (9)
* com/alipay/mobile/████████/███/████████████$5 (9)
* com/alipay/mobile/████/████████/█████████████████████ (2)
* com/alipay/mobile/████████/███/████████████████████████$4 (9)
* com/alipay/mobile/██████/██████/██████████████████████████ (306)
Reference detail:
* com/alipay/android/████████/█████/█████████████████████ (3)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (3)
* com/alipay/android/████████/██████████████████$█████████████ (3)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (3)
* com/alipay/mobile/████████/███/████████████$12 (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/mobile/████████/███/████████████ (45)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (45)
* com/alipay/mobile/██████/██████/██████████████████████████$LoginActivityOnWindowsFocusChangeReceiver (28)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (19)
* com/alipay/mobile/████/██████/█████████████████████████ (3)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (3)
* com/alipay/android/████████/███████/████████████ (3)
| android/support/annotation/Nullable -> androidx/annotation/Nullable (3)
* com/alipay/mobile/████████/███/████████████$█████████████ (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/mobile/██████/██████/██████████████████████ (13)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (10)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (3)
* com/alipay/android/████████/████/████████████████████████ (20)
| android/support/v4/app/FragmentPagerAdapter -> androidx/fragment/app/FragmentPagerAdapter (3)
| android/support/v4/app/FragmentManager -> androidx/fragment/app/FragmentManager (11)
| android/support/v4/app/Fragment -> androidx/fragment/app/Fragment (6)
* com/alipay/mobile/████████/███/████████████████████████$█████████████ (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/android/████████/██████████████████$TabChangeTimeRunnable (12)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (12)
* com/alipay/mobile/████████/███/██████████████████ (27)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (27)
* com/alipay/mobile/base/config/ConfigServiceLmacSyncCallback (3)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (3)
* com/alipay/mobile/██████/██████/█████████/███████████████ (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/android/████████/████/█████████████████████████████████████████ (6)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (6)
* com/alipay/mobile/█████/█████/████████████████████ (3)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (3)
* com/alipay/android/████████/████/███████████████ (23)
| android/support/v4/app/Fragment -> androidx/fragment/app/Fragment (7)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (16)
* com/alipay/android/████████/████/████████████████████ (30)
| android/support/v4/view/ViewPager -> androidx/viewpager/widget/ViewPager (18)
| android/support/v4/app/FragmentManager -> androidx/fragment/app/FragmentManager (7)
| android/support/v4/view/PagerAdapter -> androidx/viewpager/widget/PagerAdapter (5)
* com/huawei/android/██████████/███████████████$████████████████████ (2880)
| android/support/v4/view/ViewPager -> androidx/viewpager/widget/ViewPager (277)
| android/support/v4/app/FragmentManager -> androidx/fragment/app/FragmentManager (166)
| android/support/v4/app/Fragment -> androidx/fragment/app/Fragment (270)
| android/support/v4/view/PagerAdapter -> androidx/viewpager/widget/PagerAdapter (92)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (1018)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (542)
| android/support/v4/view/ViewPager$OnPageChangeListener -> androidx/viewpager/widget/ViewPager$OnPageChangeListener (105)
| android/support/v4/app/FragmentTransaction -> androidx/fragment/app/FragmentTransaction (144)
| android/support/v4/util/ArrayMap -> androidx/collection/ArrayMap (106)
| android/support/v4/app/FragmentPagerAdapter -> androidx/fragment/app/FragmentPagerAdapter (52)
| android/support/v4/content/ContextCompat -> androidx/core/content/ContextCompat (48)
| android/support/annotation/Nullable -> androidx/annotation/Nullable (26)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (34)
* com/alipay/android/████████/██████████████████$14 (4)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (4)
* com/alipay/android/████████/tab/█████████████████ (41)
| android/support/v4/util/ArrayMap -> androidx/collection/ArrayMap (41)
* com/alipay/android/████████/████/██████████████████ (129)
| android/support/v4/view/ViewPager -> androidx/viewpager/widget/ViewPager (69)
| android/support/v4/view/ViewPager$OnPageChangeListener -> androidx/viewpager/widget/ViewPager$OnPageChangeListener (39)
| android/support/v4/view/PagerAdapter -> androidx/viewpager/widget/PagerAdapter (21)
* com/alipay/android/████/████████████ (22)
| android/support/v4/app/Fragment -> androidx/fragment/app/Fragment (5)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (14)
| android/support/annotation/Nullable -> androidx/annotation/Nullable (3)
* com/alipay/android/████████/███████/█████████████████ (3)
| android/support/annotation/Nullable -> androidx/annotation/Nullable (3)
* com/alipay/mobile/████/██████/███████/█████████████████████████ (3)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (3)
* com/alipay/android/████████/████/███████████████ (18)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (18)
* com/alipay/mobile/████████/███/████████████████████████ (27)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (27)
* com/alipay/android/████████/██████████████████$21 (17)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (17)
* com/alipay/mobile/██████/██████/████████████████████████████████$██████████████████████ (6)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (6)
* com/alipay/android/████████/██████████████████$22 (8)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (8)
* com/alipay/mobile/████████/███/██████████████████$5 (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/android/████████/██████████████████$20 (6)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (6)
* com/alipay/android/████████/████/█████████████ (23)
| android/support/v4/view/ViewPager$OnPageChangeListener -> androidx/viewpager/widget/ViewPager$OnPageChangeListener (7)
| android/support/v4/view/ViewPager -> androidx/viewpager/widget/ViewPager (16)
* com/alipay/mobile/██████/██████/██████████████████████████$4 (3)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (3)
* com/alipay/mobile/██████/██████/████████████████████████████████$████████████████████ (38)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (29)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/mobile/██████/██████/██████████████████████████$2 (4)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (4)
* com/alipay/mobile/██████/██████/██████████████████████████$8 (6)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (6)
* com/alipay/android/████████/██████████████████ (293)
| android/support/v4/app/Fragment -> androidx/fragment/app/Fragment (23)
| android/support/v4/util/ArrayMap -> androidx/collection/ArrayMap (3)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (184)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (77)
| android/support/annotation/Nullable -> androidx/annotation/Nullable (6)
* com/alipay/mobile/██████/██████/██████████████████████████$6 (3)
| android/support/annotation/Nullable -> androidx/annotation/Nullable (3)
* com/alipay/mobile/██████/██████/█████████/███████████████$5 (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/android/████/████████████$1$1 (11)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (11)
* com/alipay/mobile/██████/██████/████████████████████████████████ (87)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (69)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (18)
* com/alipay/android/████████/█████/██████████████████████ (7)
| android/support/annotation/NonNull -> androidx/annotation/NonNull (7)
* com/alipay/android/████████/tab/█████████████████$2 (4)
| android/support/v4/util/ArrayMap -> androidx/collection/ArrayMap (4)
* com/alipay/android/████████/tab/█████████████████$1 (4)
| android/support/v4/util/ArrayMap -> androidx/collection/ArrayMap (4)
* com/alipay/mobile/██████/██████/████████████████████████████████$2$1 (7)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (7)
* com/alipay/android/████/████████████$1 (5)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (5)
* com/alipay/android/████████/████/███████████████$████████████████████$1$1 (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/mobile/████████/███/████████████$5 (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/mobile/████/████████/█████████████████████ (2)
| android/support/v4/content/ContextCompat -> androidx/core/content/ContextCompat (2)
* com/alipay/mobile/████████/███/████████████████████████$4 (9)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (9)
* com/alipay/mobile/██████/██████/██████████████████████████ (306)
| android/support/v4/app/FragmentActivity -> androidx/fragment/app/FragmentActivity (202)
| android/support/v4/content/LocalBroadcastManager -> androidx/localbroadcastmanager/content/LocalBroadcastManager (22)
| android/support/v4/app/FragmentManager -> androidx/fragment/app/FragmentManager (36)
| android/support/v4/app/FragmentTransaction -> androidx/fragment/app/FragmentTransaction (38)
| android/support/v4/app/Fragment -> androidx/fragment/app/Fragment (8)
=================
==== XML ====
=================
* res/layout/███████████████.xml (1)
Reference detail:
* res/layout/███████████████.xml (1)
| android.support.v4.view.ViewPager -> androidx.viewpager.widget.ViewPager
基于 apk 进行 androidx 适配的能力,咱们封装为了一个独立的 jar 工程,既能够集成到 Gradle Plugin 中应用,也能够公布为命令行工具应用。上面介绍下命令行的应用:
bx --input=src/test/resources/█████ .apk --output=build/intermediate
user % bx --help
___ __ _ ___ __
/ | ____ ____/ /________ (_)___/ / |/ /
/ /| | / __ / __ / ___/ __ / / __ /| /
/ ___ |/ / / / /_/ / / / /_/ / / /_/ // |
/_/ |_/_/ /_/__,_/_/ ____/_/__,_//_/|_|
Translate apk to compat with AndroidX dependency.
Usage: bx [OPTIONS] [ARGS]...
Options:
--help 显示帮忙信息
--input 待处理 apk 门路, 示例: --input=input.apk
--output 解决后产物目录, 示例: --output=output-dir
--clean 清理两头生成物, 示例: --clean=true
--verbose 输入调试的日志, 示例: --verbose=true
--jetify 应用 jetify 解决, 示例: --jetifye=true
构建平台打包,依据包类型不同,所须要编译的工程模块,插件逻辑如覆盖率插桩等,都有差别。因而不同类型的构建整体耗时有差别。androidx 的增量耗时次要源自于集中式的本义的模块体量,随着独立适配模块数量的减少,集中耗时将逐渐缩小,依据数据采集剖析,目前做一次全量的本义耗费工夫比较稳定。最终现实状况是总包的构建根本不减少额定耗时。
将 bx 使用到钱包的构建插件后,可基于 portal 基线做批量的 bundle 兼容。开启兼容能力后,对整体构建工夫有肯定增量,通过继续优化能够逐渐缩小增量耗时。
原生的适配
Google 自身提供了一天真对 aar 的适配计划,这部分能够间接上手。该套计划有三种应用形式:
- 一是通过 AS 的 Migrtate AndroidX,这要求 AGP 版本为 3.2.0 或更高;
- 二是通过命令行,独自执行 jar 应用程序,这与上下文无关;
- 三是源码革新,参考 AGP 的外部实现,去联动 Jetify 模块。
./jetifier-standalone -i <source-library> -o <output-library>
对于 Jetify 的介绍,这里摘录了一段文档阐明:
Jetifier 会迁徙指向 android.support. 软件包的 Java、XML、POM 和 ProGuard 援用,更改它们以使其指向相应的 androidx. 软件包。
因为 android.support. 的 ProGuard 通配符并不总是间接映射到 androidx. 软件包,因而 Jetifier 会生成所有符合条件的代替项。
如果 android.support.* 软件包中的某个类型不是来自任何反对库工件,那么只有该类型存在相干的映射,Jetifier 就会迁徙该类型。然而,不能保障此迁徙肯定可行,因为可能没有足够通用的映射规定来涵盖所有自定义类型。
这个工具甚至能够反向执行,把 androidx 产物转位 supportg 产物,感兴趣能够试一下,- r 参数。
在 AS 中,咱们开启 gradle 参数配置后能够激活 jetify 机制,这个机制会对 dependency 依赖进行预处理,将依赖了 support 扩大库的 aar 编译为 androidx 版本。
android.useAndroidX=true
android.enableJetifier=true
具体到代码实现,则是利用了 Gradle 的 Artifact Transform 机制,对依赖的 aar 文件拆解解决。相干源码能够参考:com.android.build.gradle.internal.dependency.JetifyTransform
这个 transform 中,最终会调用后面提到的 jetify 工具,Google 将工具做成了独立的 maven 依赖:
androidx.jetifier:jetifier-core:1.0.0-beta10
https://developer.android.com…
后续
目前支付宝 App 曾经实现的大部分业务的适配工作,局部有侵入性应用 Support 扩大库,如反射实例化 View 的须要业务进行适配。计划灰度也在继续推动当中。
除了 AndroidX 之外,咱们也在推动 Kotlin,Java8 等在钱包构建体系的落地,期待钱包在实现 AndroidX 降级之后,全业务能够向原生化,古代 Android 开发更近一步。
欢送也在踊跃拥抱 AndroidX 的小伙伴们,一起留言交换,独特探讨适配 AndroidX 的教训 / 教训。
关注咱们,每周 3 篇挪动技术实际 & 干货给你思考!