Replugin host gradle插件分析

来源:互联网 发布:王者荣耀聊天软件 编辑:程序博客网 时间:2024/06/05 14:10

几个链接
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

看看具体实现

@Overridepublic 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    // ...}
  1. 根据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. 跟第1步对比,这里是获取build.gradle的配置AppExtension。其中的applicationVariants就是配置的集合,例子。
  2. 创建show plugin任务,这个任务就是写入plugins-builtin.json,跟第7步的目的是重复的,还不明白创建这样一个任务的原因,==存疑==
  3. 根据配置生成manifest中各组件的声明,包括占坑activity的生命、provider等
  4. 生成RePluginHostConfig类,框架会通过反射读取类中的配置
  5. 遍历assets/plugins中的文件,并生成plugins-builtin.json
  6. 将第5步生成的manifest片段写入xml

总结:

host gradle的步骤很清晰。需要注意的是两点
1. 需要进一步熟悉android gradle构建过程,包括AppExtension中各字段的含义及使用
2. show plugin任务的作用,还没有搞清楚