Android组件化之模块单独调试

在组件化过程中,各个功能 module 为互相独立的,这个 module 一般是 library 且无法独自运行的。开发此 module 过程中,要查看效果的话,就要运行整个 app,显然比较麻烦。现在,我们想要此 module 也具有单独运行的能力,在开发完成后再集成到整个项目里。

动态改变 module 为 library或application

在 module 目录下,新建 gradle.properties 文件,文件里新建属性 runAlone: runAlone=false false为library,true为application。然后我们读取这个变量,根据值来动态使用如下插件的一种:

apply plugin: 'com.android.application'
apply plugin: 'com.android.library'
复制代码

gradle 读取 properties

如果是 gradle.properties,在 build.gradle 中可以直接访问定义的属性。

如果是自定义文件名的比如 "config.properties",就要用流的方式读取:

def props = new Properties()
file("config.properties").withInputStream { props.load(it) }
def runAlone = props.getProperty("runAlone")
复制代码

控制启动 Activity

在 library 里是无启动 activity 的,而在 application 里是要有的并且要在 activity 声明时指定启动界面,如何在 runAlone 不同模式下改变哪?为两种不同的模式指定不同的 AndroidManifest.xml。这时就要用到 gradle 中 sourceSets 属性了,使用这个属性也可以让两种模式共用或者添加自己的文件。

sourceSet 与项目结构有关,默认的情况下,项目的目录结构是固定的,但是 gradle 可以修改。通过修改 sourceSets 中的属性,可以指定哪些源文件(或文件夹下的源文件)要被编译,哪些源文件要被排除。gradle 插件默认实现了两个 sourceSet,main和test。在构建脚本中,sourceSet 常有下面使用情形:

  • 不同模式 sourceSets 中配置不同文件(例如在组件化开发中, 我们需要针对debug与release模式下, 指定不同的Manifest文件)
sourceSets {
    main {
        if (isDebug.toBoolean()) {
            manifest.srcFile 'src/main/debug/AndroidManifest.xml'
        } else {
            manifest.srcFile 'src/main/release/AndroidManifest.xml'
        }
    }
}
复制代码
  • 加一些需要的 java 文件, 但不想按照 java 标准的文件夹结构
sourceSets {
    main {
        java {
            srcDir 'src/myJavaPath'
        }
    }
}
复制代码
  • 打包的时候, 不包含某些文件
sourceSets {
    main {
        java {
            exclude '/test/**' // 不想包含文件的路径
        }
        resources {
            exclude '/resource/**' // 不想包含的资源文件路径
        }
        .....
    }
}
复制代码
  • 也可以为 flavor 或者 buildType 设置
sourceSets {
    alpha.java.srcDirs = ['src/prod/java', 'src/main/java']
    xiaomi.java.srcDirs = ['src/prod/java', 'src/main/java']
    google.java.srcDirs = ['src/prod/java', 'src/main/java']
}
复制代码

整体实现

有了上面的知识作为铺垫,就可以看整个实现了。 /buildscript/runAlone.gradle: 把主要逻辑都写在这个文件里,其它 moudle 在使用时直接 module 下的 build.gradle 里引用即可。

if (!project.hasProperty("runAlone")) {
    throw new RuntimeException("runAlone is not config in gradle.properties")
}

if (runAlone == true) { 
    project.apply plugin: 'com.android.application'
    project.android.sourceSets {
        main {
            manifest.srcFile 'src/main/runalone/AndroidManifest.xml'
            java.srcDirs = ['src/main/java', 'src/main/runalone/java'] //指定两个源文件目录
            res.srcDirs = ['src/main/res', 'src/main/runalone/res'] //指定两个资源目录
        }
    }
    println 'apply plugin application'
} else {
    project.apply plugin: 'com.android.library'
    println 'apply plugin library'
}
复制代码

在 moudle 里的 build.gradle 直接引用上面文件即可,如下:

apply from: "$rootDir/buildscript/runAlone.gradle"
android {
    buildToolsVersion ver.buildToolsVersion
    ....
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    ...
}
复制代码

详细源码细节见: github.com/edreamoon/F…

转载于:https://juejin.im/post/5ab09423f265da23731446b1

你可能感兴趣的:(移动开发,java)