Android组件化踩坑记录(一)

我及得之前有写过这个文章的, 还记录了一些组件化实现初期遇到的问题
但是不知道为什么全没了。。。
好吧重写!!!
先说说为什么去实现组件化

组件化demo地址 : https://github.com/plzyxy/kotlindemo

首要原因肯定是解耦啦,不是所有的项目都是你自己手把手从零写出来,更多的是接手以前的老项目。由于每个人的经验水平和编码风格都不一样,对这个耦合程度的理解和标准也不一样,随着时间推移模块间的代码会越写相互依赖程度越大。毕竟有时候明明能直接拿过来用的,却发现需要实现各种模式什么的,真是很忧伤啊。还有在开发时发现a项目的某些功能可以直接在B上使用的,在使用时发现需要排除很多的不必要的东西以及代码迁移,那真的是很苦恼。其他原因省略吧。。。毕竟我想表达式是组件化遇到的问题。
-------先看看组件化的大概结构
这个是大概的结构
(上面的图来自 文章 https://www.jianshu.com/p/94e46c5d276b 如有争议 可联系本人删除)
我实在是懒得画图了啊 能把我要表达的东西展示出来就行了。
首先呢是把业务拆分, 所有的业务都依赖基础库 commonmodule 最后you由app 壳工程来 统一打包就好。

commonmodule ->组件化统一配置 一些必要的基础库啊包版本号啊,mvp基础类啊,网络框架,路由通信什么的统一在这封装管理。
moduleA 业务组件 例如登录 所有关于用户登录的 都放在这
。。。

这样的好处就是每个业务都解偶了
项目结构图

每个组件可以单独调试

配置如下

/**
 *  全局统一配置文件
 */
ext {
    //true 每个业务Module可以单独开发
    //false 每个业务Module以lib的方式运行
    //修改之后需要Sync方可生效
    isModule = false
    //版本号
    versions = [
            applicationId           : "com.teayork.word",        //应用ID
            versionCode             : 1,                    //版本号
            versionName             : "1.0.0",              //版本名称

            compileSdkVersion       : 28,
            buildToolsVersion       : "28.0.3",
            minSdkVersion           : 15,
            targetSdkVersion        : 28,

            androidSupportSdkVersion: "28.0.0",
            constraintLayoutVersion : "1.1.1",
            runnerVersion           : "1.0.1",
            espressoVersion         : "3.0.1",
            junitVersion            : "4.12",
            annotationsVersion      : "24.0.0",
		//....省略
         
    ]
    dependencies = ["appcompat_v7"        : "com.android.support:appcompat-v7:${versions["androidSupportSdkVersion"]}",
                    "constraint_layout"   : "com.android.support.constraint:constraint-layout:${versions["constraintLayoutVersion"]}",
                    "runner"              : "com.android.support.test:runner:${versions["runnerVersion"]}",
                    "espresso_core"       : "com.android.support.test.espresso:espresso-core:${versions["espressoVersion"]}",
                      // ...省略
                    //方法数超过65535解决方法64K MultiDex分包方法
                    "multidex"            : "com.android.support:multidex:${versions["multidexVersion"]}",

                    //路由
                    "arouter_api"         : "com.alibaba:arouter-api:${versions["arouterApiVersion"]}",
                    "arouter_compiler"    : "com.alibaba:arouter-compiler:${versions["arouterCompilerVersion"]}",
                    "arouter_annotation"  : "com.alibaba:arouter-annotation:${versions["arouterannotationVersion"]}",

                // ...省略

                   ]}
ModuleA 配置如下  
if (Boolean.valueOf(rootProject.ext.isModule)) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}
apply plugin: 'com.jakewharton.butterknife'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'org.greenrobot.greendao' // apply plugin

android {
    compileSdkVersion rootProject.ext.versions.compileSdkVersion
    buildToolsVersion rootProject.ext.versions.buildToolsVersion


    //指定jdk版本
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kapt {
        arguments {
            arg("AROUTER_MODULE_NAME", project.getName())
        }
    }

    defaultConfig {
        minSdkVersion rootProject.ext.versions.minSdkVersion
        targetSdkVersion rootProject.ext.versions.targetSdkVersion
        versionCode rootProject.ext.versions.versionCode
        versionName rootProject.ext.versions.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //MultiDex分包方法
        multiDexEnabled true

        //Arouter路由配置
//        kapt {
//            arguments {
//                arg("AROUTER_MODULE_NAME", project.getName())
//            }
//            generateStubs = true
//        }
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
                includeCompileClasspath = true
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //java插件引入了一个概念叫做SourceSets,通过修改SourceSets中的属性,可以指定哪些源文件
    //( 或文件夹下的源文件 ) 要被编译 , 哪些源文件要被排除 。
    sourceSets {
        main {
            if (Boolean.valueOf(rootProject.ext.isModule)) {
                manifest.srcFile 'src/main/module/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
                java {
                    //排除java/debug文件夹下的所有文件
                    exclude '*module'
                }
            }
        }
    }
}
//add
greendao {
    schemaVersion 3
    daoPackage 'com.teayork.module_main.dao'
    targetGenDir 'src/main/java'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //公用依赖包
    implementation project(':common_base')

    //Arouter路由
    kapt rootProject.ext.dependencies["arouter_compiler"]
//    api rootProject.ext.dependencies["arouter_annotation"]
    implementation rootProject.ext.dependencies["arouter_api"]


    //黄油刀
    annotationProcessor rootProject.ext.dependencies["butterknife_compiler"]
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"


    //google流式布局
    implementation 'com.google.android:flexbox:1.0.0'

}
repositories {
    mavenCentral()
}

if (Boolean.valueOf(rootProject.ext.isModule)) {
apply plugin: ‘com.android.application’
} else {
apply plugin: ‘com.android.library’
}

这个是用于 配置组件是否单独调试的

在跟模具及得添加应用自己的 config.gradle
apply from: “config.gradle”

基本上大概项目就搭好了

demo地址 : https://github.com/plzyxy/kotlindemo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值