Android AGP8.1.0組件化初探
前言:
前面兩篇完成了從AGP4.2到 AGP8.1.0的升級,本文是由于有哥們留言說在AGP8.0中使用ARouter組件化有問題,于是趁休息時間嘗試了一下,寫了幾個demo,發(fā)現(xiàn)都沒有問題,跳轉(zhuǎn)和傳值都是正常的,這里我也是直接從groovy轉(zhuǎn)換成version-catalogs的依賴方式,由于之前升級過,所以這次很順利,幾分鐘就完成了,直接上代碼:
1.添加統(tǒng)一依賴:
[versions]
agp = "8.1.0"
androidx-espresso-core = "3.4.0"
androidx-junit = "1.1.3"
org-jetbrains-kotlin-android = "1.8.0"
core-ktx = "1.10.1"
junit = "4.13.2"
androidx-test-ext-junit = "1.1.5"
espresso-core = "3.5.1"
appcompat = "1.6.1"
material = "1.9.0"
constraintlayout = "2.1.4"
mmkv = "1.3.1"
utilcodex = "1.31.1"
arouter = "1.5.2"
arouter-compiler = "1.5.2"
org-jetbrains-kotlin-kapt = "1.8.0"
[libraries]
androidx-espresso-core-3_4_0 = { module = "androidx.test.espresso:espresso-core", version.ref = "androidx-espresso-core" }
androidx-junit-1_1_3 = { module = "androidx.test.ext:junit", version.ref = "androidx-junit" }
core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
mmkv = { group = "com.tencent", name = "mmkv", version.ref = "mmkv" }
utilcodex = {group = "com.blankj",name = "utilcodex",version.ref = "utilcodex"}
arouter = {group = "com.alibaba",name = "arouter-api",version.ref = "arouter"}
arouter-compiler = {group = "com.alibaba",name = "arouter-compiler",version.ref = "arouter-compiler"}
[plugins]
com-android-library = { id = "com.android.library", version.ref = "agp" }
com-android-application = { id = "com.android.application", version.ref = "agp" }
org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin-android" }
org-jetbrains-kotlin-kapt = {id = "org.jetbrains.kotlin.kapt",version.ref = "org-jetbrains-kotlin-kapt"}
[bundles]
2.添加lib-common組件配置:
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
alias(libs.plugins.com.android.library)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.org.jetbrains.kotlin.kapt)
}
dependencies {
implementation(libs.core.ktx)
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.arouter)
kapt(libs.arouter.compiler)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.name)
}
}
完整配置:
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
alias(libs.plugins.com.android.library)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.org.jetbrains.kotlin.kapt)
}
android {
namespace = "com.example.lib_cmmon"
compileSdk = 33
defaultConfig {
//applicationId = "com.example.lib_cmmon"
minSdk = 23
targetSdk = 33
// versionCode = 1
// versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
implementation(libs.core.ktx)
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.arouter)
kapt(libs.arouter.compiler)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.name)
}
}
3.lib-common添加ARouter初始化:
/**
* @author: njb
* @date: 2023/8/26 22:21
* @desc:
*/
public class BaseApp extends Application {
@Override
public void onCreate() {
super.onCreate();
initARouter();
}
private void initARouter() {
ARouter.openDebug();
ARouter.openLog();
ARouter.init(this);
}
}
4.添加lib-arouter組件配置:
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
alias(libs.plugins.com.android.library)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.org.jetbrains.kotlin.kapt)
}
android {
namespace = "com.example.lib_arouter"
compileSdk = 33
defaultConfig {
// applicationId = "com.example.lib_arouter"
minSdk = 23
targetSdk = 33
//versionCode = 1
// versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
dependencies {
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
implementation(libs.arouter)
kapt(libs.arouter.compiler)
implementation(project(":lib-common"))
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.name)
}
}
5.調(diào)用ARouter初始化:
/**
* @author: njb
* @date: 2023/8/26 22:21
* @desc:
*/
public class ARouterApp extends BaseApp {
@Override
public void onCreate() {
super.onCreate();
}
}
6.主模塊依賴配置:
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
alias(libs.plugins.com.android.application)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.org.jetbrains.kotlin.kapt)
}
android {
namespace = "com.example.writelogdemo"
compileSdk = 33
defaultConfig {
applicationId = "com.example.writelogdemo"
minSdk = 23
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
implementation(libs.core.ktx)
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
implementation(libs.utilcodex)
implementation(libs.arouter)
kapt(libs.arouter.compiler)
implementation(project(":lib-arouter"))
implementation(project(":lib-common"))
}
7.添加ARouter組件化配置:
7.1 引入ARouter依賴:
這里我用的是catelog方式,所以使用kapt方式
@Suppress("DSL_SCOPE_VIOLATION")
plugins {
alias(libs.plugins.com.android.library)
alias(libs.plugins.org.jetbrains.kotlin.android)
alias(libs.plugins.org.jetbrains.kotlin.kapt)
}
implementation(libs.arouter)
kapt(libs.arouter.compiler)
7.2 添加模塊名稱配置:
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.name)
}
}
7.3 主模塊ARouter初始化:
/**
* @author: njb
* @date: 2023/8/25 22:36
* @desc:
*/
public class LogApp extends BaseApp {
private static LogApp mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static LogApp getInstance() {
return mInstance;
}
}
7.4 在Activity中綁定Arouter:
ARouter.getInstance().inject(this)
7.5 添加Arouter跳轉(zhuǎn)和傳值:
userList = arrayListOf("年齡18","John","身高180","體重60kg","性別female")
tvText.setOnClickListener {
ARouter.getInstance().build("/test/TestSplashActivity").withString("name","test張三").withSerializable("userList",
userList
).navigation()
7.6 test模塊添加跳轉(zhuǎn)路徑和數(shù)據(jù)接收:
@Route(path = "/test/TestSplashActivity")
class TestSplashActivity : AppCompatActivity() {
val TAG = "TestARouter"
@Autowired(name = "name")
@JvmField
var name: String = ""
@Autowired(name = "userList")
@JvmField
var mList:ArrayList<String> ?= null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test_splash)
ARouter.getInstance().inject(this)
initView()
}
private fun initView() {
tvName.text = "測試ARouter跳轉(zhuǎn)$name"
tvTextView.text = mList.toString()
}
}
8.完整使用示例:
package com.example.writelogdemo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.alibaba.android.arouter.launcher.ARouter
class MainActivity : AppCompatActivity() {
private val tvText : TextView by lazy { findViewById(R.id.tvTest) }
var userList:ArrayList<String> ?= null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ARouter.getInstance().inject(this)
userList = arrayListOf("年齡18","John","身高180","體重60kg","性別female")
tvText.setOnClickListener {
ARouter.getInstance().build("/test/TestSplashActivity").withString("name","test張三").withSerializable("userList",
userList
).navigation()
}
}
}
9.主模塊布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
10.lib-arouter測試代碼:
package com.example.lib_arouter
import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.alibaba.android.arouter.facade.annotation.Autowired
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
@SuppressLint("CustomSplashScreen")
@Route(path = "/test/TestSplashActivity")
class TestSplashActivity : AppCompatActivity() {
val TAG = "TestARouter"
val tvName:TextView by lazy { findViewById(R.id.tv_name) }
val tvTextView:TextView by lazy { findViewById(R.id.tv_test) }
@Autowired(name = "name")
@JvmField
var name: String = ""
@Autowired(name = "userList")
@JvmField
var mList:ArrayList<String> ?= null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test_splash)
ARouter.getInstance().inject(this)
Log.d(TAG, "測試ARouter數(shù)據(jù)傳遞$name$mList")
initView()
}
private fun initView() {
tvName.text = name
tvTextView.text = mList.toString()
}
}
11.lib-arouter布局代碼:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TestSplashActivity">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="這是Arouter測試"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="這是數(shù)組"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_name" />
</androidx.constraintlayout.widget.ConstraintLayout>
12.日志打印如下:
13.實現(xiàn)效果如下:
14.遇到問題:
14.1 測試模塊配置不對
由于我是直接新建的模塊,所以當(dāng)作完整項目配置的,這里如果只是測試組件化需要修改配置
解決方法修改libs.plugins.com.android.application為libs.plugins.com.android.library
修改完成后可以正常運行:
14.2 跳轉(zhuǎn)時提示path找不到
解決方法:
a.按照上面7中的步驟配置主模塊和其他組件模塊,一個都不能少。
?b.同時在跳轉(zhuǎn)時保證路徑一致即可。
若配置完還有問題,請仔細(xì)檢查每一步,直到正常跳轉(zhuǎn)和數(shù)據(jù)傳遞,本人是親自嘗試了多個項目,基本上都沒問題.
14.3 數(shù)據(jù)傳遞和接收問題
解決方法:
a.在kotlin中使用ARouter接收數(shù)據(jù)時需要使用@JvmField關(guān)鍵字
b.@Autowired(name = “name”),name一定要和傳遞時一致
c.傳遞數(shù)組時記得序列化,接收也是一樣
15.AGP8.1.0小技巧:
15.1 在沒有添加統(tǒng)一依賴時配置:
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.9.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
implementation("com.alibaba:arouter-api:1.5.2")
kapt("com.alibaba:arouter-compiler:1.5.2")
implementation(project(":lib-common"))
15.2 添加統(tǒng)一依賴庫配置后:
如果添加了統(tǒng)一的catelog配置方式后導(dǎo)入依賴它會自動提示,不需要開發(fā)者手動導(dǎo)入,這點我感覺很爽,一鍵一直替換,用起來簡直不要太安逸了,感興趣的同學(xué)可以自行嘗試,這里就簡單舉例。
16.總結(jié):
以上就是今天博客的內(nèi)容在AGP8.1.0中使用組件化和遇到問題,其實本文的目的不是在于如何使用,ARouter這個很簡單,相信做過組件化的同學(xué)都會,只是需要遇到問題時學(xué)會分析和調(diào)試,要不然盲目猜測是不會有結(jié)果的。開發(fā)這條路任重而道遠(yuǎn),希望大家都能上下求索,享受這個求索的過程,痛并快樂著,也很重要,新技術(shù)出來可以嘗試,也可以根據(jù)自己需要調(diào)整,不一樣說非得更新用這個新技術(shù),只要能解決問題,咋好用咋來。文章來源:http://www.zghlxwxcb.cn/news/detail-684615.html
17.demo地址如下:
https://gitee.com/jackning_admin/write-log-demo文章來源地址http://www.zghlxwxcb.cn/news/detail-684615.html
到了這里,關(guān)于Android AGP8.1.0組件化初探的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!