01-17-04 Support Library的演进历史

张开发
2026/5/7 11:46:54 15 分钟阅读
01-17-04 Support Library的演进历史
01-17-04 Support Library的演进历史Support Library是什么Support Library支持库是Google提供的兼容性库让新特性可以在老设备上使用。核心理念Write once, run on any Android version诞生背景Android碎片化问题2011年Android生态 - Android 2.3API 9-1060% - Android 3.0API 115% - Android 4.0API 1410% - 其他版本25%开发者困境想用FragmentAPI 11放弃60%用户想用ActionBarAPI 11放弃60%用户兼容低版本写大量条件判断代码Google的解决方案2011年Google发布Support Library v4!-- 在API 9的设备上使用Fragment --dependencygroupIdcom.android.support/groupIdartifactIdsupport-v4/artifactIdversion19.1.0/version/dependencySupport Library家族1. support-v4最低支持API 4Android 1.6核心组件// Fragmentimportandroid.support.v4.app.Fragment;importandroid.support.v4.app.FragmentActivity;// ViewPagerimportandroid.support.v4.view.ViewPager;// Loaderimportandroid.support.v4.content.Loader;importandroid.support.v4.content.CursorLoader;// LocalBroadcastManagerimportandroid.support.v4.content.LocalBroadcastManager;使用示例// 在API 9的设备上使用FragmentclassMyFragment:Fragment(){overridefunonCreateView(inflater:LayoutInflater,container:ViewGroup?,savedInstanceState:Bundle?):View?{returninflater.inflate(R.layout.fragment_my,container,false)}}classMainActivity:FragmentActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)supportFragmentManager.beginTransaction().replace(R.id.container,MyFragment()).commit()}}2. support-v7-appcompat最低支持API 7Android 2.1核心组件// AppCompatActivityimportandroid.support.v7.app.AppCompatActivity;// Toolbarimportandroid.support.v7.widget.Toolbar;// ActionBarimportandroid.support.v7.app.ActionBar;使用示例// 在Android 2.1上使用Material Design风格的ToolbarclassMainActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)valtoolbarfindViewByIdToolbar(R.id.toolbar)setSupportActionBar(toolbar)supportActionBar?.apply{setDisplayHomeAsUpEnabled(true)setTitle(My App)}}}3. support-v7-recyclerview最低支持API 7importandroid.support.v7.widget.RecyclerViewimportandroid.support.v7.widget.LinearLayoutManager// 在所有Android版本使用RecyclerViewclassMyAdapter:RecyclerView.AdapterMyViewHolder(){overridefunonCreateViewHolder(parent:ViewGroup,viewType:Int):MyViewHolder{valviewLayoutInflater.from(parent.context).inflate(R.layout.item_view,parent,false)returnMyViewHolder(view)}overridefunonBindViewHolder(holder:MyViewHolder,position:Int){// 绑定数据}overridefungetItemCount()dataList.size}4. support-designMaterial Design组件importandroid.support.design.widget.FloatingActionButtonimportandroid.support.design.widget.Snackbarimportandroid.support.design.widget.CoordinatorLayoutimportandroid.support.design.widget.AppBarLayoutimportandroid.support.design.widget.NavigationView// 在API 14使用Material DesignvalfabfindViewByIdFloatingActionButton(R.id.fab)fab.setOnClickListener{Snackbar.make(it,Action clicked,Snackbar.LENGTH_SHORT).show()}Support Library实现原理1. 完整重实现// support-v4中的Fragment是完整重新实现的packageandroid.support.v4.app;publicclassFragment{// 不依赖系统Fragment完全独立实现privateFragmentManagermFragmentManager;privateStringmTag;privateintmStateINITIALIZING;publicvoidonCreate(BundlesavedInstanceState){// 完全自定义的生命周期管理}}优点完全控制行为所有版本表现一致可以修复系统Fragment的Bug缺点代码量大维护成本高应用体积增加2. 条件委托// ContextCompat中的权限检查publicstaticintcheckSelfPermission(Contextcontext,Stringpermission){if(Build.VERSION.SDK_INT23){// API 23调用系统方法returncontext.checkSelfPermission(permission);}else{// API 23以下检查权限是否在Manifest中声明returncontext.getPackageManager().checkPermission(permission,context.getPackageName());}}优点代码量小充分利用系统能力缺点不同版本行为可能不一致3. 主题样式适配!-- support-v7-appcompat的主题继承 --stylenameTheme.AppCompat.LightparentBase.Theme.AppCompat.Light/!-- API 21 -- style nameBase.Theme.AppCompat.LightparentPlatform.AppCompat.Light item nameandroid:colorPrimarycolor/primary_material_light/item/style!-- API 14-20 --stylenameBase.Theme.AppCompat.LightparentPlatform.AppCompat.Light!-- 使用自定义View模拟Material Design --/styleSupport Library的问题1. 版本号混乱dependencies { implementation com.android.support:support-v4:28.0.0 implementation com.android.support:appcompat-v7:28.0.0 implementation com.android.support:recyclerview-v7:28.0.0 implementation com.android.support:design:28.0.0 // 版本必须完全一致否则编译失败 // 管理成本高 }2. 命名混乱support-v4最低支持API 4不现在最低API 14 support-v7最低支持API 7不现在最低API 14 support-v13最低支持API 13对但没人用实际情况v4和v7最低都是API 14命名与实际不符3. 包名长importandroid.support.v7.app.AppCompatActivityimportandroid.support.v7.widget.RecyclerViewimportandroid.support.v4.view.ViewPagerimportandroid.support.design.widget.FloatingActionButton// 每次导包都很长4. 依赖冲突应用依赖support-v4:27.1.0 第三方库Asupport-v4:28.0.0 第三方库Bsupport-v4:26.1.0 编译失败All com.android.support libraries must use the exact same versionAndroidX的诞生2018年Google I/O宣布AndroidX取代Support Library。重新设计的包名// 旧的Support Libraryimportandroid.support.v7.app.AppCompatActivityimportandroid.support.v4.view.ViewPagerimportandroid.support.design.widget.FloatingActionButton// 新的AndroidXimportandroidx.appcompat.app.AppCompatActivityimportandroidx.viewpager.widget.ViewPagerimportcom.google.android.material.floatingactionbutton.FloatingActionButton命名规则androidx.feature.module androidx.appcompat.app.AppCompatActivity androidx.recyclerview.widget.RecyclerView androidx.fragment.app.Fragment独立版本号dependencies { // AndroidX每个库独立版本 implementation androidx.appcompat:appcompat:1.6.1 implementation androidx.recyclerview:recyclerview:1.3.2 implementation androidx.fragment:fragment-ktx:1.6.2 // 不再要求版本号一致 }语义化版本androidx.appcompat:appcompat:1.6.1 │ │ │ │ │ └─ 补丁版本Bug修复 │ └─── 次版本新功能 └───── 主版本Breaking Change迁移到AndroidXAndroid Studio迁移工具Refactor → Migrate to AndroidX自动处理更新Gradle依赖修改import语句更新XML布局文件手动迁移// gradle.properties android.useAndroidXtrue android.enableJetifiertrue // 自动转换第三方库// 旧代码importandroid.support.v7.app.AppCompatActivityimportandroid.support.v4.content.ContextCompat// 新代码importandroidx.appcompat.app.AppCompatActivityimportandroidx.core.content.ContextCompat映射表Support LibraryAndroidXandroid.support.v4.app.Fragmentandroidx.fragment.app.Fragmentandroid.support.v7.app.AppCompatActivityandroidx.appcompat.app.AppCompatActivityandroid.support.v7.widget.RecyclerViewandroidx.recyclerview.widget.RecyclerViewandroid.support.design.widget.*com.google.android.material.*时间线时间事件2011.03Support Library v4发布Fragment支持2013.05Support Library v7-appcompat发布ActionBar支持2014.06RecyclerView发布2015.05Design Support Library发布Material Design2018.09AndroidX 1.0.0发布2018.10Support Library 28.0.0最后版本2019.01停止更新Support Library实战对比Support Library时代dependencies { implementation com.android.support:appcompat-v7:28.0.0 implementation com.android.support:design:28.0.0 implementation com.android.support:recyclerview-v7:28.0.0 }importandroid.support.v7.app.AppCompatActivityimportandroid.support.v7.widget.RecyclerViewclassMainActivity:AppCompatActivity(){// ...}AndroidX时代dependencies { implementation androidx.appcompat:appcompat:1.6.1 implementation com.google.android.material:material:1.11.0 implementation androidx.recyclerview:recyclerview:1.3.2 }importandroidx.appcompat.app.AppCompatActivityimportandroidx.recyclerview.widget.RecyclerViewclassMainActivity:AppCompatActivity(){// ...}总结Support Library贡献解决碎片化让新特性可以在老设备使用统一体验不同版本行为一致降低开发成本不用写大量兼容代码Support Library问题版本管理复杂所有库版本必须一致命名混乱v4/v7与实际不符依赖冲突第三方库版本冲突AndroidX改进独立版本每个库独立演进语义化命名包名清晰明确更好的模块化功能分离更清晰开发建议新项目直接使用AndroidX旧项目尽快迁移到AndroidX不要混用Support Library和AndroidX不能共存关键要点Support Library是Android兼容性的里程碑AndroidX是其进化版本

更多文章