Android Studio Module&页面 自定义模板

栏目: 编程工具 · Android · 发布时间: 4年前

内容简介:最近项目在搞组件化,基本改造已完成(解耦什么的真的是体力活呀!因为项目比较庞大,所以老代码决定还是放着不动,有时间有人力再搞,新的大功能以组件化的方式开发),但是创建新的组件模块要拷贝很多相似的配置和代码,鉴于IDEA强大的模板功能,决定把这块给自动化了。位于一开始,自定义模板的时候使用的

最近项目在搞组件化,基本改造已完成(解耦什么的真的是体力活呀!因为项目比较庞大,所以老代码决定还是放着不动,有时间有人力再搞,新的大功能以组件化的方式开发),但是创建新的组件模块要拷贝很多相似的配置和代码,鉴于IDEA强大的模板功能,决定把这块给自动化了。

符合我们要求的自定义模板分两类:

1. Module 模板

位于 <AS安装目录>/plugins/android/lib/templates/gradle-project 下,创建Application或者Module,类型只有固定的几类, categoryApplicationformfactor 为:

  • 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 目录下),取版本号最高的那个,如果相等,取修改时间最新的那个
  • namedescription 属性标明了该模板显示的名称和描述。

<category> tag的 value 属性,标明该模板对应的分类:

  • Application :创建project或者module
    这种模板一般放在templates/gradle-project下
    通过File -> New -> New Project… / New Module… 进行创建
  • Activity :创建Activity的
    这种模板一般放在templates/activities下
    通过右击module -> New -> Activity 进行创建
  • XmlFragmentServiceFolderOther 等:创建其他文件的模板
    这种模板一般放在templates/other下
    通过右击module -> New -> 选择对应的分类进行创建

<formfactor> tag的 value 属性,标明模板的二级分类,参见

<thumbs> & <thumb> 指定该模板的图标,图标文件一般和template.xml同级

<parameter> tag标明当前模板自定义的参数

如果是project & module类的模板( categoryApplication ),这些参数都是定死的,创建模板的界面也是定死的,我们无法自定义添加。但是其他的category类型(包括自定义category),这些参数都会在UI上展现,可以让用户输入。tag中的属性简介:

id
name
type
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如下:

<mkdirat="somewhere"/>
    创建 somewhere 目录

<instantiatefrom="A.ftl"to="...B"/>
    解析A.ftl模板并生成为工程中的...B文件

<copyfrom="A"to="…B"/>
    将A文件拷贝为工程中的…B文件,纯拷贝(不做模板解析)

<appendfrom="A"to="…B"/>
    将A文件追加到工程中的…B文件最后(不做模板解析)

<mergefrom="A.ftl"to="…B"/>
    解析A.ftl模板并合并到工程中的…B文件,只有xml和gradle文件才能用<merge>

<openfile="…B"/>
    在AS中打开工程中的…B文件

以下是gradle相关的tag:

<applyplugin="…"/>
    应用某个gradle插件

<classpathmavenUrl="…"/>
    添加某个mavenUrl到classpath

<dependencymavenUrl="…"/>
    添加某个依赖

这个文件中也可以使用系统预定义的 参数方法 以及globals.xml.ftl中定义的参数、FreeMarker的语法。

举个:chestnut:

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

<?xml version="1.0"?>
<template
    format="5"
    revision="2"
    name="Demo Module Template"
    description="Create a Demo Template Module.">

    <!-- Module 级别的模板 -->
    <categoryvalue="Application"/>

    <!-- 类别为 Things -->
    <formfactorvalue="Things"/>

    <!-- Create Dialog 上显示的预览图 -->
    <thumbs>
        <thumb>mobile-module.png</thumb>
    </thumbs>

    <!-- 以下都是一些默认参数 -->
    <parameter
        id="packageName"
        name="Package name"
        type="string"
        constraints="app_package|nonempty"
        default="com.your.myapp" />

    <parameter
        id="appTitle"
        name="Module Name"
        type="string"
        constraints="nonempty"
        default="module_" />

    <parameter
        id="minApi"
        name="Minimum API level"
        type="string"
        constraints="apilevel"
        default="8" />

    <!--
      Usually the same as minApi, but when minApi is a code name this will be the corresponding
      API level
    -->
    <parameter
        id="minApiLevel"
        name="Minimum API level"
        type="string"
        constraints="apilevel"
        default="8" />

    <parameter
        id="targetApi"
        name="Target API level"
        type="string"
        constraints="apilevel"
        default="19" />

    <!--
      Usually the same as targetApi, but when targeting a preview platform this is the code name instead
    -->
    <parameter
        id="targetApiString"
        name="Target API"
        type="string"
        constraints="apilevel"
        default="19" />

    <parameter
        id="buildApi"
        name="Build API level"
        type="string"
        constraints="apilevel"
        default="19" />

    <!--
      Usually the same as buildApi, but when targeting a preview platform this is the code name instead
    -->
    <parameter
        id="buildApiString"
        name="Build API level"
        type="string"
        constraints="apilevel"
        default="19" />

    <parameter
        id="makeIgnore"
        name="Create .gitignore file"
        type="boolean"
        default="true" />

    <globalsfile="globals.xml.ftl"/>
    <executefile="recipe.xml.ftl"/>

</template>

globals.xml.ftl

<?xml version="1.0"?>
<globals>
    <!-- 项目根目录 -->
    <globalid="topOut"value="."/>
    <!-- Module根目录 -->
    <globalid="projectOut"value="."/>
    <globalid="srcOut"value="${srcDir}/${slashedPackageName(packageName)}"/>
    <globalid="manifestOut"value="${manifestDir}"/>
    <globalid="resOut"value="${resDir}"/>
</globals>

recipe.xml.ftl

<?xml version="1.0"?>
<recipe>
    <!-- 在Module的根目录下,创建 libs 和 drawable 目录 -->
    <mkdirat="${escapeXmlAttribute(projectOut)}/libs"/>
    <mkdirat="${escapeXmlAttribute(resOut)}/drawable"/>

    <!-- 合并 settings.gradle -->
    <mergefrom="root/settings.gradle.ftl"
        to="${escapeXmlAttribute(topOut)}/settings.gradle" />

    <!-- 根据当前template的root/build.gradle.ftl,初始化Module的build.grale -->
    <instantiatefrom="root/build.gradle.ftl"
        to="${escapeXmlAttribute(projectOut)}/build.gradle" />

    <!-- 初始化AndroidManifest.xml -->
    <instantiatefrom="root/AndroidManifest.xml.ftl"
        to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
    <!-- 初始化strings.xml -->
    <instantiatefrom="root/res/values/strings.xml.ftl"
        to="${escapeXmlAttribute(resOut)}/values/strings.xml" />

<#if!createActivity>
    <mkdirat="${escapeXmlAttribute(srcOut)}"/>
</#if>


<#ifmakeIgnore>
    <copyfrom="root://gradle-projects/common/gitignore"
            to="${escapeXmlAttribute(projectOut)}/.gitignore" />
</#if>

    <#include"root://gradle-projects/common/proguard_recipe.xml.ftl"/>

</recipe>

root/AndroidManifest.xml.ftl

<manifestxmlns:android="http://schemas.android.com/apk/res/android"
    package="${packageName}" />

root/build.gradle.ftl

apply plugin: 'com.android.library'

android {
    compileSdkVersion <#if buildApiString?matches("^\\d+$")>${buildApiString}<#else>'${buildApiString}'</#if>
    <#if explicitBuildToolsVersion!false>buildToolsVersion "${buildToolsVersion}"</#if>

    defaultConfig {
        minSdkVersion <#if minApi?matches("^\\d+$")>${minApi}<#else>'${minApi}'</#if>
        targetSdkVersion <#if targetApiString?matches("^\\d+$")>${targetApiString}<#else>'${targetApiString}'</#if>
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
       release {
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
       }
    }
}

root/settings.gradle.ftl

include ':${projectName}'

root/res/values/string.xml.ftl

<resources>
    <stringname="app_name">${escapeXmlString(appTitle)}</string>
</resources>

设置好以后,重启Studio,然后 File -> New —> New Module.. 应该就能弹出创建的对话框了

参考


以上所述就是小编给大家介绍的《Android Studio Module&页面 自定义模板》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程卓越之道

编程卓越之道

Hyde R / 韩东海 / 电子工业出版社 / 2006-4-1 / 49.80

各位程序员一定希望自己编写的代码是能让老板赞赏、满意的代码;是能让客户乐意掏钱购买的代码;是能让使用者顺利使用的代码;是能让同行欣赏赞誉的代码;是能让自己引以为豪的卓越代码。本书作者为希望能编写出卓越代码的人提供了自己积累的关于卓越编程的真知灼见。它弥补了计算机科学和工程课程中被忽略的一个部分——底层细节,而这正是构建卓越代码的基石。具体内容包括:计算机数据表示法,二进制数学运算与位运算,内存组织......一起来看看 《编程卓越之道》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具