Android Best Practiceを簡単に使う方法

android, android studio, work

android-studio

最近githubで☆を集めているandroid-best-practiceがあります。その名の通りandroidのベストプラクティスをまとめた文書なのですが、まだまだandroid初心者な僕にとっては非常に参考になります。
ただ、参考になるのはいいのですが、僕の頭ではいちいち覚えていられないという悲しい現状に直面しています。
いい加減何度も見なおすのは面倒なので、(全てではありませんが)簡単にandroid-best-practiceに沿う方法を作りました。
僕は開発にAndroid Studioを使用しているので、Android Studioで対応します。

Android Studioのテンプレート改造

Android Studioの仕組みとしてテンプレートというものがあります。
何か物を作るときのベースとなるものを切り出しているわけですね。
この仕組を利用してandroid-best-practiceに沿ったプロジェクトを作れないかと考えました。
置き場所はMacだと/Applications/Android Studio.app/Contents/plugins/android/lib/templates/あたりです。

テンプレート概要

テンプレートの中で一番直感的なのはactivities以下です。

1
2
3
4
5
6
7
8
9
10
11
12
13
AndroidTVActivity/
BlankActivity/
BlankActivityWithFragment/
BlankWearActivity/
EmptyActivity/
FullscreenActivity/
GoogleMapsActivity/
GooglePlayServicesActivity/
LoginActivity/
MasterDetailFlow/
NavigationDrawerActivity/
SettingsActivity/
TabbedActivity/

Android Studioを使用している方々にとっては見慣れているものが並んでいるのではないでしょうか?
そう、Activityのウィザードで選べるものがここで定義されているわけですね。

これらの中身はここでは詳しく触れませんが、ここここが参考になるかもしれません。
中身を見ていくと、プロジェクトやモジュールに設定される内容がここには無いことに気づきます。
このディレクトに指定されているテンプレートの役割はあくまで「Activityを作った時に必要となる内容」であって、「プロジェクトやモジュールを作った時に必要となる内容」では無いようです。

プロジェクトやモジュールを作った時に参照されるのはgradle-projects以下です。

1
2
3
4
5
6
7
AndroidWearModule/
ImportExistingProject/
NewAndroidModule/
NewAndroidProject/
NewAndroidTVModule/
NewGlassModule/
NewJavaLibrary/

いかにもそれっぽいテンプレートが並んでいますね。
特にNewAndroidMoudleNewAndroidProjectが気になります。

NewAndroidProjectはプロジェクト作製時、つまりgradleのトップディレクトリ直下のファイルに対するテンプレートのようです。
android-best-practiceの内容はそれぞれのモジュールに対して行うものが主なので、NewAndroidProjectは今回は対象ではありません。

ではNewAndroidModuleはどうでしょうか。 NewAndroidProject/root/build.gradle.ftlあたりを見ると、テンプレートのsyntaxで見づらいですが、見慣れた記述が見えるはずです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<#if !(perModuleRepositories??) || perModuleRepositories>
buildscript {
    repositories {
        jcenter()
<#if mavenUrl != "mavenCentral">
        maven {
            url '${mavenUrl}'
        }
</#if>
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:${gradlePluginVersion}'
    }
}
</#if>
<#if isLibraryProject?? && isLibraryProject>
apply plugin: 'com.android.library'
<#else>
apply plugin: 'com.android.application'
</#if>
<#if !(perModuleRepositories??) || perModuleRepositories>

repositories {
        jcenter()
<#if mavenUrl != "mavenCentral">
        maven {
            url '${mavenUrl}'
        }
</#if>
}
</#if>

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

    defaultConfig {
    <#if isLibraryProject?? && isLibraryProject>
    <#else>
    applicationId "${packageName}"
    </#if>
        minSdkVersion <#if minApi?matches("^\\d+$")>${minApi}<#else>'${minApi}'</#if>
        targetSdkVersion <#if targetApiString?matches("^\\d+$")>${targetApiString}<#else>'${targetApiString}'</#if>
        versionCode 1
        versionName "1.0"
    }
<#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 enableProGuard>
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
</#if>
}

dependencies {
    <#if dependencyList?? >
    <#list dependencyList as dependency>
    compile '${dependency}'
    </#list>
    </#if>
    compile fileTree(dir: 'libs', include: ['*.jar'])
<#if WearprojectName?has_content && NumberOfEnabledFormFactors?has_content && NumberOfEnabledFormFactors gt 1>
    wearApp project(':${WearprojectName}')
    compile 'com.google.android.gms:play-services:+'
</#if>
}

どうやらモジュール生成に対する挙動をカスタマイズしたければ、ここらあたりを弄ればいけそうですね。

改造

android-best-practiceの中で、自動化できそうなところから拾っていきます
具体的な内容は気が向いたら解説しようと思います。

Gradle Configuration

デフォルトのroot/build.gradle.ftlに記述を加え、パスワードのサンプルを書いたroot/gradle.propertiesを作成し、recipe.xml.ftl`で挙動を設定する

Libraries

recipe.xml.ftlにdependencyを追加。
バージョンは今後変化することも考えglobals.xml.ftlに切り出し。

Java Package Architecture

recipe.xml.ftlにパッケージのディレクトリを作るmkdirを追加。

Test frameworks

recipe.xml.ftlのdependencyではbuild.gradleのandroidTestCompileは追加できないため、直接root/build.gradle.ftlに記述。

今回は以上です。

実行結果

result

狙いどおりパッケージの中にandroid-best-practiceに沿ったディレクトリ構造(Java Package Architecture)、build.gradleの中にsigningConfigs(Gradle Configuration)とcompile(Libraries)、androidTestCompile(Test frameworks)が追加されていますね!

android-best-practiceにはまだリソース管理の考え方等色々ありますが、これだけでも環境統一という意味で開発環境の改善に繋げられるのではないでしょうか。

成果物

tmiyamon/android-studio-template

Comments