起因
最近项目在搞组件化,基本改造已完成(解耦什么的真的是体力活呀!因为项目比较庞大,所以老代码决定还是放着不动,有时间有人力再搞,新的大功能以组件化的方式开发),但是创建新的组件模块要拷贝很多相似的配置和代码,鉴于IDEA强大的模板功能,决定把这块给自动化了。
符合我们要求的自定义模板分两类:
1. Module 模板
位于<AS安装目录>/plugins/android/lib/templates/gradle-project
下,创建Application或者Module,类型只有固定的几类,category
为Application
,formfactor
为:
- Mobile : 移动端应用
- Wear : 可穿戴设备的应用
- Car : 车载应用
- TV : 电视应用
- Things : 物联网应用
一开始,自定义模板的时候使用的Mobile
,不生效,发现Mobile
只认一个;按照JavaLibrary的写法,去掉formfactor
,发现也只认一个;后来改成Things
才可以。
Module模板在创建的时候,无法像页面模板那样,在Create Dialog中添加自定义参数,让用户选填,这个有点坑。
2. 页面模板
位于templates/activities
下,在module中创建特定的文件或目录,这种模板可以在Create Dialog中添加自定义的参数。
目录结构
templateName
├--- template.xml 模板入口配置文件
├--- globals.xml 可供模板使用的全局预设变量
├--- recipe.xml 操作清单
└--- <其他文件/目录> 模板源文件
1. template.xml
这是当前模板的入口配置文件。下面稍微介绍下一些重要的tag和字段。
<template>
tag:
format
模板格式版本号,和templates目录中其他模板一样就好,当前是5,如果大于android plugin定义的CURRENT_FORMAT,该模板将会被跳过。revision
模板版本号,如果有重名的模板(模板文件不仅可以放在<AS安装目录>/plugins/android/lib/templates
下,还可以放在<用户主目录>/.android/templates
目录下),取版本号最高的那个,如果相等,取修改时间最新的那个name
、description
属性标明了该模板显示的名称和描述。
<category>
tag的value
属性,标明该模板对应的分类:
Application
:创建project或者module
这种模板一般放在templates/gradle-project下
通过File -> New -> New Project… / New Module… 进行创建Activity
:创建Activity的
这种模板一般放在templates/activities下
通过右击module -> New -> Activity 进行创建Xml
、Fragment
、Service
、Folder
、Other
等:创建其他文件的模板
这种模板一般放在templates/other下
通过右击module -> New -> 选择对应的分类进行创建
<formfactor>
tag的value
属性,标明模板的二级分类,参见一、/ 1.
<thumbs>
& <thumb>
指定该模板的图标,图标文件一般和template.xml同级
<parameter>
tag标明当前模板自定义的参数
如果是project & module类的模板(category
为Application
),这些参数都是定死的,创建模板的界面也是定死的,我们无法自定义添加。但是其他的category类型(包括自定义category),这些参数都会在UI上展现,可以让用户输入。tag中的属性简介:
id
:模板中引用时用到的参数名name
:参数显示的名称type
:参数类型,boolean、string等default
:参数的默认值
<globals>
tag的file
属性,指定了全局配置文件(一般为globals.xml.ftl),模板文件中可用的全局参数都可以写到这个文件中。
<execute>
tag的file
属性,指定了模板的创建清单(一般为recipe.xml.ftl),这个文件中注明了生成哪些文件、目录,以及怎么生成。
2. globals.xml.ftl
该文件定义了模板中可用的全局参数,系统预定义的参数可以参看这个链接。<global>
tag定义了一个全局参数:
id
:模板中引用时用到的参数名type
: 数据类型(可选)value
:参数值
这里可以通过${name}的方式,引用系统预定义的参数,而且,系统还预定义一些方法可供使用,具体参见这个链接
3. recipe.xml.ftl
这个文件中通过tag操作符的方式指明了需要生成哪些文件,以及怎么生成,可用的tag如下:
以下是gradle相关的tag:
这个文件中也可以使用系统预定义的参数、方法以及globals.xml.ftl中定义的参数、FreeMarker的语法。
举个🌰
gradle-project/DemoTemplate
├--- template.xml
├--- globals.xml
├--- recipe.xml
├--- mobile-module.png //tempalte的缩略图,从别的template里拷贝一个就好
└--- root
├--- AndroidManifest.xml.ftl
├--- build.properties.ftl
├--- settings.gradle.ftl
└--- res
└--- values
└--- strings.xml.ftl
template.xml
|
|
globals.xml.ftl
|
|
recipe.xml.ftl
|
|
root/AndroidManifest.xml.ftl
|
|
root/build.gradle.ftl
|
|
root/settings.gradle.ftl
|
|
root/res/values/string.xml.ftl
|
|
设置好以后,重启Studio,然后 File -> New —> New Module..
应该就能弹出创建的对话框了