作者:小虾米君 谈到Jetpack,大家都以为是一堆框架,事实上它的内容要大的多。本文以大家熟知的Preference组件为切入点,逐步探究它的前世今生。透过Preference组件的变迁,看懂Support库、AndroidX、Jetpack之间的关系 Preference作为设置画面的标准实现,大家都不陌生。这个组件跟随Android系统一同诞生,之后便不断地变更。先是Support库中出现了独立版本,接着整合到了AndroidX中,最后在Android10的时候完全废弃了SDK版本。 1。Preference的设计 Preference组件的API设计得非常简单、清晰。PreferenceActivity或PreferenceFragment管理画面的生命周期和事件交互PreferenceScreen构建整个设置列表PreferenceCategory和Preference展示一组或单个设置条目 2。落寞的SDK Preference组件是Android1。0发布就引入的元老级组件,那会RecyclerView还未推出,自然采用经典的ListView构建整个设置列表。 使用起来非常简单,跟普通视图的写法并无二致。PreferenceScreenandroid:titlestringmypreferencesettingsPreferenceCategoryandroid:titlestringmypreferencegeneralPreferenceandroid:fragmentcom。android。settings。applications。ManageApplicationsandroid:keyappandroid:titlestringmypreferencegeneralappsPreferenceCategory。。。PreferenceScreenpublicclassSettingsActivityextendsPreferenceActivity{publicvoidonCreate(Bundlebundle){super。onCreate(bundle);addPreferencesFromResource(R。xml。mypreferencelayout);}} 原理也不复杂:PreferenceManager和PreferenceInflater负责解析Preference布局构建Preference实例树PreferenceScreen采用Preference实例树创建PreferenceGroupAdapter实例,并绑定到ListView视图AdatpergetView()回调到各Preference组件的onBindView()去准备相应的View视图 ListView的性能欠佳,不再适应复杂的设置画面,尤其是内容众多的系统设置App。3。混战的Support库 Support库是为新API提供向后兼容性的支持库,包含大量应用组件、视图、MaterialDesign等功能类。重新改写的Preference组件也包含其中。 依据兼容API版本的不同,Support库的分支众多且凌乱,使用起来也愈发繁琐和呆板。 V7包 Preference组件的变更首次出现在Support库的V7包,主要是将SDK版本的Preference组件拷贝过来进行了重写。 对外的API只是微调,区别大体集中在内部的实现细节上:不再提供专用的PreferenceActivity,只提供面向Fragment的专用类构建设置列表的PreferenceScreen改为性能更加优秀的RecyclerView来实现新增PreferenceViewHolder类,用以复用设置条目的视图Preference移除onBindView()API,新增onBindViewHolder()来向RecyclerView提供条目的视图另外,针对实现变化较大的API,在原有命名上增加Compat字样,比如PreferenceFragment改为PreferenceFragmentCompat。 使用的话需导入额外依赖:implementationcom。android。support:preferencev7:28。0。0 另外要注意的是Fragment里加载布局的API由addPreferencesFromResource()改为setPreferencesFromResource()。由于API只是微调,其他使用起来几乎没有变化。publicstaticclassPrefsFragmentextendsPreferenceFragmentCompat{OverridepublicvoidonCreatePreferences(BundlesavedInstanceState,StringrootKey){setPreferencesFromResource(R。xml。preferences,rootKey);}} V14包 第二次变更发生在V14包,区别只是将命名里的Compat字样去掉了,弱化了和SDK版本的API差异。 比如:PreferenceFragmentCompatPreferenceFragmentSwitchPreferenceCompatSwitchPreferencePreferenceDialogFragmentCompatPreferenceDialogFragment 导入只需要细微调整即可:implementationcom。android。support:preferencev14:28。0。0 V17包 随着Android系统逐渐流行到TV等大屏设备,Google推出了Leanback导航模式,并引入到了V17中。Preference组件也针对Leanback模式进行了跟进,新增了一系列新组件。 4。一统江湖的AndroidX Support库愈加臃肿的分支和呆板的管理方法困扰着开发者。Google同样不胜其烦,终于推出了AndroidX。期望采用全新的包名和版本管理方法彻底解决这个困境。 比如Support库各分支下Preference组件在AndroidX下的对应关系: 使用也很方便,只需指定对应的包名和版本即可:defpreferenceversion1。1。1implementationandroidx。preference:preference:preferenceversion AndroidX和原有Support库的API对应关系,可以到官方的映射表里进行查询:包的关系:https:developer。android。comjetpackandroidxmigrateartifactmappings类的映射关系:https:developer。android。google。cnjetpackandroidxmigrateclassmappings 和Support库到底有无区别? 将最核心的Preference类进行对比,可以发现:除了格式、书写风格的差异以外,代码逻辑几乎完全一致。 再比如AndroidX里提供的PreferenceFragment类,其实现和Support库的版本几乎是一样的。 AndroidXreplacestheoriginalsupportlibraryAPIswithpackagesintheandroidxnamespace。OnlythepackageandMavenartifactnameschanged;class,method,andfieldnamesdidnotchange。 像官方描述的那样,AndroidX是针对Support库的整合和替代,区别仅仅体现在仓库的地址和包名。正因为此,AndroidX拥有清晰统一的版本管理,开发者能便捷和灵活地使用。 ROM开发需留意 之前,Preference组件等新API分散在Support库的各个分支包里,源文件也会集成到AOSP源码,ROM厂商可以修改。 比如V14包的Preference组件在AOSP源码的对应位置如下。 frameworkssupportv14preferencesrcandroidsupportv14preference Android9开始整合到了AndroidX里,但为了过渡,源文件在AOSP源码里仍然保留。也就是我们仍然可以修改其源码。 frameworkssupportpreferencesrcmainjavaandroidxpreference Android10开始全面转向AndroidX,彻底废弃Support库的使用。AOSP源码里也不再集成源文件,只提供了对应的AAR包,这也使得ROM厂商更改实现变得困难,需要额外留意。 prebuiltssdkcurrentandroidxm2repositoryandroidxpreference 如何迁移至AndroidX 为了简化向后兼容的开发工作,将Support库全面迁移至AndroidX极为必要,设置如下的Gradle插件标志即可。android。useAndroidX:Android插件会使用对应的AndroidX替代Support库android。enableJetifier:Android插件会通过重写其二进制文件来自动迁移现有的第三方库,以使用AndroidX依赖项 当然在AndroidStudio菜单里也可以手动地迁移至AndroidX:MenuRefactorMigratetoAndroidX。 更详细的迁移细节可以参考如下这篇文章: https:www。jianshu。comp41de8689615d AndroidX的构成 依照官方提供的AndroidX构成列表,我概括并制作了一张AndroidX的构成图。 可以看到,实际上AndroidX在集成了Support库的以外,还涵盖了众多知名的Jetpack框架,这些框架实际上来源于2017年发布的AndroidArchitectureComponents(AAC)。5。短暂的AAC库 AndroidApp开发有很多痛点,包括ActivityFragment生命周期的管理较为呆板,线程间数据传递的复杂,SQLite封装的繁琐等等。为了改善这些状况并对App架构进行指导,GoogleIO2017上发布了AndroidArchitectureComponents,简称AAC。 它包含了几个较为经典的框架:LifecycleLiveDataViewModelRoom其他的还有Paging、Navigation和WorkManager 同时Google还给Android开发者展示了推荐的应用架构,随着Jetpack家族的日益壮大,先在看来这个架构图略显简单。 AAC库在完善的过程中,和Support库一起,也逐步往AndroidX中迁移,并孕育出一个更大更强的概念Jetpack。6。Jetpack又是何方神圣 短短一年后,AndroidArchitectureComponents就退出了舞台,GoogleIO2018上发布了全新的Jetpack开发套件。 Jetpack的官方构成图可以看出来:核心的Architecture模块涵盖了熟知的框架,前身就是去年发布的AAC库以及从Support库整合过来的包,比如Preference、Framgent、AppCompat等除此之外,还包括KTX和Test工具包等 AndroidJetpackisasetoflibraries,toolsandarchitecturalguidancetohelpmakeitquickandeasytobuildgreatAndroidapps。Itprovidescommoninfrastructurecodesoyoucanfocusonwhatmakesyourappunique。 所以说,将Jetpack理解为一系列框架不够准确。实际上它是包含了框架、KTX、开发工具和开发向导的开发套件,期望在多个层面提升与Android开发的效率。提供AndroidApp开发的最佳实践消除大量的样板代码,帮助开发者更轻松地编写优质应用提供向后兼容性,在不同版本、不同配置的设备上提供一致性的开发体验改变混乱的散碎的版本管理 和AndroidX到底啥关系? Jetpack开发套件的源码管理在AndroidX内,包括之前的Support库,还有后来吸收的AAC库等等。简要绘制了一下Jetpack的演变图。(画着画着,竟画成了Android机器人的形象,哈哈) 非要总结下Jetpack和AndroidX关系的话,像fundroid大神描述的那样比较贴切。 AndroidX是对SDK以外API的内部管理包,Jetpack则是对外宣传的开发套件。 AndroidX的名字也很酷啊,那为什么不直接用它来进行宣传?个人的一些理解:AndroidX的命名过于抽象、不易理解,也没有特别的含义Jetpack本意是喷气背包、助推器的意思,它更能传达助力开发效率腾飞的设计初衷,也易于理解和传颂。再搭配上AndroidLogo塑造一个火箭机器人的形象,非常有趣和具备辨识度7。Jetpack大事记2011年3月,Support库V4包发布首个版本2014年10月,Support库新增RecyclerView,AppCompat支持2015年8月,Support库新增Preference支持2016年2月,Support库新增VectorDrawable支持2017年5月17日,GoogleIO2017宣布推出AndroidArchitectureComponents2017年9月21日,AndroidArchitectureComponents1。0。0beta版正式发布2018年3月,Support库代码逐步整合至AndroidX2018年5月8日,AndroidArchitectureComponents的代码逐步迁至AndroidX2018年9月21日,GoogleIO2018推出AndroidX,Jetpack开发套件一同发布,Support库终结并转向AndroidX2019年5月7日,JetpackCameraX1。0。0alpha版发布2020年7月22日,JetpackHilt1。0。0alpha版发布2021年3月10日,Compose1。0。0beta版发布 8。Google野望 Android的分支众多、迭代太快,开发者疲于应对。Google一直在试图改变这种混乱局面,从经典的Support库,到变革的AAC库,再到持续火爆的Jetpack套件。 与此同时,随着Android系统愈加完善,SDK也趋于稳定,一年一度的OSV终将是小修小补。但行业的持续发展必将催生层出不穷的新理念、新技术。Google自然不会停下脚步,它将以更高频次、更大范围的动作去变革和应对,而这多将聚焦在SDK以外的领域,比如Jetpack、MAD等。 MAD,全称ModernAndroidDevelopment,是Google针对Android平台的全新开发理念。它站在比Jetpack更高的视野,旨在通过语言、工具、发行格式、框架等多个层面去指导新型的Android开发。 在Jetpack套件以外MAD还囊括了诸多内容,包括:持续改进的官方IDE,AndroidStudioAndroid平台首推的Kotlin开发语言先进的AndroidAppBundle发行格式未来的UI开发方式Compose工具包 可以说,MAD是每个Android开发者都应了解和掌握的重要技术,后续我将解读这个全新的开发理念。最后 在这里还分享一份由大佬亲自收录整理的学习PDF架构视频面试文档源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。 当然,你也可以拿去查漏补缺,提升自身的竞争力。 真心希望可以帮助到大家,Android路漫漫,共勉! 如果你有需要的话,只需私信我【进阶】即可获取