Android AGP8.1.0组件化初探

这篇具有很好参考价值的文章主要介绍了Android AGP8.1.0组件化初探。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android AGP8.1.0组件化初探

Android AGP8.1.0组件化初探,android

前言:

前面两篇完成了从AGP4.2到 AGP8.1.0的升级,本文是由于有哥们留言说在AGP8.0中使用ARouter组件化有问题,于是趁休息时间尝试了一下,写了几个demo,发现都没有问题,跳转和传值都是正常的,这里我也是直接从groovy转换成version-catalogs的依赖方式,由于之前升级过,所以这次很顺利,几分钟就完成了,直接上代码:

1.添加统一依赖:

[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.调用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跳转和传值:

userList = arrayListOf("年龄18","John","身高180","体重60kg","性别female")
tvText.setOnClickListener {
    ARouter.getInstance().build("/test/TestSplashActivity").withString("name","test张三").withSerializable("userList",
        userList
    ).navigation()

7.6 test模块添加跳转路径和数据接收:

@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跳转$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数据传递$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="这是数组"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_name" />

</androidx.constraintlayout.widget.ConstraintLayout>

12.日志打印如下:

Android AGP8.1.0组件化初探,android

Android AGP8.1.0组件化初探,android

13.实现效果如下:

Android AGP8.1.0组件化初探,android

Android AGP8.1.0组件化初探,android

14.遇到问题:

14.1 测试模块配置不对

由于我是直接新建的模块,所以当作完整项目配置的,这里如果只是测试组件化需要修改配置

Android AGP8.1.0组件化初探,android

解决方法修改libs.plugins.com.android.application为libs.plugins.com.android.library
Android AGP8.1.0组件化初探,android

修改完成后可以正常运行:

14.2 跳转时提示path找不到

解决方法:
a.按照上面7中的步骤配置主模块和其他组件模块,一个都不能少。

​b.同时在跳转时保证路径一致即可。

若配置完还有问题,请仔细检查每一步,直到正常跳转和数据传递,本人是亲自尝试了多个项目,基本上都没问题.

14.3 数据传递和接收问题

Android AGP8.1.0组件化初探,android

解决方法:

a.在kotlin中使用ARouter接收数据时需要使用@JvmField关键字

b.@Autowired(name = “name”),name一定要和传递时一致

c.传递数组时记得序列化,接收也是一样

15.AGP8.1.0小技巧:

15.1 在没有添加统一依赖时配置:

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 添加统一依赖库配置后:

如果添加了统一的catelog配置方式后导入依赖它会自动提示,不需要开发者手动导入,这点我感觉很爽,一键一直替换,用起来简直不要太安逸了,感兴趣的同学可以自行尝试,这里就简单举例。
Android AGP8.1.0组件化初探,android
Android AGP8.1.0组件化初探,android

16.总结:

以上就是今天博客的内容在AGP8.1.0中使用组件化和遇到问题,其实本文的目的不是在于如何使用,ARouter这个很简单,相信做过组件化的同学都会,只是需要遇到问题时学会分析和调试,要不然盲目猜测是不会有结果的。开发这条路任重而道远,希望大家都能上下求索,享受这个求索的过程,痛并快乐着,也很重要,新技术出来可以尝试,也可以根据自己需要调整,不一样说非得更新用这个新技术,只要能解决问题,咋好用咋来。

17.demo地址如下:

https://gitee.com/jackning_admin/write-log-demo文章来源地址https://www.toymoban.com/news/detail-684615.html

到了这里,关于Android AGP8.1.0组件化初探的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】从零搭建组件化项目

    组件化系列文章介绍的内容稍微多了点,本着研究透这玩意的精神,从组件化的简介开始说起。 什么是组件化? 将多个功能模板拆分、重组的过程。 为什么要使用组件化? 1、加快编译速度,提高开发效率,增强可维护性、移植性。 2、高内聚(软件模块是由相关性很强的代

    2024年02月15日
    浏览(48)
  • Android彻底组件化—UI跳转升级改造

    (2)host对应的是share。在组件化框架中,每个组件对应一个唯一的host,例如分享组件的host就是share,读书组件的host是reader等等。 host是路由分发的第一级,根据host可以定位到每个组件。 host还可以对所有的路由URL进行一个分组,只有调用到该分组的路由的时候,组内的路由

    2024年04月16日
    浏览(37)
  • Android学习之路(23)组件化框架ARouter的使用

    支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun 支持MultiDex (Google方案) 映射关系按组分类、多级管理,按需初始化 支持用户指定全局降级与局

    2024年01月22日
    浏览(83)
  • Android学习之路(22) 从模块化到组件化

    Android 应用项目 , 都存在一个应用模块 ( Application Module ) , 在 build.gradle 构建脚本中 , 第一个插件配置 com.android.application , 表明 该 Module 编译打包后的输出是 APK 安装包 ; 该项目可以直接运行 ; 如果在 build.gradle 配置的是 com.android.library 插件 , 那么 编译 Module 打包后输出的是 a

    2024年01月22日
    浏览(50)
  • 现代化 Android 开发:组件化与模块化的抉择

    作者:古哥E下 项目初始的时候,一般都是使用一个分层架构,接入各种框架,然后就写业务代码。但如果项目慢慢变大,那就会出现很多项目管理的问题,诸如: 1.代码复用与抽象问题 2.编译速度问题 3.版本迭代速度问题 所以组件化、模块化、动态化、插件化、跨平台等各

    2024年02月11日
    浏览(59)
  • Android组件化方案及组件消息总线modular-event实战,渣本Android开发小伙如何一步步成为架构师

    美团外卖团队开发的一款Android路由框架,基于组件化的设计思路。主要提供路由、ServiceLoader两大功能。之前美团技术博客也发表过一篇WMRouter的介绍:《WMRouter:美团外卖Android开源路由框架》。WMRouter提供了实现组件化的两大基础设施框架:路由和组件间接口调用。支持和文

    2024年04月22日
    浏览(51)
  • Android技术栈(二)组件化改造,目前最稳定和高效的UI适配方案

    .build(PR.navi.navi) .navigation(); 而 Activity 则不需要,它会立即显示 ARouter.getInstance() .build(PR.navi.navi) //还可以设置参数,ARouter会帮你存在Bundle中 .withString(“pathId”,UUID.randomUUID().toString()) //Activity 或 Context .navigation(this); navi 模块是典型的业务逻辑模块,这里你可导入一些只有这个模块才

    2024年03月24日
    浏览(45)
  • 一篇读懂 Android 开发中模块化、组件化、插件化和热修复

    网上关于 “Android 开发\\\" 的文章很多,我本人学习 Android 开发的过程也借鉴了网上先辈们的文章;但大多数文章都从底层的细枝末节开始讲述,由下而上给人一种这门技术“博大精深”望而生畏的感觉;而我写这篇文章的初衷就是由上而下,希望别人在阅读的过程中能够觉得

    2023年04月08日
    浏览(40)
  • 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端

    前言:苟有恒,何必三更眠五更起;最无益,莫过一日曝十日寒。 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间。这里重新行动起来,从项目搭建到完成前前后后用了两个月时间,平常时间比较少,基本上都是只能利用零碎的

    2024年02月09日
    浏览(54)
  • 组件化开发之如何封装组件-react

    组件是构建用户界面的基本单元,它是一个独立的、可重用的、可组合的代码单元,用于表示UI的一部分。 人话:当谈论组件时,就像在搭积木一样,每个组件都是一个 独立的、可以重复使用 的代码块,用来构建网页或应用的各个部分。比如界面的布局,像按钮、文本输入

    2024年02月11日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包