Android组件开发

作者: 人世看客 | 来源:发表于2022-07-19 15:26 被阅读0次

    一、背景

    一个app随着业务增加,代码放在同一个模块中会越来越臃肿,同时也导致多人开发的一个难度。组件化可以把业务单独分出来,形成一个单独模块,可单独运行、测试等,相互之间不会影响。另外一个优势,如果一个公司有多个app,总会出现一些相同业务,如登录/注册。我们可以单独把公共业务封装成一个单独模块,供所以app使用,提高了开发成本

    二、项目结构

    如下图1,项目分成了4层,第一层app壳,这个也就是我们主工程, 里面包含application,启动页,以及一些初始化操作。第二层为module层,也就是我们的具体业务模块,具体需要看业务。第三层公共资源库,所有module都依赖此lib库。第四层为工具层,我们可以封装一些常用的网络请求,图片框架等

    图1

    三、组件开发代码配置

    1. 先给大家看下工程主要目录结构 图2
    2. 在project目录下创建一个全局的config.gradle配置文件。具体每个字段作用,看代码注释,这里就不作讲解了

    ext{
        //组件独立调试开关, 每次更改值后要同步工程
        isDebug = false
        //统一管理Android配置
        android = [
                // 编译 SDK 版本
                compileSdkVersion: 32,
                // 最低兼容 Android 版本
                minSdkVersion: 22,
                // 最高兼容 Android 版本
                targetSdkVersion: 31,
                // 当前版本编号
                versionCode: 1,
                // 当前版本信息
                versionName: "1.0.0"
        ]
        //组件唯一包名
        applicationid = [
                "app":"com.example.demo",
                "lgoin":"com.test.login",
        ]
        //请求测试服/正式服
        url = [
                "debug": "http://v.juhe.cn",
                "release":"http://v.juhe.cn"
        ]
        //统一管理module的第三方依赖
        dependencies = [
                corektx: 'androidx.core:core-ktx:1.7.0',
                appcompat: 'androidx.appcompat:appcompat:1.3.0',
                material: 'com.google.android.material:material:1.4.0',
                constraintlayout: 'androidx.constraintlayout:constraintlayout:2.0.4',
                junit: 'junit:junit:4.13.2',
                junittest: 'androidx.test.ext:junit:1.1.3',
                espressocore: 'androidx.test.espresso:espresso-core:3.4.0',
        ]
        //路由
        libARouter= 'com.alibaba:arouter-api:1.5.2'
        libARouterCompiler = 'com.alibaba:arouter-compiler:1.5.2'
        //Gson解析
        libGson = 'com.google.code.gson:gson:2.8.9'
    }
    
    1. 引入config.gradle配置文件,在project全局中build.grale文件添加 apply from:"config.gradle"
    plugins {
        id 'com.android.application' version '7.2.1' apply false
        id 'com.android.library' version '7.2.1' apply false
        id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
    }
    
    //引入config全局配置文件
    apply from:"config.gradle"
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
    1. 配置module,通过全局配置文件中的 isDebug 控制,来实现module和library之间的转换,我们对module中的build.grale文件作一下修改(这里修改的是module_login下面的)
    apply from: '../config.gradle'
    if (isDebug){
        apply plugin: 'com.android.application'
    }else {
        apply plugin: 'com.android.library'
    }
    apply plugin:'org.jetbrains.kotlin.android'
    apply plugin: 'kotlin-kapt'
    android {
        compileSdk rootProject.ext.android.compileSdkVersion
    
        defaultConfig {
            if (isDebug){
                applicationId rootProject.ext.applicationid.lgoin
            }
            minSdk rootProject.ext.android.minSdkVersion
            targetSdk  rootProject.ext.android.targetSdkVersion
            versionCode  rootProject.ext.android.versionCode
            versionName rootProject.ext. android.versionName
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
    
            //kotlin 路由配置
            kapt {
                arguments {
                    arg("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
        }
        sourceSets{
            main{
                if (isDebug){
                    manifest.srcFile 'src/main/debug/AndroidManifest.xml'
                }else {
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                }
            }
        }
        kotlinOptions {
            jvmTarget = '1.8'
        }
    }
    
    dependencies {
        implementation rootProject.ext.dependencies.corektx
        implementation rootProject.ext.dependencies.appcompat
        implementation rootProject.ext.dependencies.material
        implementation rootProject.ext.dependencies.constraintlayout
        testImplementation rootProject.ext.dependencies.junit
        androidTestImplementation rootProject.ext.dependencies.junittest
        androidTestImplementation rootProject.ext.dependencies.espressocore
        implementation project(path: ':lib_common')
    
        //kotlin路由配置
        implementation rootProject.ext.libARouter
        kapt rootProject.ext.libARouterCompiler
    }
    
    1. 添加AndroidManifest.xml文件,这里解释下为什么要添加AndroidManifest.xml。当module作为library库时,AndroidManifest.xml里面的内容是有区别的
    • 作为library,目录位置src/main/AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.module.login">
    
        <application>
            <activity
                android:name="com.module.login.TestActivity" />
        </application>
    
    </manifest>
    
    • 作为module单独运行,目录位置src/main/debug/AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.module.login">
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:name="com.module.login.App"
            android:theme="@style/Theme.Demo">
            <activity
                android:name="com.module.login.TestActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    1. 完成上面几步,module_login模块就配置完了,其他module依照配置就可以了。另外需要注意,组件开发,一般会引入路由框架ARoute,实现模块之间的的跳转。具体怎么实现,请看ARoute使用

    四、具体效果展示

    1. 当config.gradle配置文件中的 isDebug=true 时
      图2
    1. 当config.gradle配置文件中的 isDebug=false 时
      图3

    五、总结

    总的来说还算顺利,期间就出现了些小问题,但还是值得注意

    1. 包重名问题,创建项目时没注意,导致包重名了。Android修改包名
    2. 路由ARoute配置,跳转提示找不到路径,主要时因为我当时想试试java和kotlin不同配置,详细请看Android路由ARoute使用
    3. 组件开发特别需要注意资源重名,为了避免这个问题,可以在module中的build.gradle中添加resourcePrefix "xxx_" 前缀提示,这样每次添加资源,系统会提示加前缀

    相关文章

      网友评论

        本文标题:Android组件开发

        本文链接:https://www.haomeiwen.com/subject/tlwjirtx.html