Android模块化初体验及教程

Stella981
• 阅读 551

Android模块化

一直是Android开发届一个很火的话题,因为公司业务太多,代码越来越臃肿,越来越难维护,为了提升开发效率,减低代码的维护成本,所以采取了模块化开发方案。

我们知道,模块化其实就是讲每个业务,拆分成每个独立的模块,然后通过某种协议来达到模块与模块之间的通信。

一般公司的项目的结构大概的如下:

Android模块化初体验及教程

那自己要怎么做到这个效果呢?

1.第一步

在项目根目录新建一个文件 config.gradleAndroid模块化初体验及教程

Android模块化初体验及教程

内容如下:

ext {
    // false 单独运行模式
    // true 组建依赖模式
    isComponent = true
    androidConfig = [
            compileSdkVersion: 28,
            minSdkVersion    : 19,
            targetSdkVersion : 28,
            versionCode      : 1,
            versionName      : "1.0"
    ]
    appIdConfig = [
            // 这里放置,每个模块的包名
            module1   : "com.xiaolei.module1"
    ]
    appcompat_v7_version = '28.0.0'
}

2.第二步

在你的 Projectbuild.gradle

Android模块化初体验及教程

添加这么一句

apply from: "config.gradle"

3.第三步

在你模块下的 build.gradle 里添加如下:Android模块化初体验及教程

//配置apply
if (isComponent) {
    apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'
}
// 如果你使用kotlin,那么也要在模块下添加kotlin的配置
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

//获取config文件中的配置 rootProject 项目的主对象
def config = rootProject.ext.androidConfig
def appIdConfig = rootProject.ext.appIdConfig

android {
    compileSdkVersion config.compileSdkVersion
    defaultConfig {
        minSdkVersion config.minSdkVersion
        targetSdkVersion config.targetSdkVersion
        versionCode 1
        versionName "1.0"

        //如果moudle不是组件,意思就是单独运行模式
        if (!isComponent) {
            applicationId appIdConfig.module1
        }

        //配置BuildConfig 代码中可以调用判断moudle是否为组件
        buildConfigField("boolean", "isComponent", String.valueOf(isComponent))
        //配置资源文件
        sourceSets {
            main {
// 这里需要特别注意一下,区分两种模式,要区分两个不同的 AndroidManifest.xml
                //如果是单独运行模式则配置 AndroidManifest 
                if (!isComponent) {
                    manifest.srcFile 'src/main/java/AndroidManifest.xml'
                } else {
                    manifest.srcFile 'src/main/AndroidManifest.xml'
                }
            }
        }
    }
}

4.第四步

在你的APP的Module里配置 Android模块化初体验及教程

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    if (isComponent) {//module1 是模块化模式时才允许导入
        implementation project(':module1')
    }
}

独立运行时候的Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.xiaolei.module1">

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/BaseTheme"
            tools:ignore="GoogleAppIndexingWarning">
        <activity android:name=".TestMainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".Module1Activity"/>
    </application>

</manifest>

组件化依赖时候的Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.xiaolei.module1">

    <application>
        <activity android:name=".Module1Activity"/>
    </application>
</manifest>

5.第五步

看教程看到哪里少了文件了,就去哪里的文件夹里自己去新建一个吧

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这