releaseapkdeployMahir4 mnt baca

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

bash
# 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 --release

Hasil 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:

bash
# 1. Buat keystore (simpan password baik-baik!):
keytool -genkey -v -keystore ~/upload-keystore.jks \
  -keyalg RSA -keysize 2048 -validity 10000 -alias upload
properties
# 2. File android/key.properties (JANGAN di-commit):
storePassword=kata-sandi-aman
keyPassword=kata-sandi-aman
keyAlias=upload
storeFile=/home/user/upload-keystore.jks
gradle
// 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.