一、内容总览
二、Gradle新一代版本依赖管理
Gradle项目适配指南
使用一个较新版本的AS创建一个新的安卓项目时,AS会自动应用对应所需版本的gradle插件
1.构建工具版本升级
1.1 AS版本与其对应Android-Gradle-Plugin的对应关系
此处以最新版本2025.2.1为例进行项目适配
2.Maven源适配
一个较新的AS项目,build.gradle(项目根目录)下没有buildscript{} allprojects{}对maven源的适配——>maven适配位置——>修改settings.gradle的pluginManagement{}
2.1 在maven源里标记allowInsecureProtocol=true,允许访问非安全
pluginManagement {
repositories {
//
maven{
allowInsecureProtocol=true
url 'http://dl.bintray.com/umsdk/release'
}
google {
content {
includeGroupByRegex("com\.android.*")
includeGroupByRegex("com\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "jetpack_android_online"
include(":app")
dependencyResolutionMAnagement{}是所有依赖管理的地方,其中可配置更多的maven源
2.2 在dependencyResolutionMAnagement{}中配置阿里云的几个仓库
pluginManagement {
repositories {
maven{
...
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
//配置阿里云仓库
maven{ url 'http://maven.aliyun.com/repository/releases' }
maven{ url 'http://maven.aliyun.com/repository/google' }
maven{ url 'http://maven.aliyun.com/repository/central' }
maven{ url 'http://maven.aliyun.com/repository/gradle-plugin' }
maven{ url 'http://maven.aliyun.com/repository/public' }
google()
mavenCentral()
}
}
rootProject.name = "jetpack_android_online"
include(":app")
3.新一代版本依赖管理version catalogs
版本依赖管理方式对比
依赖版本管理version catalogs
- 对所有module可见,可统一管理所有module的依赖
- 支持声明依赖bundles,组合打包依赖减少重复代码
- 支持在单独的libs.versions.toml文件中配置依赖。支持在项目间共享依赖
- 在 Gradle 7.0 版本之后,Version Catalogs (版本目录) 功能已经从“预览功能”毕业,成为一个正式功能,不再需要通过
enableFeaturePreview()来显式开启。Version Catalogs定义放在单独的libs.versions.toml文件(独立文件依赖管理)中
三、Jetpack Navigation组件实战
1.添加依赖
1.1 添加引用Navigation组件依赖
-修改libs.versions.toml 文件
[versions]
agp = "8.13.1"
#...保留现有的其他版本
navigation = "2.5.3"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
#...保留现有的其他版本
# Navigation 的独立依赖项 (保留在 [libraries] 中)
navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigation" }
navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigation" }
[plugins]
...
#新增 [bundles] 块,用于将多个依赖项打包
[bundles]
# 将两个 Navigation 库打包成一个别名
androidx-navigation = ["navigation-fragment-ktx", "navigation-ui-ktx"]
-修改 app/build.gradle.kts 文件
...
dependencies {
implementation(libs.bundles.androidx.navigation)
}
1.2 另外再添加引用material组件的依赖
androidx-material3:纯 Compose 项目。 Compose 专用的 Material 3 设计系统组件
google-android-material:混合式项目。有传统的 XML 布局,并且这些 XML 布局需要使用 Material 按钮、FloatingActionButton (FAB) 或 CoordinatorLayout 等组件
-修改libs.versions.toml 文件
[versions]
agp = "8.13.1"
#...保留现有的其他版本
navigation = "2.5.3"
material = "1.12.0"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
#...保留现有的其他版本
# Navigation 的独立依赖项 (保留在 [libraries] 中)
navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigation" }
navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigation" }
# --- 添加 Material Components 库 ---
google-android-material = { group = "com.google.android.material", name = "material", version.ref = "material" }
[plugins]
...
#新增 [bundles] 块,用于将多个依赖项打包
[bundles]
# 将两个 Navigation 库打包成一个别名
androidx-navigation = ["navigation-fragment-ktx", "navigation-ui-ktx"]
-修改 app/build.gradle.kts 文件
...
dependencies {
implementation(libs.bundles.androidx.navigation)
implementation(libs.google.android.material)
...
}
2.创建layout/layout_activity_main布局
**使用布局容器FragmentContainerView
- 一个自定义 View 继承 FrameLayout, 与 ViewGroup 不同, 它只接受 Fragment Views
- fragment z-ordering 的处理。优化了两个 Fragment 退出和进入过渡不会互相重叠, 使用 FragmentContainerView 将先开启退出动画然后才是进入动画
指定name——>让fragment的视图view能显示到这个容器
NavHostFragment具备普通fragmennt所不具备的两个能力
(1)导航宿主 (2)导航控制器
app:defaultNavHost="true"
拦截activity on back pressed,即手机实体返回键的能力,从而能正确地处理fragment弹出栈的工作
3.创建navigation/nav_graph导航图
根节点必须是navigation(需要指定一个id),导航节点navigation本质上是一个导航图,描述了整个应用的所有页面的路由
startDestination制定一个开始节点,描述启动时需要加载的是哪一个fragment
<?xml version="1.0" encoding="utf-8"?>
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph.xml"
app:startDestination="id/home_fragment"
>
<fragment
android:id="@+id/home_fragment"
android:name="com.ffmpeg.jetpack_android_online.navigation.HomeFragment">
<action
android:id="@+id/navigate_to_category_fragment"
app:destination="@+id/category_fragment"/>
</fragment>
<fragment
android:id="@+id/category_fragment"
android:name="com.ffmpeg.jetpack_android_online.navigation.CategoryFragment"
>
</fragment>
</navigation>
Navigation架构概述
Navigation原理解析——阅读源码