AndroidStudio Fox 编写自定义模板

写在前面 此文仅为记录AndroidStudio fox 编写自定义模板,网上关于此类文章少之又少,踩了不少坑,遂写文记录希望能帮到有需要的人。

原创文章 禁止未授权转载

  • AndroidStudio 自定义模板主要区分在AS 4.0版本
    • AndroidStudio 4.0版本之前,编写自定义模板 使用Freemarket进行编写,并存放在 AS 的plugin - template 文件夹下即可。可参考 鸿洋 文章 AndroidStudio自定义模板 进行学习。
    • AndroidStudio 4.0版本之后,AS 没有了 plugin 文件夹,但提供了新的方式:使用Kotlin 编写 template,以jar包形式使用。
  • 此文编写模板是依附于 自己项目 QuickAndroid 进行编写,开发工具:AndroidStudio Fox 2020.3.1 Patch 3 Build
  • 此文对应代码为 TinMVVM,可以网页查看具体代码 以及结构以方便对此文的理解。

开始


Use this template

我们需要在官方的template模板上进行编写,官方模板地址为: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下添加detektktlint插件
    • 添加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.ktspluginsdependencies代码:
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
    • 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
  • 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.png
  • 修改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