Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )

【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )

作者头像
韩曙亮
发布于 2023-03-29 05:10:44
发布于 2023-03-29 05:10:44
2.5K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

组件化系列博客 :

一、ARoute 引入


使用 ARouter 第三方库实现组件化 : https://github.com/alibaba/ARouter

ARoute 是阿里的开源库 ;

创建项目 , 项目中有

3

个 Module ,

1

个主模块 app ,

2

个依赖库 module1 和 module2 ;

在 app , module1 , module2 ,

3

个模块的 build.gradle 中 , 都要进行如下配置 ;

在 build.gradle 下的 " android / defaultConfig " 层级添加配置 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}

在 build.gradle 下的 " dependencies " 层级添加 ARoute 依赖 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    api 'com.alibaba:arouter-api:1.5.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
3

模块间的依赖关系 : app 模块依赖剩余两个模块 , 模块之间不发生依赖关系 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implementation project(path: ':module1')
implementation project(path: ':module2')

二、3 个模块的界面跳转


1、app 模块注解、app 跳转到 module1 模块

app 模块 : 使用 @Route(path = "/app/MainActivity") 注解标注 Activity 类 , 界面按钮点击方法跳转到 module1 中的 Activity 界面中 ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.component;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/app/MainActivity")
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View view) {
        Log.i(TAG, "跳转到 Module1");
        ARouter.getInstance().build("/module1/Module1Activity").navigation();
        finish();
    }
}

2、module1 模块注解、module1 跳转到 module2 模块

module1 模块跳转到 module2 模块 , 这两个模块之间互相没有依赖关系 ;

module1 模块使用 @Route(path = "/module1/Module1Activity") 注解标注 ,

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.module1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;

@Route(path = "/module1/Module1Activity")
public class Module1Activity extends AppCompatActivity {

    private static final String TAG = "Module1Activity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_module1);
    }

    public void onClick(View view) {
        Log.i(TAG, "跳转到 Module2");
        ARouter.getInstance().build("/module2/Module2Activity").navigation();
        finish();
    }
}

3、module2 模块注解、module2 跳转到 app 模块

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.module2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;

@Route(path = "/module2/Module2Activity")
public class Module2Activity extends AppCompatActivity {

    private static final String TAG = "Module2Activity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_module2);
    }

    public void onClick(View view) {
        Log.i(TAG, "跳转到 app");
        ARouter.getInstance().build("/app/MainActivity").navigation();
        finish();
    }
}

4、跳转效果

三、组件化配置


1、全局配置

全局配置 :

isModuleMode 是最终要的配置 , 通过该配置的 true / false 设置当前是否开启组件化 ,

  • 集成模式 true ( 默认模式 , 模块化 )
  • 组件模式 false ( 组件化 )

androidConfig 用于统一管理各个 Module 中的版本号 , 如编译版本号 , 最小版本号 , 目标版本号 ;

applicationId 用于保存各个模块的包名 , 尤其是 module 依赖库的包名 , 组件化的状态下 , 该 module 需要独立运行 , 必须配置一个 applicationId 包名 ;

dependencies 用于统一管理各个模块之间的依赖库 , 避免管理分散 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ext 是 extension 扩展的含义
// ext 后的 {} 花括号 , 是闭包 ,
ext{

    // 是否是模块化模式
    // 集成模式 true ( 默认模式 , 模块化 )
    // 组件模式 false ( 组件化 )
    isModuleMode = true

    // 定义 android 变量 , 类型是字典 Map 集合
    // 其中定义了若干键值对集合
    androidConfig = [
            compileSdkVersion : 30,
            minSdkVersion : 18,
            targetSdkVersion : 30,
            versionCode : 1,
            versionName : "1.0"
    ]

    applicationId = [
            "app" : "kim.hsl.component",
            "module1" : "kim.hsl.module1",
            "module2" : "kim.hsl.module2",
    ]

    // androidx 版本号
    androidxVersion = "1.3.0"
    constraintlayoutVersion = "2.0.4"
    materialVersion = "1.3.0"

    // 统一管理依赖库
    dependencies = [
            // ${} 表示引用之前定义的变量
            "appcompat" : "androidx.appcompat:appcompat:${androidxVersion}",
            "constraintlayout" : "androidx.constraintlayout:constraintlayout:${constraintlayoutVersion}",
            "material" : "com.google.android.material:material:${materialVersion}"
    ]
}

2、工程下的 build.gradle 配置

在总的 build.gradle 配置中 , 引入上述全局配置 , 其作用就相当于将上述全局配置原封不动拷贝过来 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apply from: "component.gradle"

完整配置 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// 将 component.gradle 配置文件中的内容导入到该位置
// 相当于引入头文件
apply from: "component.gradle"

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.0"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

3、app 模块下的 build.gradle 配置

在 app 模块中重点关注 , 在组件模式下 , 一定不能引入依赖库 , 否则会报错 , 因为组件模式下这两个依赖库是两个可运行的独立应用 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies {
    if (isModuleMode){
        // 集成模式下才能引用这两个 Library Module
        implementation project(path: ':module1')
        implementation project(path: ':module2')
    }
}

版本号 , applicationId , 依赖库 统一管理 :

从 Project 级别的配置中获取变量 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId
def dep = rootProject.ext.dependencies

版本号 和 applicationId 统一管理 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {
    compileSdkVersion androidConfig.compileSdkVersion
    
    defaultConfig {
        applicationId appId["app"]
        minSdkVersion androidConfig.minSdkVersion
        targetSdkVersion androidConfig.targetSdkVersion
        versionCode androidConfig.versionCode
        versionName androidConfig.versionName
    }

依赖库统一管理 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies {

    //implementation 'androidx.appcompat:appcompat:1.3.0'
    //implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    //implementation 'com.google.android.material:material:1.3.0'

    implementation dep.appcompat
    implementation dep.constraintlayout
    implementation dep.material
}

完整配置 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plugins {
    id 'com.android.application'
}

def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId
def dep = rootProject.ext.dependencies

android {
    compileSdkVersion androidConfig.compileSdkVersion
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId appId["app"]
        minSdkVersion androidConfig.minSdkVersion
        targetSdkVersion androidConfig.targetSdkVersion
        versionCode androidConfig.versionCode
        versionName androidConfig.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        // ARoute 需要的配置
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    //implementation 'androidx.appcompat:appcompat:1.3.0'
    //implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    //implementation 'com.google.android.material:material:1.3.0'

    implementation dep.appcompat
    implementation dep.constraintlayout
    implementation dep.material

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    api 'com.alibaba:arouter-api:1.5.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'

    if (isModuleMode){
        // 集成模式下才能引用这两个 Library Module
        implementation project(path: ':module1')
        implementation project(path: ':module2')
    }

}

四、Module 模块的组件化配置


Module 模块的配置比较复杂 ;

首先 , Module 模块在组件模式下是可以独立运行的应用 , 必须有一个入口 Activity ; 但是 Module 下的清单文件是这样的 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kim.hsl.module1">

    <application>
        <activity android:name=".Module1Activity"></activity>
    </application>

</manifest>

这就需要为其单独配置一个清单文件 , 并且还要兼容在组件模式下能适用原来的这个清单文件 ;

此外还需要为其配置 Application 类 , 需要为其单独指定 Java 文件 , 并且在模块化模式中 , 不使用该文件 ;

1、创建组件模式下使用的类和清单文件

在 module1 下创建 组件模式 时使用的 Application 类和清单文件 ;

Application 类如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.module1;

import android.app.Application;

public class Module1Application extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
    }
}

清单文件如下 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kim.hsl.module1">

    <application
        android:name=".Module1Application"
        android:allowBackup="true"
        android:supportsRtl="true"
        android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar">
        <activity android:name=".Module1Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

在 build.gradle 中 " android / defaultConfig / sourceSets " 下配置相关资源文件 , 如果在组件模式下 , 使用 manifest.srcFile 配置组件模式下的清单文件 , 使用 java.srcDirs 配置组件模式下使用的 Java 源文件 ;

这些配置在 集成模式 下都失效 , 因此使用 isModuleMode 进行判定当前是 组件模式 还是 集成模式 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {
    defaultConfig {
        if (!isModuleMode){
            // 组件模式 : 必须配置 applicationId
            applicationId appId["module1"]
        }

        // 资源配置
        sourceSets{
            main{
                if (!isModuleMode){
                    // 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件
                    manifest.srcFile 'src/main/component/AndroidManifest.xml'

                    // 配置额外的 Java 源文件目录
                    java.srcDirs 'src/main/component/java', 'src/main/java'
                }else{
                    // 集成模式 下使用默认设置
                }
            }
        }
	}
}

2、动态切换 集成模式 / 组件模式

在 module 中需要考虑 集成模式 / 组件模式 动态切换问题 , 当 isModuleMode 设置为 true 时 , 当前是集成模式 , module 模块作为 app 模块的依赖库进行编译 , 因此需要加载 apply plugin: 'com.android.library' 插件 ;

当 isModuleMode 设置为 false 时 , 是 组件模式 , 每个 module 都是可以独立运行的应用 , 需要加载 apply plugin: 'com.android.application' 插件 ;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 根据 isModuleMode 动态切换 集成模式 / 组件模式
if (isModuleMode){
    // 集成模式
    apply plugin: 'com.android.library'
}else{
    // 组件模式
    apply plugin: 'com.android.application'
}

此外 , 如果是 组件模式 , module 是可以独立运行的应用 , 必须为其配置 applicationId ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android {
    defaultConfig {
        if (!isModuleMode){
            // 组件模式 : 必须配置 applicationId
            applicationId appId["module2"]
        }
	}
}

3、module1 完整的 build.gradle 配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 根据 isModuleMode 动态切换 集成模式 / 组件模式
if (isModuleMode){
    // 集成模式
    apply plugin: 'com.android.library'
}else{
    // 组件模式
    apply plugin: 'com.android.application'
}

def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId
def dep = rootProject.ext.dependencies

android {
    compileSdkVersion androidConfig.compileSdkVersion
    buildToolsVersion "30.0.3"

    defaultConfig {
        if (!isModuleMode){
            // 组件模式 : 必须配置 applicationId
            applicationId appId["module1"]
        }

        minSdkVersion androidConfig.minSdkVersion
        targetSdkVersion androidConfig.targetSdkVersion
        versionCode androidConfig.versionCode
        versionName androidConfig.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"

        // 资源配置
        sourceSets{
            main{
                if (!isModuleMode){
                    // 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件
                    manifest.srcFile 'src/main/component/AndroidManifest.xml'

                    // 配置额外的 Java 源文件目录
                    java.srcDirs 'src/main/component/java', 'src/main/java'
                }else{
                    // 集成模式 下使用默认设置
                }
            }
        }

        // ARoute 需要的配置
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    //implementation 'androidx.appcompat:appcompat:1.3.0'
    //implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    //implementation 'com.google.android.material:material:1.3.0'

    implementation dep.appcompat
    implementation dep.constraintlayout
    implementation dep.material

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    api 'com.alibaba:arouter-api:1.5.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
}

4、module2 完整的 build.gradle 配置文件

module1 与 module2 的配置项基本相同 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 根据 isModuleMode 动态切换 集成模式 / 组件模式
if (isModuleMode){
    // 集成模式
    apply plugin: 'com.android.library'
}else{
    // 组件模式
    apply plugin: 'com.android.application'
}

def androidConfig = rootProject.ext.androidConfig
def appId = rootProject.ext.applicationId
def dep = rootProject.ext.dependencies

android {
    compileSdkVersion androidConfig.compileSdkVersion
    buildToolsVersion "30.0.3"

    defaultConfig {
        if (!isModuleMode){
            // 组件模式 : 必须配置 applicationId
            applicationId appId["module2"]
        }

        minSdkVersion androidConfig.minSdkVersion
        targetSdkVersion androidConfig.targetSdkVersion
        versionCode androidConfig.versionCode
        versionName androidConfig.versionName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"

        // 资源配置
        sourceSets{
            main{
                if (!isModuleMode){
                    // 组件化模式下使用 ComponentAndroidManifest.xml 作为清单文件
                    manifest.srcFile 'src/main/component/AndroidManifest.xml'

                    // 配置额外的 Java 源文件目录
                    java.srcDirs 'src/main/component/java', 'src/main/java'
                }else{
                    // 集成模式 下使用默认设置
                }
            }
        }

        // ARoute 需要的配置
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    //implementation 'androidx.appcompat:appcompat:1.3.0'
    //implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    //implementation 'com.google.android.material:material:1.3.0'

    implementation dep.appcompat
    implementation dep.constraintlayout
    implementation dep.material

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    api 'com.alibaba:arouter-api:1.5.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
}

5、module1 独立运行效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kim.hsl.module1">

    <application
        android:name=".Module1Application"
        android:allowBackup="true"
        android:supportsRtl="true"
        android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar">
        <activity android:name=".Module1Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

清单文件中设置的主题是黑色的 ;

6、module2 独立运行效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kim.hsl.module2">

    <application
        android:name=".Module2Application"
        android:allowBackup="true"
        android:supportsRtl="true"
        android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar">
        <activity android:name=".Module2Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

清单文件中设置的主题是黑色的 ;

五、博客资源


博客源码 :

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
上一篇博客 【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 ) 中 , 在顶层的 build.gradle 中定义了相关参数变量 ;
韩曙亮
2023/03/29
8110
【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
Android AGP8.1.0组件化初探
前面两篇完成了从AGP4.2到 AGP8.1.0的升级,本文是由于有哥们留言说在AGP8.0中使用ARouter组件化有问题,于是趁休息时间尝试了一下,写了几个demo,发现都没有问题,跳转和传值都是正常的,这里我也是直接从groovy转换成versions-catelog的依赖方式,由于之前升级过,所以这次很顺利,几分钟就完成了,直接上代码:
用户2195279
2023/09/02
6280
Android AGP8.1.0组件化初探
手把手教你搭建android模块化项目框架(一)选择篇
本系列旨在帮助android新人搭建属于自己的项目框架。由于篇幅较长,本人时间有限,因此更新系列可能周期较长。
支离破碎_superLee
2023/09/01
7440
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ④ ( 使用路由实现组件间通信 | 引入 ARoute 框架 | Gradle 构建脚本优化问题 )
在上一篇博客 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ① ( 组件化简介 | 创建组件化应用 | 依赖库模块 / 应用模块 切换设置 ) 最后提到了 在 Gradle 构建脚本中 , 需要实现 依赖库模块 / 应用模块 切换设置 , 主要涉及如下两个方面 :
韩曙亮
2023/03/30
7530
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ④ ( 使用路由实现组件间通信 | 引入 ARoute 框架 | Gradle 构建脚本优化问题 )
Android工程师,不理解模块化、组件化、插件化的区别怎么行?
上次,我们讲了MVC、MVP、MVVM,其实从狭义上来讲,Android的架构概念就在这儿,无论怎么变,都是加加减减一些边边角角的东西,不足在意。
没关系再继续努力
2021/12/29
1.6K0
Android组件化架构
在项目开发中,将公用的代码提取到common_module中,将某些单独功能封装到lib_module中,再根据业务划分module,团队成员分别开发各自的模块。 但随着项目的迭代,功能越来越多,增加了一些业务模块后,相互调用的情况会增多,就会发生各个业务模块之间的耦合非常严重,导致代码难以维护且扩展性很差。组件化就应用而生了。 组件化基础:多module划分业务和基础功能。 组件:单一的功能组件,如适配,支付,路由组件等,可单独抽出来形成SDK。 模块:独立的业务模块,如直播,首页模块等。模块可能包含多个不同组件。
八归少年
2022/06/29
1.2K0
Android组件化架构
Android组件化入门:一步步搭建组件化架构
最近因为业务需求变更,有考虑采用组件化架构进行开发,这方面我之前没有接触过。关于组件化的文章很多,各方大神更是提出了各种的组件化方案,我也看了很多相关文章。但是学习新东西看的再多,不如动手做一次,先不考虑复杂的东西,先动手做个简单的Demo更有助于理解组件化的思想。废话不多说,直接动手开码。
Android技术干货分享
2019/05/14
8560
Android组件化入门:一步步搭建组件化架构
【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
在 1 个 Android 应用中只能存在 1 个 Application 类 , 但是组件化开发时 , 如果 Library 模块动态修改成 Application 模块 , 还想自己定义一个 Application 类 , 这里参考上一篇博客 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 ) 三、使用 sourceSets 配置组件模式下使用的清单文件 章节 , 使用 sourceSets 资源配置 , 配置 Java 代码 ;
韩曙亮
2023/03/29
7620
【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 mobile-ffmpeg 框架 | 完整代码示例 )
在 Android Studio 工程 根目录的 build.gradle 构建脚本中 , 配置
韩曙亮
2023/03/30
1.2K0
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 mobile-ffmpeg 框架 | 完整代码示例 )
【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )
在上一篇博客 【Flutter】Flutter 混合开发 ( 简介 | Flutter 混合开发集成步骤 | 创建 Flutter Module ) 中 , 创建了 Flutter Module 工程 ;
韩曙亮
2023/03/29
1.2K0
【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )
Android组件化框架项目详解
简介 什么是组件化? 项目发展到一定阶段时,随着需求的增加以及频繁地变更,项目会越来越大,代码变得越来越臃肿,耦合会越来越多,开发效率也会降低,这个时候我们就需要对旧项目进行重构即模块的拆分,官方的说法就是组件化。 组件化带来的好处 那么,采用组件化能带来什么好处呢?主要有以下两点: 1、现在Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情,一般都需要编译5到6分钟。Android Studio 推出 instant run 由于各种缺陷和限制条件(比如采用热修复tinker)一般情况
xiangzhihong
2018/02/08
3.4K0
Android组件化框架项目详解
Android组件化专题 - 组件化配置
(摘自百度百科)模块化是指解决一个复杂的问题时自顶向下逐层把系统划分为若干个模块的过程,各个模块可独立工作。
用户3045442
2018/09/11
1K0
Android组件化专题 - 组件化配置
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ② ( 组件化基本实现 | Project 相关目录 | 定义组件切换标志位 | 切换插件导入 | 切换设置应用 ID )
在上一篇博客 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ① ( 组件化简介 | 创建组件化应用 | 依赖库模块 / 应用模块 切换设置 ) 最后提到了 在 Gradle 构建脚本中 , 需要实现 依赖库模块 / 应用模块 切换设置 , 主要涉及如下两个方面 :
韩曙亮
2023/03/30
1.2K0
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ② ( 组件化基本实现 | Project 相关目录 | 定义组件切换标志位 | 切换插件导入 | 切换设置应用 ID )
Android 高度组件化并远程依赖
组件(Component)是对数据和方法的简单封装,功能单一,高内聚,并且是业务能划分的最小粒度。
前端小tips
2021/11/23
7110
Android 高度组件化并远程依赖
“终于懂了” 系列:Android组件化,全面掌握!
随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多。此过程中,你是否有过以下烦恼?
胡飞洋
2020/10/23
2.1K0
Android--利用APT+kotlinpoet实现组件化开发Router机制
在实现Router机制之前,我们还可以对项目的组织架构进行优化,将gradle中公用部分抽出来 有了上一篇的基础,我们初步实现了架构分层,目前有三个module:
aruba
2021/12/06
9780
Android--利用APT+kotlinpoet实现组件化开发Router机制
【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
在 Project 层级的 build.gradle 中 , 使用 apply from: “component.gradle” , 引入 component.gradle 配置 ;
韩曙亮
2023/03/29
1.3K0
【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
Android组件化专题 - 组件化配置
(摘自百度百科)模块化是指解决一个复杂的问题时自顶向下逐层把系统划分为若干个模块的过程,各个模块可独立工作。
没关系再继续努力
2021/11/12
9340
Android 重构 | 统一管理 Gradle 依赖版本
好代码,总是要经历多个阶段,从匆忙赶工上线,到慢慢细致打磨,折腾的过程,美好的结果。
贺biubiu
2020/05/22
1.2K0
Android 组件化(一)项目模式管理、模式切换
  在进行安装开发的时候我们经常会对项目进行不同业务逻辑处理分包,例如专门处理网络、数据库、业务逻辑代码的,如果我们不分包则所有东西写在一起,势必在开发过程中会浪费很多时间在寻找文件上,而分包的思想源于模块化,例如一些utils类,专门放到一个包下面,这样在使用的时候就能很快找到。节省开发时间,降低后期维护成本,那么组件化是什么?
晨曦_LLW
2022/11/21
9050
Android 组件化(一)项目模式管理、模式切换
推荐阅读
【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
8110
Android AGP8.1.0组件化初探
6280
手把手教你搭建android模块化项目框架(一)选择篇
7440
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ④ ( 使用路由实现组件间通信 | 引入 ARoute 框架 | Gradle 构建脚本优化问题 )
7530
Android工程师,不理解模块化、组件化、插件化的区别怎么行?
1.6K0
Android组件化架构
1.2K0
Android组件化入门:一步步搭建组件化架构
8560
【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
7620
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 mobile-ffmpeg 框架 | 完整代码示例 )
1.2K0
【Flutter】Flutter 混合开发 ( 关联 Android 工程与 Flutter 工程 | 安卓页面中嵌入 Flutter 页面 | 安卓中启动 Flutter 页面 )
1.2K0
Android组件化框架项目详解
3.4K0
Android组件化专题 - 组件化配置
1K0
【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ② ( 组件化基本实现 | Project 相关目录 | 定义组件切换标志位 | 切换插件导入 | 切换设置应用 ID )
1.2K0
Android 高度组件化并远程依赖
7110
“终于懂了” 系列:Android组件化,全面掌握!
2.1K0
Android--利用APT+kotlinpoet实现组件化开发Router机制
9780
【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
1.3K0
Android组件化专题 - 组件化配置
9340
Android 重构 | 统一管理 Gradle 依赖版本
1.2K0
Android 组件化(一)项目模式管理、模式切换
9050
相关推荐
【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验