AndroidStudio 新規プロジェクトテンプレートから考える .gitignore

標準的な Android アプリ開発環境である AndroidStudio デフォルトのテンプレートは王道。

そのタイミングでの標準的なテンプレートです。

 

■ AndroidStudio プロジェクトデフォルト

今現在、公開されているプロジェクトテンプレートから確認してみます。

Empty Activity を選択しました。

AndroidStudio 新規プロジェクトテンプレートから考える .gitignore

👉 benigumocom/EmptyActivity-2023-02-09: androidstudio default template hatena-bookmark

プロジェクトルートから .gitignore を探ります。



これからスタートするのがいいでしょう。

 

■ A collection of .gitignore templates - github/gitignore

A collection of .gitignore templates

This is GitHub’s collection of .gitignore file templates. We use this list to populate the .gitignore template choosers available in the GitHub.com interface when creating new repositories and files.

👉 github/gitignore: A collection of useful .gitignore templates hatena-bookmark

GitHub 公式のリポジトリから公開されています。

Android アプリ開発に必要そうなものを挙げていきます。


👉 gitignore/JetBrains.gitignore at main · github/gitignore hatena-bookmark


👉 gitignore/macOS.gitignore at main · github/gitignore hatena-bookmark


👉 gitignore/Android.gitignore at main · github/gitignore hatena-bookmark


👉 gitignore/Gradle.gitignore at main · github/gitignore hatena-bookmark

Kotlin.gitignore は、以下 Java.gitignore のエイリアス。

👉 gitignore/Java.gitignore at main · github/gitignore hatena-bookmark

 

■ gitignore.io - toptal/gitignore


👉 gitignore.io - Create Useful .gitignore Files For Your Project hatena-bookmark で利用されている .gitignore リソースは以下で公開されています。

👉 gitignore/templates at master · toptal/gitignore hatena-bookmark

基本的には、先に紹介した github/gitignore と同じものですが、こちら側のみで公開している .gitignore があります。

なので、それらを貼っておきます。


👉 AndroidStudio.gitignore hatena-bookmark


👉 gitignore/Groovy.gitignore at master · toptal/gitignore hatena-bookmark


👉 gitignore/Firebase.gitignore at master · toptal/gitignore hatena-bookmark

 

■ まとめ

以上を参考にすれば、ほぼ書けるはずです。

AndroidStudio 新規プロジェクト作成時に書き出される .gitignore が必要最小限な洗練されてる記述に思えます。

あとは、不要なファイル公開を避ける記述を追加していく、という流れ。

git 全体としては、広く深く記述もいろいろなのでよく使うとこから身につけていく方がいいと思います。

👉 【これだけで大丈夫】.gitignore チートシート - A Memorandum hatena-bookmark

.gitignore 概念の説明や操作としては、GitHub 公式 Doc が最も分かりやすくまとまっています。

👉 ファイルを無視する - GitHub Docs hatena-bookmark
👉 What makes a good template? - github/gitignore: A collection of useful .gitignore templates hatena-bookmark


'-Xopt-in' is deprecated and will be removed in a future release, please use -opt-in instead

'-Xopt-in' is deprecated and will be removed in a future release, please use -opt-in instead
👉 Issues with Gradle Kotlin DSL and `-Xopt-in` deprecation : KT-51708 hatena-bookmark


tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
   kotlinOptions {
     allWarningsAsErrors = false
     freeCompilerArgs += [
         "-Xopt-in=kotlin.RequiresOptIn",
         "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
         "-Xopt-in=kotlinx.coroutines.FlowPreview",
         "-Xopt-in=kotlinx.serialization.ExperimentalSerializationApi",
         "-Xopt-in=kotlin.Experimental",
     ]
   }
 }


'-Xopt-in' → '-opt-in'


tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
   kotlinOptions {
     allWarningsAsErrors = false
     freeCompilerArgs += [
         "-opt-in=kotlin.RequiresOptIn",
         "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
         "-opt-in=kotlinx.coroutines.FlowPreview",
         "-opt-in=kotlinx.serialization.ExperimentalSerializationApi",
         "-opt-in=kotlin.Experimental",
     ]
   }
 }

単純に gradle ファイル内、文字列の置換で完。

コード内アノテーションで利用の人はそのままでいいんかな。

👉 Opt-in requirement marker annotation on override requires the same marker on base declaration  hatena-bookmark
👉 AGP Upgrade Assistant で 7.2 移行時にCause: manifestData.`package` must not be null hatena-bookmark
👉 @Composable Scaffold で This material API is experimental and is likely to change or to be removed in the future. hatena-bookmark


IncompatibleClassChangeError: The method 'java.lang.Class java.lang.Object.getClass()' was expected to be of type interface but instead was found to be of type virtual

ちとハマったので書く。

API-26 (Oreo/8) でのみ落ちてる。


java.lang.IncompatibleClassChangeError: The method 'java.lang.Class java.lang.Object.getClass()' was expected to be of type interface but instead was found to be of type virtual (declaration of 'com.google.android.gms.dynamic.ObjectWrapper' appears in /data/app/com.benigumo.sample)
  at com.google.android.gms.dynamic.ObjectWrapper.unwrap(com.google.android.gms:play-services-basement@@18.0.2:4)
  at com.google.android.gms.internal.ads.zzbji.zzl(com.google.android.gms:play-services-ads-lite@@20.6.0:20)
  at com.google.android.gms.ads.BaseAdView.loadAd(com.google.android.gms:play-services-ads-lite@@20.6.0:1)
...

Firebase 周りの、API-26 新規当時の不具合。

👉 java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.measurement.internal.zzji@dbed45a · Issue #1662 · firebase/firebase-android-sdk hatena-bookmark

fixedバージョンを半年待つか、

または、以下の半年先までの暫定対応記述追加で回避できた。


dependencies {
  implementation 'com.google.android.gms:play-services-basement:17.5.0'
}

👉 Why does I'm getting "Service not registered" exception, even though I not used any service in Android - Java/Kotlin? - Stack Overflow hatena-bookmark

その暫定的であるべきはずの implementation 記述が残ったまま、

dependencies の更新を繰り返してきました。


//implementation 'com.google.android.gms:play-services-basement:18.0.2'

今回のエラーの時点で

firebase-ads と折り合いがつかず、

コメントアウト→削除となりました。

ありがとうございました。

👉 R8 で 難読化 された スタックトレース を元に戻す hatena-bookmark