pins工程来源于微信的重构实践,能将java代码、源码都拆出来到单独文件夹
参考文章:
不同的 flavor 在src下是可以创建对应的文件夹的,不需要在 sourceSets 里设置,其级别非常高,如:有flavor international,编译 international 风格的apk时,在international/res/strings.xml 中的 app_name 将取代默认 strings.xml 中的app_name。不同的flavor如果少量代码逻辑不一至可以通过这种方案分开写
自动生成文件夹
pins文件夹的创建比较麻烦,这里借助gradle可以进行一些自动化:
- project下创建pins.gradle文件
/*
* pins 模块文件夹设置
*/
ext {
pins = [
"p_pathanimation",
"p_chartview",
"p_guideview",
"p_qicychome",
"p_servicesingle",
"p_splashindicator",
"p_svg",
"p_tooltip",
"p_parabolicanimation",
"p_fantan"
]
}
/*
* manifest 合并代码来自于:
* https://github.com/EastWoodYang/MicroModule/blob/master/micro_reference.gradle
*/
import com.android.manifmerger.ManifestMerger2
import com.android.manifmerger.MergingReport
import com.android.manifmerger.XmlDocument
import com.android.utils.ILogger
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath "com.android.tools.build:manifest-merger:26.1.1"
}
}
def logger = new ILogger() {
@Override
void error(Throwable t, String msgFormat, Object... args) {
}
@Override
void warning(String msgFormat, Object... args) {
}
@Override
void info(String msgFormat, Object... args) {
}
@Override
void verbose(String msgFormat, Object... args) {
}
}
def mergeManifest = { ->
File mainManifestFile = new File("$projectDir/src/main/AndroidManifest.xml")
ManifestMerger2.MergeType mergeType = ManifestMerger2.MergeType.APPLICATION
XmlDocument.Type documentType = XmlDocument.Type.MAIN
ManifestMerger2.Invoker invoker = new ManifestMerger2.Invoker(mainManifestFile, logger, mergeType, documentType)
pins.each { pinName ->
File microManifestFile = new File("$projectDir/src/$pinName/AndroidManifest.xml")
if (microManifestFile.exists()) {
printf("合并 ${pinName} 的 AndroidManifest.xml\n")
invoker.addLibraryManifest(microManifestFile)
} else {
printf("${pinName} 没有 AndroidManifest.xml 不需要合并")
}
}
def mergingReport = invoker.merge()
def moduleAndroidManifest = mergingReport.getMergedDocument(MergingReport.MergedManifestKind.MERGED)
new File("$buildDir").mkdirs()
def file = new File("$buildDir/AndroidManifest.xml")
file.createNewFile()
file.write(moduleAndroidManifest)
}
task createPinsDirectory {
pins.each { pinName ->
if (file("$projectDir/src/${pinName}").exists()) {
printf("目录 ${pinName} 已经存在\n")
} else {
String packageDir = rootProject.ext.applicationId.replace(".", "/")
printf("为 ${pinName} 创建目录\n")
// 创建java目录
new File("$projectDir/src/${pinName}/java/" + packageDir).mkdirs()
// 创建资源文件目录
new File("$projectDir/src/${pinName}/res").mkdirs()
}
}
}
task mergeManifestTask {
mergeManifest()
}
preBuild.doFirst {
mergeManifest()
}
- module/build.gradle 文件 android 节点修改:
// ...productFlovar, defaultConfig等其他设置...
sourceSets {
main {
# jniLibs.srcDirs 等其他设置
pins.each { dir ->
java.srcDir("src/$dir/java")
res.srcDir("src/$dir/res")
}
}
}
在 pinss.gradle 的 pins 中添加pins名称以后,终端进入module文件夹执行:
../gradlew createPinsDirectory
即可在module的src目录下生成 pins 的文件夹,同步完成以后在对应文件夹进行编码等操作即可
- 20180409 16:05
添加 AndroidManifest.xml的合并