# NewClassHelperPlugin **Repository Path**: kotle/new-class-helper-plugin ## Basic Information - **Project Name**: NewClassHelperPlugin - **Description**: No description available - **Primary Language**: Kotlin - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-22 - **Last Updated**: 2024-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TinMVVM ## AndroidStudio 4.X+ 编写自定义模板 > 写在前面 此文仅为记录AndroidStudio fox 编写自定义模板,网上关于此类文章少之又少,踩了不少坑,遂写文记录希望能帮到有需要的人。 #### 原创文章 禁止未授权转载 * AndroidStudio 自定义模板主要区分在AS 4.0版本 * AndroidStudio 4.0版本之前,编写自定义模板 使用`Freemarket`进行编写,并存放在 AS 的plugin - template 文件夹下即可。可参考 鸿洋 文章 [AndroidStudio自定义模板](https://mp.weixin.qq.com/s/doXNWf_TAB-ZlaHVkrUgzQ) 进行学习。 * AndroidStudio 4.0版本之后,AS 没有了 plugin 文件夹,但提供了新的方式:使用`Kotlin` 编写 template,以`jar`包形式使用。 * 此文编写模板是依附于 自己项目 [QuickAndroid](https://github.com/JiaYang627/QuickAndroid) 进行编写,开发工具:AndroidStudio Fox 2020.3.1 Patch 3 Build ### 开始 --- #### Use this template 我们需要在官方的template模板上进行编写,官方模板地址为:[intellij-platform-plugin-template](https://github.com/JetBrains/intellij-platform-plugin-template),打开模板仓库后,点击`Use this template` 会提示你 `Create a new repository from intellij-platform-plugin-template` 类似`fork`,创建好仓库后,git clone 到本地,并使用AS 打开 #### 添加依赖 * 添加wizard-template.jar * 项目根目录下创建`lib`文件夹 * 添加AndroidStudio目录下的`wizard-template.jar`,具体路径为:`/Applications/Android Studio.app/Contents/plugins/android/lib/` * 打开项目`build.gradle.kts`文件,添加代码如下: ``` dependencies { compileOnly(files("lib/wizard-template.jar")) } ``` * 添加plugins * 打开项目`build.gradle.kts`文件,在`plugins`下添加`detekt` 和 `ktlint`插件 * 添加`detekt`依赖代码如下: ``` plugins { ... // detekt linter - read more: https://detekt.github.io/detekt/gradle.html id("io.gitlab.arturbosch.detekt") version "1.16.0" // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle id("org.jlleitschuh.gradle.ktlint") version "10.0.0" } dependencies { detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.18.1") } ``` * 添加过依赖后`build.gradle.kts` 下`plugins` 和`dependencies`代码: ``` plugins { // Java support id("java") // Kotlin support id("org.jetbrains.kotlin.jvm") version "1.6.0" // Gradle Changelog Plugin id("org.jetbrains.changelog") version "1.3.1" // Gradle Qodana Plugin id("org.jetbrains.qodana") version "0.1.13" // Gradle IntelliJ Plugin id("org.jetbrains.intellij") version "1.3.0" // detekt linter - read more: https://detekt.github.io/detekt/gradle.html id("io.gitlab.arturbosch.detekt") version "1.16.0" // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle id("org.jlleitschuh.gradle.ktlint") version "10.0.0" } dependencies { detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.18.1") compileOnly(files("lib/wizard-template.jar")) } ``` #### 修改gradle.properties * 修改`gradle.properties`文件下相关配置 具体意义查看[Gradle properties](https://github.com/JetBrains/intellij-platform-plugin-template#gradle-properties) * pluginGroup * pluginName * pluginVersion : 编译后生成jar版本号就是这里控制的 * pluginSinceBuild * pluginUntilBuild * pluginVerifierIdeVersions * platformType * platformVersion * platformPlugins * 此处需注意的是 `pluginSinceBuild` `pluginUntilBuild` `pluginVerifierIdeVersions` * pluginSinceBuild:表示插件适配的最低版本 * pluginUntilBuild:表示插件适配的最高版本 * pluginVerifierIdeVersions: 4.X版本AS 使用模板会有此字段,Fox版本没有,文档也没有显示,个人还是添加上了 * 关于最低 最高版本 就是AS 版本信息中build 信息,本人使用的是AndroidStudio Fox 2020.3.1 Patch 3 Build,build 信息为203.xxxx ![AndroidStudioVersion](http://m.qpic.cn/psc?/V14YlNrL2eQEkW/TmEUgtj9EK6.7V8ajmQrEHaEg.pjcWCXX0nr96pir5CoKyWqO*je8zs0FBWZKkLBFoA8M4zCRITvyWkrylH90Fi0sN*Zd5VFCuhAtJhwsOs!/b&bo=AAUgAwAAAAADFxQ!&rf=viewer_4) * `gradle.properties`文件内容如下: ``` # IntelliJ Platform Artifacts Repositories # -> https://plugins.jetbrains.com/docs/intellij/intellij-artifacts.html pluginGroup = me.jiayang pluginName = tin-mvvm # SemVer format -> https://semver.org pluginVersion = 1.0.72 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html # for insight into build numbers and IntelliJ Platform versions. pluginSinceBuild = 201 pluginUntilBuild = 213.* pluginVerifierIdeVersions = 2020.2.4, 2020.3.4, 2021.1 # IntelliJ Platform Properties -> https://github.com/JetBrains/gradle-intellij-plugin#intellij-platform-properties platformType = IC platformVersion = 2020.2.4 # Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html # Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22 platformPlugins = java, com.intellij.java, org.jetbrains.android, android, org.jetbrains.kotlin # Java language level used to compile sources and to generate the files for - Java 11 is required since 2020.3 javaVersion = 11 # Gradle Releases -> https://github.com/gradle/gradle/releases gradleVersion = 7.3 # Opt-out flag for bundling Kotlin standard library. # See https://plugins.jetbrains.com/docs/intellij/kotlin.html#kotlin-standard-library for details. # suppress inspection "UnusedProperty" kotlin.stdlib.default.dependency = false ``` #### 修改包名以及创建Template生成类 * 修改项目包名 * AS 打开项目后,可以看到src - kotlin - 包名 - listeners services ... * 修改包名,个人修改结果如下 * 具体为src - kotlin - 包名 me.jiayang - 两个文件夹,一个存放 项目原本文件 template,一个存放自定义模板代码 tinmvvm ![Project-Package](http://m.qpic.cn/psc?/V14YlNrL2eQEkW/TmEUgtj9EK6.7V8ajmQrEC.gd5GSUb4UHX1jtSigXuJF.G06JTbj4EEds6nMvmbgca8GtR3k*qKGzX.hNq1iE7rwRxNdFKQGYfsRiVZ0d7g!/b&bo=BgPIAwAAAAADF*w!&rf=viewer_4&t=5) * 修改MyProjectManagerListener ``` internal class MyProjectManagerListener : ProjectManagerListener { override fun projectOpened(project: Project) { projectInstance = project project.getService(MyProjectService::class.java) } override fun projectClosing(project: Project) { projectInstance = null super.projectClosing(project) } companion object { var projectInstance: Project? = null } } ``` * 创建Template入口生成类 SamplePluginTemplateProviderImpl * tinmvvm文件夹下创建 `SamplePluginTemplateProviderImpl`类 * `WizardTemplateProvider`的是 lib 下 `wizard-template.jar`的抽象类 * `mvvmActivityTemplate`为具体生成Template对象 ``` class SamplePluginTemplateProviderImpl: WizardTemplateProvider() { override fun getTemplates(): List