リリースビルドの準備
アプリバンドルと縮小化を扱います。
「リリースビルドの準備」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
デバッグからリリースへ
普段はAndroid Studioからdebugビルドを実行します。しかしGoogle Playには、より小さく高速で、デバッグ可能として扱われないreleaseビルドが必要です。
releaseビルドには、主に3つの違いがあります。リリースキーで署名され、debuggable falseが設定され、通常は未使用のコードとリソースを削除するために縮小されます。
このレッスンでは、適切なreleaseビルドを準備し、Google Playが求めるファイルであるAndroid App Bundle (.aab)を作成します。
Gradleのビルドタイプ
Gradleには、デフォルトでdebugとreleaseの2つのビルドタイプがあります。モジュールのbuild.gradle.ktsで設定します。
最適化を有効にするのはreleaseブロックです。以下のisMinifyEnabledとisShrinkResourcesに注目してください。これらがアプリを小さくするためのスイッチです。
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}AABとAPKの違い
Google Playでは、通常の.apkではなくAndroid App Bundle(.aab)が必要です。
- .apkには、すべての画面密度、CPUアーキテクチャ、言語など、あらゆるデバイス向けのコードとリソースが含まれます。
- .aabをPlayにアップロードすると、Playが各ユーザーの端末に最適化された小さなAPKを生成します。
その結果、ユーザーのダウンロード量が減り、アプリのインストールサイズも小さくなります。端末での直接テストには引き続きAPKを使いますが、公開するのはAABです。
R8 / 縮小とは
isMinifyEnabled = trueにすると、Android StudioはR8を実行します。R8は1回の処理で3つの役割を果たします。
- 縮小 — アプリから呼び出されることのないクラスとメソッドを削除します。
- 難読化 — クラスとメソッドの名前を
a、b、cのような短い名前に変更し、容量を節約するとともにリバースエンジニアリングを困難にします。 - 最適化 — コードをインライン化・書き換えして、より高速に実行できるようにします。
リソースの縮小(isShrinkResources = true)を有効にすると、未使用のdrawable、layout、stringも追加で削除されます。
ProGuardのkeepルール
R8は、リフレクションからのみ参照されるコード(たとえばGson、Retrofit、シリアライゼーションで使用されるコード)を削除または名前変更することがあります。このコードは、proguard-rules.proのkeepルールで保護します。
keepルールはR8に対して、「これらのクラスの名前を変更したり削除したりしないでください」と指示します。
# proguard-rules.pro
# Keep data classes used with Gson reflection
-keep class com.example.app.model.** { *; }
# Keep Retrofit interface methods
-keepattributes Signature
-keepattributes *Annotation*
# Keep Kotlin metadata used by libraries
-keep class kotlin.Metadata { *; }アプリのバージョン管理
リリースごとに、build.gradle.ktsで2つのバージョン値を設定する必要があります。
versionCode— アップロードするたびに増加させる必要がある整数です。Playはこれを使用して、どのビルドが新しいかを判断します。versionName— ユーザーに表示される、"1.4.0"のような人間が読みやすい文字列です。
versionCodeを増やし忘れると、重複したアップロードとしてPlayに拒否されます。
android {
defaultConfig {
applicationId = "com.example.app"
minSdk = 24
targetSdk = 35
versionCode = 12
versionName = "1.4.0"
}
}Android StudioでBundleをビルドする
UIから署名済みのリリースBundleを作成するには、次の手順を実行します。
- Build → Generate Signed Bundle / APKを開きます。
- Android App Bundleを選択します。
- キーストアとキーを選択(または作成)します。
- releaseビルドバリアントを選択します。
Android StudioがR8を実行してBundleに署名し、.aabをapp/release/に出力します。Playにアップロードするのは、この1つのファイルです。
コマンドラインからビルドする
CI/CDやスクリプトでは、Gradleを直接使ってBundleをビルドします。タスク名はbundle<Variant>というパターンに従います。
bundleReleaseはAABを生成します。ファイルはapp/build/outputs/bundle/release/に出力されます。
# Build a release App Bundle (.aab)
./gradlew bundleRelease
# Output:
# app/build/outputs/bundle/release/app-release.aab
# Build a release APK instead (for direct install/testing)
./gradlew assembleReleaseAABを検査してテストする
.aabをスマートフォンに直接インストールすることはできません。Playが生成する正確なAPKをテストするには、Googleのbundletoolを使用します。
BundleからデバイスごとのAPKをビルドし、接続されたデバイスにインストールします。実際にPlayからダウンロードする場合に最も近いテスト方法です。
# Generate APKs from the bundle for the connected device
java -jar bundletool.jar build-apks \
--bundle=app-release.aab \
--output=app.apks \
--connected-device
# Install them on the device
java -jar bundletool.jar install-apks --apks=app.apksリリースからデバッグコードを削除する
リリースビルドでは、機密データをログに出力したり、デバッグ専用の機能を有効にしたままにしたりしてはいけません。動作を分岐するにはBuildConfig.DEBUGを使用します。これはデバッグビルドでのみtrueになります。
R8は、定数falseで保護されたブロックを取り除くこともできます。そのため、サイズの削減にもつながります。
fun setupLogging() {
if (BuildConfig.DEBUG) {
// Verbose logging only in debug builds
Log.d("App", "Debug logging enabled")
Timber.plant(Timber.DebugTree())
} else {
// Release: send to crash reporting only, no console spam
Timber.plant(CrashReportingTree())
}
}リリース準備チェックリスト
最終Bundleをビルドする前に、次の項目を確認します。
versionCodeを増やし、versionNameを更新している。- リリースで
isMinifyEnabledとisShrinkResourcesを有効にしている。 - リフレクションを使用するライブラリにkeepルールを追加している。
targetSdkがPlayの現在の要件を満たしている。- リリースコードにデバッグ専用のログやテスト用エンドポイントがない。
- 実際のデバイスでbundletoolを使ってAABをテストしている。
これらをすべて確認できれば、.aabをアップロードする準備は完了です。
確認問題
isMinifyEnabled = trueを設定したところ、デバッグでは正常に動作するのに、リリースでJSONパーサーからの「class not found」エラーによってアプリがクラッシュします。最も可能性の高い原因は何でしょうか。
まとめ:リリースビルドの準備
これで、デバッグアプリを公開可能なビルドに変換する方法が分かりました。
- Playでは署名済みの.aabが必要で、PlayはそこからデバイスごとのAPKを生成します。
releaseビルドタイプでは、isMinifyEnabledとisShrinkResourcesによってR8が有効になり、縮小、難読化、最適化が行われます。- keepルールによって、リフレクションを使用するコードが削除されないように保護します。
- 常に
versionCodeを増やし、versionNameを更新します。 ./gradlew bundleReleaseでビルドし、bundletoolで結果をテストします。
次は、このビルドの信頼性を保証する署名が実際にどのように機能するかを学びます。
よくある質問
「リリースビルドの準備」レッスンは無料ですか?
はい。「リリースビルドの準備」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「リリースビルドの準備」で何を学びますか?
アプリバンドルと縮小化を扱います。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「リリースビルドの準備」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- リリースビルドの準備
- アプリの署名
- Play Consoleとストア掲載情報
- 段階的リリースとアップデート