作者:扬州
本文次要介绍支付宝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 篇挪动技术实际&干货给你思考!
发表回复