网站建设优化服务熊掌号,龙岩求职信息网,苍南具城乡建设局网站,工业产品设计名词解释问题#xff1a;实际业务变化快#xff0c;而工程内各个功能模块耦合度太高#xff0c;不能对功能模块进行快速方便地拆分或组装。团队共同开发中#xff0c;可能一个文件同时被多人修改#xff0c;导致每次更新提交代码都需要消耗大量时间去merge代码。每次修改#xff…问题实际业务变化快而工程内各个功能模块耦合度太高不能对功能模块进行快速方便地拆分或组装。团队共同开发中可能一个文件同时被多人修改导致每次更新提交代码都需要消耗大量时间去merge代码。每次修改都需要进行功能测试和系统测试。目的解决以上问题使项目可以灵活配置功能模块完全解耦实践组件化之路。实现在之前的开发中一个应用程序我们将全部功能模块都写在工程app包中。实践组件化我们将各个功能模块独立出来最终以依赖包的形式整合到app主Module中去。在这里我写了个项目demo简单分了几个功能模块应用结构如下图所示项目组件化结构图说明每一个组件module是一个子工程子工程可以依赖基础库baselibrary可独立运行也可以作为主工程的依赖库。具体实现1配置项目的buildscript如下图所示buildscript配置关于butterknife的配置及用法http://jakewharton.github.io/butterknifebutterknife8支持在lib库中注解。2在主app module gradle中如下配置applyplugin:com.android.applicationapplyplugin:android-aptandroid {compileSdkVersion COMPILE_SDK_VERSION as intbuildToolsVersion BUILD_TOOLS_VERSIONdefaultConfig {applicationId APPLICATION_IDminSdkVersion MIN_SDK_VERSIONas inttargetSdkVersion TARGET_SDK_VERSIONas intversionCode 1versionName 1.0}signingConfigs {debugConfig {storeFile file(***.jks)storePassword ******keyAlias *****keyPassword ******}releaseConfig {storeFile file(******.jks)storePassword ********keyAlias *****keyPassword*******}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android.txt), proguard-rules.pro}}dependencies {if(!isDebug.toBoolean()) {//各个模块作为库加载compile project(:loginmodule)compile project(:startmodule)compile project(:homemodule)compile project(:msgmodule)}else{//各模块独立运行compile project(:baselibrary)}//routeraptcom.github.mzule.activityrouter:compiler:1.1.7}说明关于activityrouter的配置及使用在后面会说到。3baselibrary作为各个模块共同依赖的基础库其gradle配置如下applyplugin:com.android.libraryapplyplugin:com.jakewharton.butterknifeapplyplugin:android-aptandroid {compileSdkVersion24buildToolsVersion25.0.2defaultConfig {minSdkVersion15targetSdkVersion24versionCode1versionName1.0}buildTypes {release {minifyEnabledfalseproguardFiles getDefaultProguardFile(proguard-android.txt),proguard-rules.pro}}}dependencies {compile fileTree(include: [*.jar],dir:libs)androidTestCompile(com.android.support.test.espresso:espresso-core:2.2.2, {excludegroup:com.android.support,module:support-annotations})compilecom.android.support:appcompat-v7:24.2.1compilecom.jakewharton:butterknife:8.5.1aptcom.jakewharton:butterknife-compiler:8.5.1compilecom.github.mzule.activityrouter:activityrouter:1.2.2}4在子工程模块gradle配置如下(以homemodule为例)if(isDebug.toBoolean()) {applyplugin:com.android.application}else{applyplugin:com.android.library}applyplugin:com.jakewharton.butterknifeapplyplugin:android-aptandroid {compileSdkVersion24buildToolsVersion25.0.2defaultConfig {minSdkVersion15targetSdkVersion24versionCode1versionName1.0testInstrumentationRunnerandroid.support.test.runner.AndroidJUnitRunner}buildTypes {release {minifyEnabledfalseproguardFiles getDefaultProguardFile(proguard-android.txt),proguard-rules.pro}}sourceSets {main{if(isDebug.toBoolean()) {manifest.srcFilesrc/debug/AndroidManifest.xml}else{manifest.srcFilesrc/release/AndroidManifest.xml}}}resourcePrefixhome_}dependencies {compile fileTree(dir:libs,include: [*.jar])androidTestCompile(com.android.support.test.espresso:espresso-core:2.2.2, {excludegroup:com.android.support,module:support-annotations})compile project(:baselibrary)aptcom.jakewharton:butterknife-compiler:8.5.1//routeraptcom.github.mzule.activityrouter:compiler:1.1.7}说明当module单独运行和作为module运行时其activity在manifest中设置也会不同这里可以根据isDebug设置不同的manifest。当分别开发模块时容易出资源重复命名的问题可以在build.gradle中设置resourcePrefix home_通过给模块设置不同的资源前缀可以避免重复命名。Activity跳转问题从上面的配置中可以看到项目引入了aptcom.github.mzule.activityrouter:compiler:1.1.7我们为什么使用ActivityRouter呢当我们把各个功能模块抽成独立的lib的时候各个模块之间难免要进行Activity的跳转及传参。我们不能再像以前那样直接通过startActivity来实现跳转了。关于ActivityRouter的配置及用法https://github.com/mzule/ActivityRouter使用在application中注解Modules({app,homeModule,loginModule,startModule,msgModule})public class XxxxApplication extends Application {}每个module中创建空java类注解Module(homeModule)public class HomeModule{}组件间通信问题不同组件Activity之间传递大量数据时可以通过EventBus来进行传递EventBus原理及用法https://github.com/greenrobot/EventBus编译运行当在gradle.properties中设置isDebugtrue时可以独立运行每个module独立运行调试当设置isDebugfalse可以编译运行整个project注意isDebug变量设置改变时要重新对gradle进行sync。可能遇到的一些问题1如果遇到/com/github/mzule/activityrouter/router/RouterInit.java javaError:(7, 5) 错误: 找不到符号 符号: 变量 RouterMapping等错误请检查app是否把各个Module都依赖进来了。2使用butterknife注解时每个Module会对应生成R2文件即使在base库里注解过了Module也要重新注解组件中不能直接使用。3如果项目中使用到menu注意Overrideprotected void onMenuItemClick(MenuItem item) {// switch (item.getItemId()) {// case R2.id.xxx:// Routers.open(mContext,);// break;// }if (item.getItemId() R.id.xxx){Routers.open(mContext,);}super.onMenuItemClick(item);}寻找对应的menu id时用if else 代替 switch注itemid 和 R2值不一样和R是一样的。