
Support Library v4 (2011)
↓
Support Library v7 (2013)
↓
Support Library 28.x (2018)
↓
AndroidX (2018 - 现在)// ❌ Support Library 存在的问题
class SupportLibraryIssues {
// 1. 包名混乱
val supportV4 = "com.android.support:support-v4:28.0.0"
val appCompatV7 = "com.android.support:appcompat-v7:28.0.0"
val design = "com.android.support:design:28.0.0"
// 2. 版本耦合
// 所有 Support 库必须使用相同版本号
// 导致更新困难
}// ✅ AndroidX 的改进
class AndroidXAdvantages {
// 1. 清晰的包结构
val coreKtx = "androidx.core:core-ktx:1.9.0"
val appCompat = "androidx.appcompat:appcompat:1.6.1"
val material = "com.google.android.material:material:1.8.0"
// 2. 独立版本管理
// 每个库可以独立更新版本
}<!-- Support Library 布局 -->
<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_add" />// Support Library Activity
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private FloatingActionButton fab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化 Support 组件
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
fab = findViewById(R.id.fab);
}
}<!-- AndroidX 布局 -->
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_add" />// AndroidX Activity (Kotlin)
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var fab: FloatingActionButton
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 初始化 AndroidX 组件
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
fab = findViewById(R.id.fab)
}
}// build.gradle (Module: app)
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 16
targetSdkVersion 28
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Support Libraries
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'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
// 约束:所有 Support 库必须版本一致
// 否则会出现依赖冲突
}// build.gradle (Module: app)
android {
compileSdkVersion 33
defaultConfig {
minSdkVersion 21
targetSdkVersion 33
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// AndroidX Core
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
// Material Design
implementation 'com.google.android.material:material:1.8.0'
// UI Components
implementation 'androidx.recyclerview:recyclerview:1.3.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
// Lifecycle & ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
// Navigation
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
// 每个库可以独立更新版本
// 没有强制版本一致性要求
}// 在 gradle.properties 中启用 AndroidX
android.useAndroidX=true
android.enableJetifier=trueSupport Library | AndroidX Equivalent |
|---|---|
com.android.support:appcompat-v7 | androidx.appcompat:appcompat |
com.android.support:design | com.google.android.material:material |
com.android.support:recyclerview-v7 | androidx.recyclerview:recyclerview |
com.android.support:cardview-v7 | androidx.cardview:cardview |
com.android.support:support-v4 | androidx.legacy:legacy-support-v4 |
android.arch.lifecycle | androidx.lifecycle |
// MainActivity.java (Support Library)
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter adapter;
private List<String> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Support 组件初始化
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
dataList = new ArrayList<>();
adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
// Support 的 FloatingActionButton
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(view -> {
// 处理点击事件
});
}
// Support 的 Menu 处理
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
}// MainActivity.kt (AndroidX + Kotlin)
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var adapter: MyAdapter
private val dataList = mutableListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 使用 View Binding
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// AndroidX 组件初始化
setSupportActionBar(binding.toolbar)
setupRecyclerView()
setupFab()
}
private fun setupRecyclerView() {
adapter = MyAdapter(dataList)
binding.recyclerView.apply {
layoutManager = LinearLayoutManager(this@MainActivity)
adapter = this@MainActivity.adapter
}
}
private fun setupFab() {
binding.fab.setOnClickListener {
// 使用 AndroidX 的扩展函数
showSnackbar("FAB Clicked!")
}
}
// 使用 AndroidX 的扩展函数
private fun showSnackbar(message: String) {
Snackbar.make(binding.root, message, Snackbar.LENGTH_SHORT).show()
}
}// build.gradle 中添加 KTX 依赖
dependencies {
// Core KTX
implementation 'androidx.core:core-ktx:1.9.0'
// Fragment KTX
implementation 'androidx.fragment:fragment-ktx:1.5.5'
// Lifecycle KTX
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
// ViewModel KTX
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
// LiveData KTX
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
}
// KTX 使用示例
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 使用 KTX 扩展函数
val displayName = intent.getStringExtra("name").orEmpty()
// 使用 ViewModel KTX
viewModel.userData.observe(this) { user ->
updateUI(user)
}
// 使用 Lifecycle KTX
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { uiState ->
processUiState(uiState)
}
}
}
}
// Fragment KTX 示例
private fun showDetailFragment(itemId: String) {
supportFragmentManager.commit {
setReorderingAllowed(true)
replace<DetailFragment>(R.id.fragment_container,
bundleOf("itemId" to itemId))
addToBackStack(null)
}
}
}// ViewModel + LiveData + Room (AndroidX)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAllUsers(): LiveData<List<User>>
@Insert
suspend fun insertUser(user: User)
}
class UserRepository(private val userDao: UserDao) {
fun getUsers(): LiveData<List<User>> = userDao.getAllUsers()
suspend fun addUser(user: User) = userDao.insertUser(user)
}
class UserViewModel(private val repository: UserRepository) : ViewModel() {
val users: LiveData<List<User>> = repository.getUsers()
fun addUser(user: User) {
viewModelScope.launch {
repository.addUser(user)
}
}
}
// 在 Activity/Fragment 中使用
class UserListFragment : Fragment() {
private val viewModel: UserViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.users.observe(viewLifecycleOwner) { users ->
// 更新 UI
adapter.submitList(users)
}
}
}// build.gradle 优化配置
android {
// 启用代码压缩和资源缩减
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
// 启用 View Binding 或 Data Binding
buildFeatures {
viewBinding true
// dataBinding true
}
}
dependencies {
// 只引入需要的组件,避免过度依赖
implementation 'androidx.appcompat:appcompat:1.6.1'
// 使用特定模块而不是整个库
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
// 而不是 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
// 使用 R8 优化时 exclude 不需要的模块
implementation('com.google.android.material:material:1.8.0') {
exclude group: 'androidx.recyclerview', module: 'recyclerview'
}
}// 正确使用 ViewModel 和 Lifecycle
class OptimizedActivity : AppCompatActivity() {
private val viewModel: OptimizedViewModel by viewModels()
private var adapter: OptimizedAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 延迟初始化
adapter = OptimizedAdapter()
// 使用正确的生命周期所有者
viewModel.data.observe(this) { data ->
adapter?.submitList(data)
}
}
override fun onDestroy() {
super.onDestroy()
// 避免内存泄漏
adapter = null
}
}
// 使用 View Binding 替代 findViewById
class ViewBindingActivity : AppCompatActivity() {
private lateinit var binding: ActivityViewBindingBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityViewBindingBinding.inflate(layoutInflater)
setContentView(binding.root)
// 直接访问视图
binding.textView.text = "Hello AndroidX"
binding.button.setOnClickListener {
handleButtonClick()
}
}
}// 问题1: 类名冲突
// 解决方案: 清理导入并重新构建
// 问题2: 依赖冲突
// 解决方案: 使用依赖分析
class DependencyAnalyzer {
companion object {
fun analyzeDependencies() {
// 在终端运行: ./gradlew app:dependencies
// 查看依赖树,解决冲突
}
}
}
// 问题3: 第三方库兼容性
// 解决方案: 使用 jetifier 或寻找替代库
dependencies {
// 启用 Jetifier 处理第三方库
// 在 gradle.properties: android.enableJetifier=true
// 或者使用 AndroidX 版本的第三方库
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'androidx.core:core-ktx:1.9.0'
}// 版本兼容工具类
object AndroidXVersionCompat {
// 检查并处理版本兼容性
fun checkCompatibility() {
// 使用最新的稳定版本
val appCompatVersion = "1.6.1"
val materialVersion = "1.8.0"
val lifecycleVersion = "2.6.1"
// 避免使用已弃用的 API
checkDeprecatedApis()
}
private fun checkDeprecatedApis() {
// 替换已弃用的方法
// 例如: replace fragmentTransaction.add() with fragmentManager.commit()
}
}
// 向后兼容处理
class CompatUtils {
companion object {
// 处理不同版本的差异
@SuppressLint("ObsoleteSdkInt")
fun setToolbarTitle(toolbar: Toolbar, title: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
toolbar.title = title
} else {
// 兼容旧版本的处理
toolbar.title = title
}
}
}
}特性 | Support Library | AndroidX |
|---|---|---|
包命名 | com.android.support.* | androidx.* |
版本管理 | 强制统一版本 | 独立版本管理 |
维护状态 | 已停止更新 | 持续维护 |
KTX 支持 | 有限 | 全面支持 |
Jetpack 集成 | 部分支持 | 深度集成 |
迁移难度 | - | 中等(有自动化工具) |
通过全面迁移到 AndroidX,可以获得更好的开发体验、更稳定的性能和更长期的维护支持。