组件化开发框架的简单使用

这篇笔记是想要对我最近学习的组件化开发做一个简单的笔记,加深学习的印象。

首先说一下什么是组件化开发:组件化开发就是在团队开发中可能会有功能上的大的模块,可以将其分为不同的组件,这些组件在平时开发中可以单独作为app运行调试,当正式上线的时候打包为一个apk,组件化开发好处就是模块化,更加清晰,而且便于管理和调试,不用说调试一个模块的功能整个项目都一起跟着跑.组件化开发的示例图如下:


接下来具体说一下组件开发简单框架搭建的一个搭建:

(1)配置application与library之间的切换(单独开发的时候是application,等到合并的时候是library)

在整个个项目的gradle.properties中配置:

#每次更改“isModule”的值后,需要点击 "Sync Project" 按钮
isModule=false

组件的build.gradle中如下配置:当是单独开发的时候配置为application,合并的时候配置为library:

if (isModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

(2)解决合并组件和主app之间的menifest冲突问题

1.在组件的main 目录下建立两个目录来维护两个menifest(一个是单独可运行的(debug下),一个是作为library合并后的(release下))


debug下的menifest:就是类似于主app的menifest,可以单独运行,指定启动的activity,可以指定application


release下的menifest:不可以指定的application以及启动的activity:


2.组件里面的build.gradle要配置何时用哪个menifest文件(保证合并是不冲突,单独的时候有启动的activity)

sourceSets {
    main {
        if (isModule.toBoolean()) {
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        } else {
            manifest.srcFile 'src/main/release/AndroidManifest.xml'
            //集成开发模式下排除debug文件夹中的所有Java文件
            java {
                exclude 'debug/**'
            }
        }
    }
}


(3)解决主app和组件之间的application的冲突问题

当android程序启动时,android系统会为每个程序创建一个Application类的对象,并且只创建一个,但是我们在组件化开发的时候每一个组件可能都会有一个自己的Application类的对象但是当所有组件要打包合并在一起的时候就会出现问题,因为最后程序只有一个Application。所以解决的办法就是创建一个commonLibrary,这里存放公共基类,工具类,自定义view,比如baseActivity ,BaseFragment,BaseApplication等,每个组件都依赖commonLibrary

创建library:CommonLibrary,定义BaseApplication:

public class BaseApplication extends Application {
    private static BaseApplication sInstance;
    public static Context context;
    public static BaseApplication getsInstance() {
        return sInstance;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        sInstance = this;
        context = this.getApplicationContext();
    }
}

每个组件如果要定义自己的application的时候只要继承这个BaseApplication即可,当然如果整体打包运行的时候不需要自己的application那么就排除掉组件的application:在组件的build.gradle中如下




4.解决library重复依赖问题,第三方版本号控制问题

将常用的第三方库放到commonlibrary的组件的build.gradle的依赖中,然后组件依赖commonlibrary库

commonlibrary:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //Android Support
    compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
    testCompile "junit:junit:$rootProject.junitVersion"

    androidTestCompile("com.android.support.test.espresso:espresso-core:$rootProject.espressoVersion", {
        exclude group: 'com.android.support', module: 'support-annotations'})

    compile "org.greenrobot:eventbus:$rootProject.eventbusVersion"

    annotationProcessor "com.github.mzule.activityrouter:compiler:$rootProject.annotationProcessor"

    //router
    compile "com.github.mzule.activityrouter:activityrouter:$rootProject.routerVersion"

}
组件的依赖:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':lib_common')

}
主app的依赖:当组件独立运行时候,主app需要单独依赖commonlibrary:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
     if (isModule.toBoolean()) {
        compile project(':lib_common')
    } else {
        compile project(':lib_demo')
        compile project(':lib_test')

    }
}

接下来是整体版本的控制:在整个项目的build.gradle中配置ext

// Define versions in a single place
ext {
// Sdk and tools
    buildToolsVersion = "25.0.2"
    compileSdkVersion = 25
    minSdkVersion = 14
    targetSdkVersion = 25
//时间:2017.2.13;每次修改版本号都要添加修改时间
    versionCode = 1
    versionName = "1.0"
    javaVersion = JavaVersion.VERSION_1_8
// App dependencies version
    supportLibraryVersion = "25.3.1"
    junitVersion = "4.12"
    espressoVersion = "2.2.2"

    annotationProcessor = "1.1.7"
    routerVersion = "1.2.2"
    eventbusVersion = "3.0.0"
}

主项目和插件可以统一修改:

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode rootProject.ext.versionCode
        versionName rootProject.ext.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }




}

最后一步就是组件之间的activity调用,这里说道一个路由 ,这里使用的是activity Router 大家可以去查,这里说一下大概的使用步骤:

(1)整个项目的build.gradle:

dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
(2)引入第三方依赖:

annotationProcessor "com.github.mzule.activityrouter:compiler:$rootProject.annotationProcessor"

//router
compile "com.github.mzule.activityrouter:activityrouter:$rootProject.routerVersion"

(3)主app的menifest中

<activity
    android:name="com.github.mzule.activityrouter.router.RouterActivity"
    android:theme="@android:style/Theme.NoDisplay">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" /><!--改成自己的scheme-->
    </intent-filter>
</activity>

(4)指定要跳转到的activity:

@Router("test")
public class TestActivity extends Activity {
    TextView tvmy;

    @Override
(5)跳转时:

Routers.open(DemoActivity.this, "myapp://test");

传递数据用到了EventBus,这里就不细说了,下面是我写的一个简单的小demo,有需要的可以下载来简单学习,有什么不对的地方随时欢迎指出与交流

GitHub: https://github.com/wjn919/MyModuleDemo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值