Skip to content

granoeste/AndroidProjectTemplate

 
 

Repository files navigation

Android Project Template

はじめに

Androidプロジェクトで頻繁に使用されるプラグインの導入ソースプログラムをプロジェクト作成の都度書き直すのは非効率的である.
そういった繰り返し書かれるプログラムをこのプロジェクトにまとめ, 新規プロジェクト作成の際にはこれをコピーすることで対応できるようにする.

導入されるプラグイン

主要な静的解析ツールと各種ユーティリティが導入される.
プラグインの導入ソースコード(gralde)は/android.gradleで定義されている.
これに含まれるプラグインは次の通り.

FindBugs
: Javaプログラム(バイトコード)の静的解析ツール.

PMD
: Javaプログラム(ソースコード)の静的解析ツール.

CheckStyle
: プログラムの体裁チェックツール.

Lint
: Androidに特化した潜在的な不具合を検出する静的解析ツール.

Jacoco
: Javaプログラムのカバレッジレポート.

DexCount
: APKが持つメソッド数を報告するプラグイン.

ApkSize
: APKのバイナリサイズを報告するプラグイン.

GradleVersion
: 依存しているライブラリの最新バージョンをチェックするプラグイン.

AWS Device Farm
: AWS Device FarmにAPKをアップロードしてテスト実行するプラグイン.

開発用ライブラリ

  • RxAndroid
  • RxJava
  • Dagger2
  • ButterKnife
  • Orma
  • Timber
  • Stetho
  • Okhttp
  • Robolectric
  • JUnit
  • Mockito
  • Hamcrest
  • Android support Appcompat-v7
  • Android support annotations
  • Android design support lib.
  • Android support testing lib.

android.gradleの適用

android.gradleをアプリケーションに適用するには2ステップ必要.
まずプロジェクトルートで下記を宣言する.

buildscript {
    dependencies {
        ...

        // dex method count
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.4.1'

        // apk size
        classpath 'com.vanniktech:gradle-android-apk-size-plugin:0.2.0'

        // check for plugin updates
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.11.3'

        // Generic logger
        classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'

        // RxJava observable logger
        classpath "com.fernandocejas.frodo:frodo-plugin:0.8.2"
        
        // AWS Device Farm
        classpath 'com.amazonaws:aws-devicefarm-gradle-plugin:1.2'
    }
}

次に, 各モジュールのbuild.gradleandroid.gradleプラグインを読み込む.

apply from: rootProject.file('android.gradle')

追加・変更されるタスク

findbugs{variantName}
: FindBugsによる静的解析を指定のビルドバリアントに対して実行する

pmd{variantName}
: PMDによる静的解析を指定のビルドバリアントに対して実行する

checkstyle{variantName}
: CheckStyleによる体裁チェックを指定のビルドバリアントに対して実行する

lint{variantName}
: Lintによる静的解析を指定のビルドバリアントに対して実行する

jacoco{variantName}Report
: Jacocoによるカバレッジレポートを指定のビルドバリアントに対して実行する

count{variantName}Methods
: DexCountによるメソッド数の計測を指定のビルドバリアントに対して実行する

size{variantName}
: ApkSizeによるAPKサイズの計測を指定のビルドバリアントに対して実行する

dependencyUpdates
: 依存しているライブラリの最新バージョンチェックを実行する

check
: デバッガブルなビルドタイプの場合, いくつかの静的解析チェックを追加で行う

pullCodeStyleSettings
: AndroidStudioに適用されるコードスタイル設定ファイルをダウンロードする

checkEnvironmentSettings
: 開発環境の設定確認用タスク

devicefarmUpload
: AWS Device FarmにAPKをアップロードしてテスト実行する

installGitSecret
: git secret --installを実行する. 実行するにはgit-secretが必要.

scanSecretWord
: git secrets --scanを使ったscanを実行する. 実行するにはgit-secretが必要.

コンフィギュレーション

CheckStyle

各静的解析ツールはデフォルトで/configに格納されたコンフィギュレーションファイルを読み込む.
CheckStyleのコンフィギュレーションファイルは2種類用意されている.

checkstyle-easy.xmlは緩い体裁チェックルール. checkstyle-hard.xmlは厳しい体裁チェックルールとなっている. プロジェクトのコーディング規約にあったファイルをandroid.gradleで指定する.

/*
 * CheckStyle
 *   see: https://docs.gradle.org/current/dsl/org.gradle.api.plugins.quality.Checkstyle.html
 */
task("checkstyle$variantName", type: Checkstyle,
        dependsOn: "assemble$variantName") {
...
    configFile = rootProject.file('config/checkstyle-easy.xml')
...
}

Release署名

APKのDebug/Release署名設定もandroid.gradleで定義されている.
Release署名で使用されるキーストア情報は/secretに格納されているrelease.gradleにある(secretフォルダについては後述).
android.gradle/secret/release.gradleを参照し, これを適用する.
もしrelease.gradleが見つからない場合はDebug署名の内容がRelease署名として流用される.

def releaseSettingGradleFile = rootProject.file('secret/release.gradle')
if (releaseSettingGradleFile.exists()) {
    apply from: releaseSettingGradleFile, to: android
} else {
    println "\n\t!! NOT FOUND RELEASE KEYSTORE SETTING. SIGNING DEBUG KEYSTORE !!\n"
    release {
        storeFile = debug.storeFile
        storePassword = debug.storePassword
        keyAlias = debug.keyAlias
        keyPassword = debug.keyPassword
    }
}

Debug署名はIDE標準で用意されるdebug.keystoreをプロジェクトルートに配置することで利用できる.

AWS Device Farm

AWS Device Farmに対応する場合はpluginフォルダにawsdevicefarm.gradleのファイル名で設定を格納すればよい.
android.graldeはこのファイルが存在する場合はAWS Device Farm用のタスクを生成する.
AWS Device Farmなどで使用されるIAMユーザのaccess/secretKey情報は/secret/aws_authentication.gradle を参照し, これを適用する.

authentication {
    // FIXME: 正しいキー情報に変更すること
    accessKey "aws-iam-user-accesskey"
    secretKey "aws-iam-user-secretkey"
}

AWS Device Farmの詳細はawsdevicefarm.gradleのヘッダコメントを参照.

コードスタイル設定

AndroidStudioで使用するコードスタイル設定が/.idea/codeStyleSettings.xmlに定義されている.
android.gradlepullCodeStyleSettingsタスクを実行することで下記のシェルスクリプトが実行され, AndroidStudioのコードスタイル設定が更新される.

curl -L "https://raw.githubusercontent.com/YukiMatsumura/AndroidProjectTemplate/master/.idea/codeStyleSettings.xml" > .idea/codeStyleSettings.xml

コードスタイルを適用するにはIDEを再起動すること.

git-secret

git-secretsを使ったコマンドが追加されている.

installGitSecretはルートディレクトリパスに対してgit-secretを適用する.
scanSecretWordはgit管理対象ファイルに秘匿情報が含まれていないかを検査する.
CIサーバでscanSecretWordを実行する場合, 秘匿情報として扱うワードを個別に設定すること.
(そのワードを公開してしまわないように注意!)

git-secretの使用を開始するには下記の準備が必要.

  1. git-secretをインストール済みであること
  2. /script/gitSecretsScan.shを配置済みであること
  3. /plugin/git_secret.gradleを配置済みであること

Checkタスク

FindBugs, PMD, CheckStyle, Jacocoはビルドバリアント毎に定義されたタスクを持つ.
例) findbugsDevDebug
android.gradleではDebuggableなビルドタイプに限定してこれらのタスクをCheckタスクに依存させている.
(ビルドタイプの限定を解除する場合はCIサービスでメモリ使用量が増えるため事前に確認が必要)

if (variant.buildType.debuggable) {
    check.dependsOn "pmd${variantName}"
    check.dependsOn "findbugs${variantName}"
    check.dependsOn "checkstyle${variantName}"
    check.dependsOn "jacoco${variantName}Report"
}

その他

android.gradleで定義されるcheckEnvironmentSettingsタスクはプロジェクトに必要な環境をチェックするためのタスク.
標準でJDKのバージョンチェックを実施する.

task checkEnvironmentSettings() {
    group 'Verification'
    description "Check environment settings"

    // Ormaはaptによるコード生成にJava1.8を要求する
    if (JavaVersion.current() < JavaVersion.VERSION_1_8) {
        println("\n\tYou will need Java 1.8 or higher if you use Orma.")
        println("\tCurrent Java version is really old. Found ver. " + JavaVersion.current() + ".\n")
        throw new GradleException("Please Update your Java.")
    }
}

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.4%
  • Shell 0.6%