参考:https://www.jianshu.com/p/2c2971bd4fc4
https://www.jianshu.com/p/ba32488f9555
- 新建Android工程-------WhApp
- 在工程的
build.gradle
将所有module中的版本号统一。
//使用这种统一的依赖定义,ide会主动提示版本升级,如果放在config.gradle ide就不会主动提示版本升级
ext {
compileSdkVersion = 30
buildToolsVersion = "30.0.2"
minSdkVersion = 26
targetSdkVersion = 30
appcompatVersion="1.2.0"
materialVersion="1.2.1"
constraintlayoutVersion="2.0.4"
junitVersion="4.13.1"
androidxJunitVersion="1.1.2"
espressoCoreVersion="3.3.0"
}
在module中使用示例如下:
- 在工程下面新建文件夹moduleDemo--------用于存放某一统一大类型的module(示例新建的moduleDemoA、moduleDemoB)
在工程的主目录的setting.gradle
文件中可以配置module的位置,排至示例如下:
include ':common_lib_wh'
include ':moduleDemo:moduleDemoB'
include ':moduleDemo:moduleDemoA'
include ':app'
rootProject.name = "WhApp"
-
在跟目下的
gradle.properties
中配置自定义字段isModule
,作为“集成开发模式”和“组件开发模式”的切换开关。
在module的gradle中配置:
-
防止资源命名重复
-
解决组件AndroidManifest和主工程AndroidManifest合并的问题
配置两套AndroidManifest.xml
文件
并在gradle中配置
区别:
module文件夹中注册表的标签中指定了具体application类,而release文件夹中的则没有,
module文件夹中注册表的标签中添加一些application属性,而release文件夹中的则什么都没有添加;
module文件夹中的注册表指定QueryActivity为MAIN Activity,也就是要启动的 Activity,而release文件夹中的则没有;
module文件夹中:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hjqjl.moduledemoa">
<application
android:name="debug.DemoAApplication"
android:allowBackup="false"
android:icon="@mipmap/demoa_ic_launcher"
android:label="@string/demoa_app_name"
android:roundIcon="@mipmap/demoa_ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/DemoaTheme.WhApp">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
release文件夹中:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hjqjl.moduledemoa">
<application android:theme="@style/DemoaTheme.WhApp">
<activity android:name=".MainActivity" />
</application>
</manifest>
注:APP可以做个壳,入口activity写在需要的module中。
- 创建公共通用库common_lib_wh,用于放公共用到的东西,其他module的gradle中添加此库
//implementation声明的依赖包只限于模块内部使用,不允许其他模块使用。
//api声明的依赖包时, 模块依赖于此模块,此模块使用api声明的依赖包是可以被其他模块使用
-
解决组件和主工程的Application冲突问题以及组件单独开发初始化(共享)数据问题。
在common_lib_wh
中创建BaseApplication,所有module中的Application都继承它。module中的自定义Application都建在Java目录下debug文件家中,与gradle中的配置配合,在作为lib时移除。 -
解决library重复依赖以及Sdk和依赖的第三方库版本号控制问题
Library重复依赖的解决办法就是给整个工程提供统一的依赖第三方库的入口,刚建的common_lib_wh
,把项目常用或者必须用到的库全部在Common库的build.gradle
中依赖进来
Common组件除了有功能组件的普遍属性外,还具有其他功能:
1、Common组件的 AndroidManifest.xml 不是一张空表,这张表中声明了我们 Android应用用到的所有使用权限 uses-permission 和 uses-feature,放到这里是因为在组件开发模式下,所有业务组件就无需在自己的 AndroidManifest.xm 声明自己要用到的权限了。
2、Common组件的 build.gradle 需要统一依赖业务组件中用到的 第三方依赖库和jar包,例如我们用到的ActivityRouter、Okhttp等等。
3、Common组件中封装了Android应用的 Base类和网络请求工具、图片加载工具等等,公用的 widget控件也应该放在Common 组件中;业务组件中都用到的数据也应放于Common组件中,例如保存到 SharedPreferences 和 DataBase 中的登陆数据;
4、Common组件的资源文件中需要放置项目公用的 Drawable、layout、sting、dimen、color和style 等等,另外项目中的 Activity 主题必须定义在 Common中,方便和 BaseActivity 配合保持整个Android应用的界面风格统一。