Build APK Release
Dari kode ke APK: build, signing, dan ukuran aplikasi.
Kenapa Build Release Berbeda dari Debug
Saat kamu menekan Run di VS Code, Flutter membangun versi debug: lambat, besar, penuh informasi debugging, dan ditandatangani kunci debug yang sama di semua mesin. Versi itu untuk pengembangan, bukan untuk pengguna. Build release mengompilasi Dart ke kode mesin ARM lewat AOT, membuang kode yang tidak terpakai (tree-shaking), dan mengecilkan resource. Hasilnya aplikasi yang jauh lebih cepat dibuka dan jauh lebih kecil. Memahami perbedaannya penting karena bug kadang hanya muncul di mode release (misalnya kode yang bergantung pada assert, yang dimatikan di release).
Perintah Build yang Perlu Dikuasai
# Debug, untuk testing harian di device:
flutter build apk --debug
# Release, untuk dibagikan ke pengguna:
flutter build apk --release
# APK per arsitektur CPU, ukurannya jauh lebih kecil:
flutter build apk --release --split-per-abi
# Wajib untuk upload ke Play Store (format .aab, bukan .apk):
flutter build appbundle --releaseHasil APK ada di build/app/outputs/flutter-apk/app-release.apk, sedangkan bundle ada di build/app/outputs/bundle/release/app-release.aab. Flag --split-per-abi menghasilkan tiga APK (arm64, armeabi, x86_64) sehingga pengguna hanya mengunduh yang cocok dengan HP-nya, seringkali memangkas ukuran 30 sampai 40 persen. Untuk Play Store, Google mewajibkan .aab karena Play yang akan mengoptimasi APK per device dari bundle tersebut.
Catatan teknis: Jangan pernah membagikan APK debug ke pengguna. Selain besar dan lambat, APK debug mengizinkan debugging dan datanya tidak merepresentasikan pengalaman rilis yang sebenarnya.
Signing: Tanda Tangan Digital Rilismu
Secara default Flutter menandatangani build dengan debug key. Untuk rilis publik kamu butuh keystore sendiri, dan langkahnya hanya sekali tapi krusial:
# 1. Buat keystore (simpan password baik-baik!):
keytool -genkey -v -keystore ~/upload-keystore.jks \
-keyalg RSA -keysize 2048 -validity 10000 -alias upload# 2. File android/key.properties (JANGAN di-commit):
storePassword=kata-sandi-aman
keyPassword=kata-sandi-aman
keyAlias=upload
storeFile=/home/user/upload-keystore.jks// 3. Di android/app/build.gradle, dalam blok android { ... }:
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}Terakhir tambahkan ke .gitignore: baris *.jks dan key.properties. Keystore yang hilang berarti kamu tidak bisa lagi mengupdate aplikasi yang sama di Play Store, karena Google memverifikasi identitas developer dari tanda tangan ini. Backup keystore di minimal dua tempat dan simpan password di password manager.
Versioning dan Diet Ukuran Aplikasi
Setiap rilis butuh versi baru di pubspec.yaml, format version: 1.0.0+1, di mana angka setelah + adalah versionCode yang wajib naik tiap upload ke Play Store. Tips mengecilkan ukuran: pakai --split-per-abi, aktifkan shrink dengan flutter build apk --release --shrink, hapus asset gambar yang tidak dipakai, dan kompres gambar (WebP jauh lebih ringan dari PNG). Cek ukuran akhir dengan ls -lh build/app/outputs/flutter-apk/ dan bandingkan antar varian sebelum memutuskan mana yang dibagikan.
Edge Cases Sebelum Upload
Uji APK release di device fisik sebelum diupload, karena perilaku release bisa berbeda: animasi yang mulus di debug bisa jank di release jika ada pekerjaan berat di main thread, dan sebaliknya. Perhatikan minSdkVersion di build.gradle: menaikkannya mengecilkan APK tapi mengorbankan device lama, jadi sesuaikan dengan target pengguna. Beberapa plugin butuh aturan ProGuard tambahan agar tidak rusak setelah minify, baca dokumentasi plugin yang kamu pakai. Dan kalau build tiba-tiba gagal setelah update Flutter, jalankan flutter clean lalu build ulang, cache lama adalah tersangka utama.
Kapan Tidak Perlu Repot
Untuk testing internal tim, APK debug atau Firebase App Distribution sudah cukup, tidak perlu signing manual. Untuk Play Store, jangan upload APK biasa, pakai .aab. Dan kalau aplikasimu hanya dipakai sendiri di satu HP, --split-per-abi untuk arsitektur HP itu saja adalah cara tercepat dapat APK terkecil.
Tantangan
Cek ukuran APK
Build APK release dari project latihanmu, catat ukurannya, lalu build dengan --split-per-abi dan bandingkan ukurannya.