几个链接
1. 如何断点gradle:http://blog.csdn.net/ceabie/article/details/55271161
,简单总结一下:
- 在gradle工程中配置remote调试任务
- 在使用gradle的工程中使用命令开始编译,命令:./gradlew assembleDebug -Dorg.gradle.daemon=false -Dorg.gradle.debug=true
- 在gradle工程中,开始remote调试任务的debug,android studio菜单路径Run->Debug ‘remote xxx’
2. Android Gradle DSL reference:http://google.github.io/android-gradle-dsl/current/index.html#N10009
3. Gradle DSL reference:https://docs.gradle.org/current/dsl/
4. 一个gradle插件编写的过程:http://blog.csdn.net/feelang/article/details/52637217
看看具体实现
@Override
public void apply(Project project) {
println "${TAG} Welcome to replugin world ! "
this.project = project
// 1、自定义配置
project.extensions.create(AppConstant.USER_CONFIG, RepluginConfig)
// 2、如果是app
if (project.plugins.hasPlugin(AppPlugin)) {
// 3、通过AppExtension得到build.gradle里的配置和任务信息
def android = project.extensions.getByType(AppExtension)
android.applicationVariants.all { variant ->
// 4、添加 show plugin任务
addShowPluginTask(variant)
if (config == null) {
config = project.extensions.getByName(AppConstant.USER_CONFIG)
checkUserConfig(config)
}
// 5、生成replugin host需要的manifest,比如占坑activity的生命、provider等
def appID = variant.generateBuildConfig.appPackageName
def newManifest = ComponentsGenerator.generateComponent(appID, config)
def variantData = variant.variantData
def scope = variantData.scope
// 6、生成RePluginHostConfig类,框架会通过反射读取类中的配置
def generateHostConfigTaskName = scope.getTaskName(AppConstant.TASK_GENERATE, "HostConfig")
def generateHostConfigTask = project.task(generateHostConfigTaskName)
generateHostConfigTask.doLast {
FileCreators.createHostConfig(project, variant, config)
}
generateHostConfigTask.group = AppConstant.TASKS_GROUP
String generateBuildConfigTaskName = variant.getVariantData().getScope().getGenerateBuildConfigTask().name
def generateBuildConfigTask = project.tasks.getByName(generateBuildConfigTaskName)
if (generateBuildConfigTask) {
generateHostConfigTask.dependsOn generateBuildConfigTask
generateBuildConfigTask.finalizedBy generateHostConfigTask
}
// 7、解析assets,并生成plugins-builtin.json
def generateBuiltinJsonTaskName = scope.getTaskName(AppConstant.TASK_GENERATE, "BuiltinJson")
def generateBuiltinJsonTask = project.task(generateBuiltinJsonTaskName)
generateBuiltinJsonTask.doLast {
FileCreators.createBuiltinJson(project, variant, config)
}
generateBuiltinJsonTask.group = AppConstant.TASKS_GROUP
String mergeAssetsTaskName = variant.getVariantData().getScope().getMergeAssetsTask().name
def mergeAssetsTask = project.tasks.getByName(mergeAssetsTaskName)
if (mergeAssetsTask) {
generateBuiltinJsonTask.dependsOn mergeAssetsTask
mergeAssetsTask.finalizedBy generateBuiltinJsonTask
}
// 8、merge第5步生成的manifest
variant.outputs.each { output ->
output.processManifest.doLast {
def manifestPath = output.processManifest.outputFile.absolutePath
def updatedContent = new File(manifestPath).getText("UTF-8").replaceAll("</application>", newManifest + "</application>")
new File(manifestPath).write(updatedContent, 'UTF-8')
}
}
}
}
}
分步骤仔细看看
1. project.extensions.create(AppConstant.USER_CONFIG, RepluginConfig);
通过create方法给project添加配置,在app工程apply plugin之后,就可以在build.gradle中添加自定义配置,比如这里,AppConstant.USER_CONFIG是配置的名称,值是repluginHostConfig,那么,在build.gradle就可以这样配置了,其中countProcess就是类RepluginConfig中的变量
repluginHostConfig {
countProcess = 4
// ...
}
- 根据plugin类型判断是app还是library
Object (java.lang)
BasePlugin (com.android.build.gradle)
AppPlugin (com.android.build.gradle)
LibraryPlugin (com.android.build.gradle)
TestPlugin (com.android.build.gradle)
- 跟第1步对比,这里是获取build.gradle的配置AppExtension。其中的applicationVariants就是配置的集合,例子。
- 创建show plugin任务,这个任务就是写入plugins-builtin.json,跟第7步的目的是重复的,还不明白创建这样一个任务的原因,==存疑==
- 根据配置生成manifest中各组件的声明,包括占坑activity的生命、provider等
- 生成RePluginHostConfig类,框架会通过反射读取类中的配置
- 遍历assets/plugins中的文件,并生成plugins-builtin.json
- 将第5步生成的manifest片段写入xml
总结:
host gradle的步骤很清晰。需要注意的是两点
1. 需要进一步熟悉android gradle构建过程,包括AppExtension中各字段的含义及使用
2. show plugin任务的作用,还没有搞清楚