2022-01-20 Android studio新建项目模板

背景

在使用AS创建新项目时,创建的项目中会生成很多预定的代码,比如gradle、AndroidManifest.xml、.gitignore文件等。不同版本AS创建时生成的文件内容都不同,但是并不是所有的内容都是我们想要的,比如gradle版本,这个尤其明显。还有就是有些我们根据自己的编码习惯会加一些东西进去,每次新建一个项目都要加很多东西,是比较麻烦的,所以我们可以修改这些生成文件的模板,让每次新建项目时创建的文件内容是我们想要的。

以前笔者使用的是AS3.5,这段时间因为换了个电脑下载了AS2020.3(白狐)版。白狐版过后默认使用的是Java11,可是笔者一直使用的是Java8,并且不想因为AS换成Java11,经过一番折腾过后Java环境使用了主机中的Java8。但是在gradle文件中配置的gradle和gradle插件版本是7.0.4,这个gradle版本是很高的,笔者之前使用的是gradle5.4.1,插件版本是3.5.2。笔者也想尝试使用一下7.0.4,但是没那么简单,很多语法都不兼容。笔者也没有时间去研究gradle的变更。准备修改AS白狐中的文件模板,就是在AS白狐中使用原来的gradle不行吗?在准备修改模板文件时发现AS这个变更非常大。特意在这里记录下。

注意:笔者这里记录的是AS新建项目时生成文件的模板,不是在使用AS时创建一个activity或者一个fragment时新建activity中内容的模板。

AS3.5及以下

下图中可以看出笔者安装的是AS3.5.2,以及AS安装目录下的文件

2022-01-20_090637.png

进入AS安装目录/plugins/android/lib/templates/gradle-projects

2022-01-20_090955.png

这里面有AS中所有新建(项目、module等)内容的模板,笔者确定要修改的是项目目录下的gradle文件、app目录下的gradle文件,所以找到NewAndroidProject和NewAndroidModule文件夹。

2022-01-20_091314.png

NewAndroidProject是新建项目中的配置文件,进入这个文件夹下的root文件夹,有几个ftl文件,就是模板文件了,根据命名可以看出有gradle、ignore等文件。笔者在这里准备修改gradle和ignore的模板,其他的你可以根据自己项目需要或者编码习惯自己进行修改。在修改之前可以先拷贝一份,以免有错误时可以恢复。

2022-01-20_091712.png

这里贴一下ignore文件修改前后的对比,左边是默认内容,我们如果不做修改的话新建项目后的内容就是这样,但是通常情况下我们都会修改,这里直接修改模板文件,然后新建一个项目看看是否成功。

2022-01-20_091907.png

在上图中可以看出新建项目的模板修改已经成功,因此可以去修改更重要文件了。

在这里修改build.gradle文件

// Top-level build file where you can add configuration options common to all sub-projects/modules.
<#macro loadProperties>
<#if useOfflineRepo!false>
    Properties properties = new Properties()
    properties.load(project.rootProject.file("local.properties").newDataInputStream())
</#if>
</#macro>
<#macro useProperties>
<#if useOfflineRepo!false>
        properties.getProperty("offline.repo").split(",").each { repo ->
            maven { url repo }
        }
</#if>
</#macro>

buildscript {<#if includeKotlinSupport!false>
    ext.kotlin_version = '${kotlinVersion}'</#if>
    <@loadProperties/>
    repositories {
        <@useProperties/>
        google()
        jcenter()
        <#if includeKotlinEapRepo!false>maven { url '${kotlinEapRepoUrl}' }</#if>
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:${gradlePluginVersion}'
        <#if includeKotlinSupport!false>classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"</#if>
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

def releaseTime() {
    return new Date().format("yyyy-MM-dd",java.util.TimeZone.getTimeZone("UTC"))
}

allprojects {
    <@loadProperties/>
    repositories {
        <@useProperties/>
        google()
        jcenter()

        maven { 
            url 'https://jitpack.io' 
        }
        <#if includeKotlinEapRepo!false>maven { url '${kotlinEapRepoUrl}' }</#if>
    }

    ext {
        compileSdkVersion = 30
        buildToolsVersion = "30.0.3"
        minSdkVersion = 19
        targetSdkVersion = 30
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这个文件主要修改gradle插件版本、仓库地址、还有一些自定义的配置,笔者添加了编译SDK的一些版本信息。在app的gradle文件中可以引用。

app目录中的模板文件主要想修改gradle文件和AndroidManifest.xml文件,进入NewAndroidModule,这个文件夹是新建Android module的模板文件。

2022-01-20_095402.png

gradle文件中要修改的有编译版本信息引用项目目录下的配置,添加一下编译常用的配置,打包信息,常用依赖库的引用等。

<#import "./shared_macros.ftl" as shared>
<#import "root://activities/common/kotlin_macros.ftl" as kt>
<#if isInstantApp>
apply plugin: 'com.android.feature'
<#else>
  <#if isLibraryProject>
apply plugin: 'com.android.library'
  <#elseif isDynamicFeature>
apply plugin: 'com.android.dynamic-feature'
  <#else>
apply plugin: 'com.android.application'
  </#if>
</#if>
<@kt.addKotlinPlugins />

<@shared.androidConfig hasApplicationId=isApplicationProject applicationId=packageName isBaseFeature=isBaseFeature hasTests=true canHaveCpp=true canUseProguard=isApplicationProject||isBaseFeature||(isLibraryProject&&!isInstantApp)/>
dependencies {
    ${getConfigurationName("compile")} fileTree(dir: 'libs', include: ['*.jar'])
    <#if !improvedTestDeps>
    ${getConfigurationName("androidTestCompile")}('com.android.support.test.espresso:espresso-core:+', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    </#if>
    <@kt.addKotlinDependencies />
<#if isInstantApp||isDynamicFeature>
  <#if isBaseFeature>
    <#if monolithicModuleName?has_content>
    application project(':${monolithicModuleName}')
    <#else>
    // TODO: Add dependency to the main application.
    // application project(':app')
    </#if>
  <#else>
    implementation project(':${baseFeatureName}')
  </#if>
<#else>
  <@shared.watchProjectDependencies/>
  
    //自定义Android开发库
    api 'com.gitee.premeditate:VenusAndroid:V1.0.22'
</#if>
}

在这里可以看到能加的只有dependencies的内容,其他内容是引用androidConfig文件的,也就是说这里的模板配置包含另一个文件内容。

找到该目录下的shared_macros.ftl文件

<#import "root://gradle-projects/common/proguard_macros.ftl" as proguard>

<#-- Some common elements used in multiple files -->
<#macro watchProjectDependencies>
<#if WearprojectName?has_content && NumberOfEnabledFormFactors?has_content && NumberOfEnabledFormFactors gt 1 && Wearincluded>
    wearApp project(':${WearprojectName}')
    ${getConfigurationName("compile")} 'com.google.android.gms:play-services-wearable:+'
</#if>
</#macro>

<#macro generateManifest packageName hasApplicationBlock=false>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        <#if isDynamicInstantApp>
            xmlns:dist="http://schemas.android.com/apk/distribution"
        </#if>
        package="${packageName}"<#if !hasApplicationBlock>/</#if>><#if hasApplicationBlock>

        <#if isDynamicInstantApp>
        <dist:module
            dist:instant="true" />
        </#if>
    <application <#if minApiLevel gte 4 && buildApi gte 4>android:allowBackup="true"</#if>
        android:usesCleartextTraffic="true"
        android:label="@string/app_name"<#if copyIcons>
        android:icon="@mipmap/ic_launcher"<#if buildApi gte 25 && targetApi gte 25>
        android:roundIcon="@mipmap/ic_launcher_round"</#if><#elseif assetName??>
        android:icon="@drawable/${assetName}"</#if><#if buildApi gte 17>
        android:supportsRtl="true"</#if>
        android:theme="@style/AppTheme"/>
</manifest></#if>
</#macro>

<#macro androidConfig hasApplicationId=false applicationId='' hasTests=false canHaveCpp=false isBaseFeature=false canUseProguard=false>
android {
    compileSdkVersion parent.ext.compileSdkVersion
    <#if explicitBuildToolsVersion!false>buildToolsVersion parent.ext.buildToolsVersion</#if>

    <#if isBaseFeature>
    baseFeature true
    </#if>

    defaultConfig {
    <#if hasApplicationId>
        applicationId "${applicationId}"
    </#if>
        minSdkVersion parent.ext.minSdkVersion
        targetSdkVersion parent.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"

    <#if hasTests>
        testInstrumentationRunner "${getMaterialComponentName('android.support.test.runner.AndroidJUnitRunner', useAndroidX)}"
    </#if>
    <#if canUseProguard && (isLibraryProject!false)>
        consumerProguardFiles 'consumer-rules.pro'
    </#if>
    <#if canHaveCpp && (includeCppSupport!false)>

        externalNativeBuild {
            cmake {
                cppFlags "${cppFlags}"
            }
        }
    </#if>
        multiDexEnabled true
        
        //使用时可以打开这个注释
        /*
        javaCompileOptions {
            annotationProcessorOptions {
                includeCompileClasspath = true
            }
        }
        */
    }
<#if javaVersion?? && (javaVersion != "1.6" && buildApi lt 21 || javaVersion != "1.7")>

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_${javaVersion?replace('.','_','i')}
        targetCompatibility JavaVersion.VERSION_${javaVersion?replace('.','_','i')}
    }
</#if>
<#if canUseProguard>
<@proguard.proguardConfig />
</#if>

    //编写模板文件时,这些内容添加进去创建项目时就会出错,所以以注释的形式写在这里,创建项目后需要使用时可以打开注释
    /*
    compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }

    flavorDimensions 'build'

    productFlavors {
        huafeng {}
    }

    //APK文件名称:outputFileName = "Android开发库-美元符号{releaseTime()}-美元符号{variant.versionName}.apk"
    android.applicationVariants.all {
        android.applicationVariants.all {
            variant ->
                variant.outputs.all {
                    outputFileName = "请参照上面注释修改发布APK文件的名称,使用{美元符号}替换美元符号几个文字.apk"
                }
        }
    }
    */
<#if canHaveCpp && (includeCppSupport!false)>
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
</#if>
}
</#macro>

这个文件包含了Android编译模块的配置,可以添加一些关于编译的信息。同时AndroidManifest.xml文件中的一些节点也包含在这里,所以在这个文件中可以同时修改,笔者添加了android:usesCleartextTraffic="true"配置,这个配置是声明应用允许使用http协议,因为Android11过后应用程序默认使用https,所以需要加上这个配置,笔者觉得是必须的,所以直接添加在了模板文件里面。

注意:在这里配置一些关于编译的内容时,有的还是不能识别,如果加的内容不能识别,在新建项目时gradle文件的内容会不全,新建的项目有错误,这不是我们所想的。但是也不知道为啥有的东西不能加,所以笔者把有错误的地方用注释包起来,这样在生成时,这一部分就会像注释一样加进去,在新建项目这些内容生成后成了注释,我们可以打开这个注释就能使用了。

AS2020.3及以上

在AS白狐中安装目录下没有templates文件夹。修改模板的方式大变样,好像是模板文件被打包成了jar文件,笔者目前还没有研究出来怎么修改,后面有时间了再补充~!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容