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 // ...}
- 根据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任务的作用,还没有搞清楚
- Replugin host gradle插件分析
- 插件化系列开发之七--replugin源码解析之replugin-host-gradle(宿主的gradle插件)
- Replugin插件化框架简要分析
- 插件化系列开发之八--replugin源码解析之replugin-plugin-gradle(插件的gradle插件)
- android插件化框架-Replugin
- Android全面插件化方案-RePlugin踩坑
- Android 插件化框架 RePlugin 使用心得
- 使用 Gradle 插件进行代码分析
- 插件化框架 RePlugin 应用之一:配置及内置插件
- 插件化框架 RePlugin 应用之三:外置插件
- Android插件化开发—RePlugin插件化框架
- 360家的又一个插件化框架---RePlugin
- 插件化-360的DroidPlugin与RePlugin研究及集成
- 360插件化Replugin爬坑之路
- Android 插件化 RePlugin 入坑记录一
- 360Replugin插件启动Activity慢导致ANR的问题
- Android 360开源全面插件化框架RePlugin 实战
- Android 插件化 RePlugin 入坑记录二
- oracle中sql语句查询优化(三)
- 阿里云短信验证服务整套demo教程
- 产品经理基本技能业务交流
- bzoj1036 树的统计Count 树链剖分
- 使用ant替换WAR包里面的文件
- Replugin host gradle插件分析
- 深度学习的实践方面Quiz 2
- trca工具的安装及使用
- eMMC的MMC模式与SPI模式
- Activity如何向Fragment中传递数据
- JQuery控制屏幕滚动到指定控件位置
- lua支持的最大整数
- ElasticSearch搜索提示(Suggester)
- Android按钮单击事件的四种常用写法总结