美文网首页Android Basics
android组件化开发实战

android组件化开发实战

作者: Peakmain | 来源:发表于2019-01-01 01:13 被阅读0次

概念

将APK拆分为多个模块(组件)进行开发,开发阶段组件可单独测试,通用组件可进行依赖复用,待开发完毕阶段,将所有模块(组件)进行合并,合并为真正的APK.
组件化——模块组件与通用组件,可分为业务组件与Ui组件等等
比如下拉刷新可作为多个项目使用的Ui组件,如登录模块有多条业务线采用相同逻辑,可作为业务组件存在,多个团队使用

好处

  • 业务组件可以单独分配并行开发
  • 单个组件业务可以由开发者自行决定采取MVC/MVP/MVVM架构而不影响整体大局
  • 新同学接手项目分配任务可单独分配某一个模块任务,不必关心整个项目
  • 若公司有多个团队,优秀代码组件可快速移植复用
  • 测试可单独测试某个模块

效果图

效果图.gif

项目结构

项目结构.png 库.png

版本控制

app目录下新建一个config,gradle文件,用于版本统一管理和控制

ext {
    isApplication = false
    android = [
            compileSdkVersion: 27,
            applicationId    : "com.peakmain.testproject",
            minSdkVersion    : 19,
            targetSdkVersion : 27,
            versionCode      : 1,
            versionName      : "1.0"
    ]
    dependencies = [
            support_v7       : 'com.android.support:appcompat-v7:27.1.1',
            design           : 'com.android.support:design:27.1.1',
            cardview           : 'com.android.support:cardview-v7:27.1.1',
            constraint_layout: 'com.android.support.constraint:constraint-layout:1.1.3',
            ultra_refresh: 'in.srain.cube:ultra-ptr:1.0.11',
            circleimageview: 'de.hdodenhof:circleimageview:2.2.0',
            banners: 'com.allure0:LMBanners:1.0.8',
            recycleviewAdapter: 'com.allure0:LMRecycleViewAdapter:1.0.1',
            glide:  'com.github.bumptech.glide:glide:3.7.0',
            activityrouter:  'com.github.mzule.activityrouter:activityrouter:1.2.2',
            activityroutercompiler:  'com.github.mzule.activityrouter:compiler:1.1.7',
            eventbus: 'org.greenrobot:eventbus:3.0.0'

    ]
}

在项目的根目录build.gradle下的第一行添加

apply from: "config.gradle"

如自己新建的model名字为modela的build.gradle修改后的代码

if (rootProject.ext.isApplication) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}
android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    defaultConfig {
        if (rootProject.ext.isApplication) {
            applicationId "com.peakmain.modulea"
        } else {
        }
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        resourcePrefix "modulea_"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
          .//需要在目录main目录下新建两个目录分别为debug和release
            if (rootProject.ext.isApplication) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/release/AndroidManifest.xml'
                java {
                    //model的时候移除无用的包
                    exclude 'debug/**'
                }
            }
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation rootProject.ext.dependencies.support_v7
    implementation rootProject.ext.dependencies.constraint_layout
    implementation rootProject.ext.dependencies.baselibrary
    implementation 'com.android.support:design:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

重点说明几个

  • 1.动态切换application与lib模式,我们看上面的代码我们在config.gradle中用isApplication来管理,在module中使用一下来切换,false即为lib模式,true则为application
if (rootProject.ext.isApplication) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}
  • 2.组件与组件之间的资源命名冲突,解决方法很简单,添加以下代码就可以了,他代表在项目的名字前添加前缀名
 resourcePrefix "modulea_"
  • 3.组件与组件之间跳转

第一种方式:Intent与intent之间跳转

注意一点,这里假设有modulea和moduleb两个module,我们只需要在在app项目中,添加modulea和moduleb即可,并不需要让modela和moduleb之间相互依赖,也可以实现,modulea跳转到moduleb

 //第一种方式intent跳转
    private void goClassForName(String packageName) {
        try {
            Class aClass = Class.forName(packageName);
            Intent intent = new Intent(activity, aClass);
            startActivity(intent);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
goClassForName("com.peakmain.loginmodule.LoginActivity")`

第二种方式:ActivityRouter跳转
github:https://github.com/mzule/ActivityRouter

 // Routers.open(activity, "loginmodule://login");//单纯跳转
//带参数的跳转并赋值
 Routers.open(activity, "loginmodule://login?username=peakmain&userpassword=123456");

第三种方式跳转eventbus
github:https://github.com/greenrobot/EventBus

最后GitHub项目源码地址:https://github.com/Peakmain/componentization

相关文章

  • Gradle实战——组件化的gradle build优化

    组件化gradle build优化 关于组件化,大家可以看我之前的文章,Android组件化开发实战[https:...

  • 手写ARouter路由框架

    这里我不阐述ARouter,组件化的作用和使用方式,大家可以自行百度。android组件化开发实战 思路一 我们可...

  • Android 组件化开发实践

    Android组件化开发实践(一):为什么要进行组件化开发?Android组件化开发实践(二):组件化架构设计An...

  • 聊聊组件化开发

    如果你在京东图书频道搜索 组件化 或者 组件化开发,显示的几乎都是 Android组件化开发 或者 Android...

  • 链接

    一、组件化: 美团猫眼电影android模块化实战--可能是最详细的模块化实战 使用ViewModel共享页面内的...

  • Android组件化和插件化开发

    Android组件化和插件化开发 什么是组件化和插件化? 组件化开发 就是将一个app分成多个模块,每个模块都是一...

  • 组件化-动态库实战【续】

    组件化-动态库实战【续】 组件化-动态库实战【续】

  • android 收藏的一些好文

    1.常用git命令清单 2.Android组件化、模块化开发 3.Android 组件化案例 4. 5.

  • 推荐文章

    JavaJava中有关Null的9件事 AndroidAndroid组件化和插件化开发Android 组件化 ——...

  • Android组件化和插件化开发

    Android组件化和插件化开发 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个...

网友评论

    本文标题:android组件化开发实战

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