请选择 进入手机版 | 继续访问电脑版

雨林木风

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3|回复: 0

Android支持库迁移到AndroidX

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
31551
发表于 2021-2-23 11:00:33 | 显示全部楼层 |阅读模式
  Android体例版本正在连续更新,从最初的Android 1.0到现正在Google和各大手机厂商正正在推的Android 10,均匀下来每个年月都有一个大的版本更新。但用户正正在用的手机上的Android体例版本往往更新上来有个进程,如方今时点不少App最低声援的Android体例版本仍然4.4。新的Android体例版本更新,断定会带来极少新的体例蜕变,同时也为斥地者带来了新的性能接口或Api技能。既要声援老的体例版本,又要具备新的Api性能,怎样办呢?
  很自然的,Android官方供应了声援库(android.support.*)。声援库的对应版本中,包罗了可能声援到的完全的最低版本的,同时具有新的性能供应的完全完毕及接口。完毕起来实在也还浅易,根本道理是将新的体例上的Api抽取出来,放到声援库中,斥地者引入声援库后,最终是会打包到Apk包中的。于是,通过引入声援库,既不影响最低声援的版本,又具有了新的Android体例性能。
  从最初的Android Support v4到其后的v7,v13,以及正在这此中对声援库的内部拆分,使得斥地者可能完全的去引入本身必要的子库。声援库正在连续的演变。同时,声援库完全版本的最低声援版本的,也正在发作着蜕变,如v4,从最初寄义上的最低声援API 4到其后的9、14等,寄义的蜕变,使得斥地者引入时,不得不郑重核实。且声援库为了欺骗Android体例自己的极少或者的新技能,每个版本的如v4的声援库内部,又针对区别的编译版本,划分出了众个声援库细分版本。其后,斥地者引入时,必要引入与方今项目编译版本相对应的,且必要满意方今项目最低声援版本的完全声援库修筑版本。如常睹的写法com.android.support:recyclerview-v7{supportVersion},此中${supportVersion}必要与项目编译版本依旧一概,起码必要正在大的版本Api Level上必要依旧一概。
  最终导致的一个题目是,斥地者往往会很不解,引入声援库时,真相该当怎样写。
  自然,官方也认识到了这个题目。繁杂的声援库转化,不单斥地者未便当操纵,官方庇护也阻挡易。于是,是时辰对声援库举办一次联合的梳理了。
  AndroidX 是 Android 团队用于正在 Jetpack中斥地、 测试、打包和发外库以及对其举办版本驾御的开源项目。 AndroidX 对原始 Android 声援库举办了宏大订正。 与声援库相通,AndroidX 与 Android 操作体例分裂供应, 并与各个 Android 版本向后兼容。 AndroidX 所有庖代了声援库,不单供应一概的性能, 况且供应了新的库。别的,AndroidX 还搜罗以下性能: AndroidX 中的全体软件包都操纵一概的定名空间,以字符串 androidx 发轫。 声援库软件包已照射到对应的 androidx.* 软件包。 相合全体旧类到新类以及旧编译工件到新编译工件的完好照射,请参阅软件包重构页面。 与声援库区别,AndroidX 软件包会孑立庇护和更新。 androidx 软件包操纵厉刻的语义版本驾御,从版本 1.0.0 起先。 您可能孑立更新项目中的 AndroidX 库。 全体新声援库的斥地作事都将正在 AndroidX 库中举办。 这搜罗庇护原始声援库工件和引入新的 Jetpack 组件。
  浅易点说便是,对App斥地者而言,AndroidX尤其友情,由于咱们引入时,只必要眷注AndroidX中完全的必要引入的构件版本即可。且大个别完全的构件,具有一概的版本号。斥地者操纵起来不再必要眷注项目自己的最低声援版本和编译版本了,只必要像引入其他的第三方库相通,v1.0、v2.0、v3.0这种格式引入即可。
  AndroidX对斥地者操纵尤其友情,同时,声援库文档上官方曾经真切声援库后续不再庇护。别的,正在Android Studio上新筑模块时,也觉察若是没有迁徙到AndroidX,模块创筑不了,解说起先有强制性的方法使得斥地者必需迁徙到AndroidX。
  这也阐述了,欺骗官方内置的迁徙格式迁徙AndroidX之前,工程境况上最好满意如下前提:
  Refactor Migrate to AndroidX操作后,AS会有对应的迁徙指点,提示你去备份项目文献,如有须要可能先备份。但凡是而言,AS项目都是基于Git举办处理,直接孑立切一个分支举办迁徙操作即可,此处备份成zip实际意旨不大。
  点击Do Refactor确认迁徙,AS自愿践诺迁徙AndroidX的更换进程。如将对应的声援库类名、包名、构件名等都更换成相应的AndroidX形态。
  一点年光后,主工程更换竣事。此时翻开gradle.properties,会觉察自愿增加了如下设备项。
  大致的兴味是操纵JetifyTransform对fingerprint-1.1.1.aar举办更换进程中,崭露了题目。但完全题目没有进一步的提示音讯。于是,直接通过下令践诺下修筑看一下:
  咱们觉察,JetifyTransform内部操纵了ASM,正在对aar举办ClassReader的进程中扔出了相当。而且从纰谬栈音讯上看,该当有一类叫jetifier的东西,是正在这个东西中挪用的ASM操作。
  较着,该当是fingerprint-1.1.1.aar中有字节码有题目。经查,fingerprint内部直接以jar格式引入了三星的指纹识别库,曾经很对照老的版本了,经生意同窗确认,现正在曾经可能直接去除。
  去除fingerprint内部的三星指纹库后,升级版本,下载对应的aar文献后,再次实验转化:
  主工程更新fingerprint对应依赖版本后,从头践诺修筑,崭露纰谬提示:
  改良EventLiveData类中的重写设施的对应形参,与接口依旧一概即可。
  此时修筑凯旋,是不是就真的都打点好了呢,是不是都没题目了呢。较着不是的。
  最先,分歧查看主工程对应的编译时和运转时依赖,看看是否都从android.support.*更换成了androidx.*。
  谨慎对照后觉察,固然依赖中都曾经被更换成了androidx.*。但编译时的依赖中含有大方的rc01。如:
  而正在build.gralde中直接引入的写法,是被相应更换了的。曾经被无误更换成了:
  处分起来很浅易,直接正在dependencies.gradle文献中,将android.support.*对应人工更换成androidx.*形态,并从头标准定名和版本,相应改良对应的被操纵到的地方,并改良成联合的AndroidX依赖写法。
  1,主工程中是否有声援库干系的极少分外的写法,结果会跟上面的dependencies.gradle相通,不行被自愿识别并迁徙?比如反射?字符串?乃至字符串拼接?等等。
  2,原有依赖库android.support.*断定会有极少混浊设备,现正在迁徙成androidx.*后,混浊设备这块何如对应打点?
  3,自愿迁徙时,依赖库与主工程实在是不相通的时间道理。较着,主工程采用的是对源文献的相应更换,而依赖库曾经是编译后的class等二进制文献,采用的是ASM字节码操作,那是否也还存正在极少不行被ASM操作的非常情景?比如反射?字符串?乃至字符串拼接?等等。
  第一个题目实在对照好打点,主工程直接整体探求如android.support环节字,对探求结果逐一鉴别,对应打点即可。最终首要觉察的可疑难题有两处:
  第二个题目,项目中对声援库正在混浊设备中有举办keep,此时必要针对AndroidX添加上对应的设备:
  并天生release的Apk,查看修筑时的混浊联系文献,或反编译落后一步确认对应的类是否有被混浊。
  第三个题目,实在必然水准上与第四个题目好像。选用的格式可能是针对最终修筑的包,选用反编译的格式,查到对应的如android.support环节字,并核实androidx.*等环节类。
  此处可能操纵jadx,将天生的DevDebug变体的Apk中的dex,一一检视。很速,也觉察了两个题目:
  1,天生的Apk中如故含有android.support.*发轫的包和类文献,但之前确认的运转时依赖联系中,确实曾经没有了对应的android.support.*依赖,这是怎样回事呢?
  正本,并不是全体的类的包名都被更换成了androidx.*形态,如官方文档列出真实实有个别类以如故保存了原有的完好类名。
  还好这是项目本身的的依赖库,相应改良后,从头发外版本,更新主工程依赖即可。
  AndroidX的崭露,显露原有的Android声援库起先退出史乘舞台。行动Jetpack套件的一个别,AndroidX具有更易操纵,便当庇护等特色。但本色上,咱们该当认识到,AndroidX与原有Android声援库性能和职责定位上目前仍然相通的。
  正在将Android声援库迁徙到AndroidX进程中,实情上涉及到的题目,是比官方文档上寥寥数语是要丰富的。越发涉及到第三方依赖库和混浊,以及反射等干系的极少分外写法也极度值得钟情,往往一不小心,一个深坑或者就留下了。
  jadx正在对Apk的反编译等方面确实极度健壮,只是操纵上,对照占内存,有时对照卡。其健壮的文本探求、操纵跟踪等性能,正在核实迁徙到AndroidX等必要反编译Apk的干系用途上极度有效。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

|appname
快速回复 返回顶部 返回列表