Android Studio Module&页面 自定义模板

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

内容简介:最近项目在搞组件化,基本改造已完成(解耦什么的真的是体力活呀!因为项目比较庞大,所以老代码决定还是放着不动,有时间有人力再搞,新的大功能以组件化的方式开发),但是创建新的组件模块要拷贝很多相似的配置和代码,鉴于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&页面 自定义模板》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

技术的本质

技术的本质

布莱恩•阿瑟(Brian Arthur) / 曹东溟、王健 / 浙江人民出版社 / 2014-4-1 / 62.90

★《技术的本质》是复杂性科学奠基人、首屈一指的技术思想家、“熊彼特奖”得主布莱恩•阿瑟所创建的一套关于技术产生和进化的系统性理论,本书是打开“技术黑箱”的钥匙,它用平实的语言将技术最本质的思想娓娓道来。 ★技术,是一个异常美丽的主题,它不动声色地创造了我们的财富,成就了经济的繁荣,改变了我们存在的方式。尽管技术如此重要,却少有人在快节奏的生活中停下来深入思考技术。我们了解技术的原理,却不知道......一起来看看 《技术的本质》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具