Replugin host gradle插件分析

几个链接
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("", newManifest + "")
                    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任务的作用,还没有搞清楚

你可能感兴趣的:(android,replugin)