techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

AndroidStudioのProjectテンプレートを弄る

Motivation

最近のAndroidアプリ開発だとライブラリを使うことが前提であることが多い。 毎回毎回プロジェクト立ち上げ後にライブラリを取り込んでいくのが非常に面倒なので、 テンプレートを弄ってみた。

プロジェクトのbuild.gradleファイルの場所

OSXだと/Applications/Android Studio.app/Contents/plugins/android/lib/templates/gradle-projects/NewAndroidProject/root/build.gradle.ftl/Applications/Android Studio.app/Contents/plugins/android/lib/templates/gradle-projects/NewAndroidModule/root/build.gradle.ftlがそれに当たる。
Ubuntu等の環境であれば、ダウンロードしてきたAndroidStudioのディレクトリ以下で上記パスのplugin以降の所に居ると思われる。 Projectの方がプロジェクトルートのbuild.gradle、Moduleの方がapp/build.gradleのテンプレートファイルに当たる。

テンプレートファイルはFreeMaker Template Engine形式で書かれている。

freemarker.org

今回は特に凝ったことをするつもりは無いので、上記の知識は必要ない。

ファイルを差し替える

ファイル自体を差し替えるのは癪なので、シンボリックリンクで差し替えを行った。 リンク先のファイルをhomeディレクトリ以下にすると、AndroidStudioがテンプレートファイルを探せなかった。
恐らくEI CapitanのSIPが影響しているのだと思う。(深追いはしていない)

rcmdnk.github.io

上記問題があったので、プロジェクトディレクトリ下にカスタマイズしたファイルを作成した。

cd /Applications/Android\ Studio.app/Contents/plugins/android/lib/templates/gradle-projects
mv NewAndroidProject/root/build.gradle.ftl NewAndroidProject/root/build.gradle.ftl.org
cp NewAndroidProject/root/build.gradle.ftl.org NewAndroidProject/root/my.build.gradle.ftl
ln -s NewAndroidProject/root/my.build.gradle.ftl NewAndroidProject/root/build.gradle.ftl

mv NewAndroidModule/root/build.gradle.ftl NewAndroidModule/root/build.gradle.ftl.org
cp NewAndroidModule/root/build.gradle.ftl.org NewAndroidModule/root/my.build.gradle.ftl
ln -s NewAndroidModule/root/my.build.gradle.ftl NewAndroidModule/root/build.gradle.ftl

my.build.gradle.ftlに必要なモジュールを組み込む

今回は、retrolambdaとhugoを入れ込むことにした。

github.com

github.com

それぞれのライブラリをプロジェクトに組み込むときと同様にテンプレートファイルにも編集を加える。

diff --git a/NewAndroidProject/root/build.gradle.ftl.org b/NewAndroidProject/root/my.build.gradle
index e60d8c0..5cd3101 100644
--- a/NewAndroidProject/root/build.gradle.ftl.org
+++ b/NewAndroidProject/root/my.build.gradle
@@ -11,6 +11,8 @@ buildscript {
     }
     dependencies {
         classpath 'com.android.tools.build:gradle:${gradlePluginVersion}'
+        classpath 'me.tatarka:gradle-retrolambda:3.2.5'
+        classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
diff --git a/NewAndroidModule/root/build.gradle.ftl.org b/NewAndroidModule/root/my.build.gradle
index e59f426..3c1c6a3 100644
--- a/NewAndroidModule/root/build.gradle.ftl.org
+++ b/NewAndroidModule/root/my.build.gradle
@@ -17,6 +17,8 @@ buildscript {
 apply plugin: 'com.android.library'
 <#else>
 apply plugin: 'com.android.application'
+apply plugin: 'me.tatarka.retrolambda'
+apply plugin: 'com.jakewharton.hugo'
 </#if>
 <#if !(perModuleRepositories??) || perModuleRepositories>
 
@@ -34,6 +36,11 @@ android {
     compileSdkVersion <#if buildApiString?matches("^\\d+$")>${buildApiString}<#else>'${buildApiString}'</#if>
     buildToolsVersion "${buildToolsVersion}"
 
+    compileOptions {
+      sourceCompatibility JavaVersion.VERSION_1_8
+      targetCompatibility JavaVersion.VERSION_1_8
+    }
+
     defaultConfig {
     <#if isLibraryProject?? && isLibraryProject>
     <#else>

New Projectを試してみる

上記反映を行った上で、Android StudioからNew Projectを試してみる。 特に手を入れなくても、以下の様なコードが通るようになる。Happy :)

package com.kobashin.sample.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;

import hugo.weaving.DebugLog;

public class MainActivity extends AppCompatActivity {

    @DebugLog
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt = new Button(this);
        bt.setOnClickListener(v -> {

        });
    }
}