组件化开发框架的简单使用
这篇笔记是想要对我最近学习的组件化开发做一个简单的笔记,加深学习的印象。
首先说一下什么是组件化开发:组件化开发就是在团队开发中可能会有功能上的大的模块,可以将其分为不同的组件,这些组件在平时开发中可以单独作为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