Membangun rilis

Membangun APK dan AAB untuk Android, arsip iOS, serta dasar penandatanganannya.

Daftar isi

Aplikasi yang berjalan dari flutter run adalah build debug yang tidak layak disebarkan kepada pengguna. Topik ini membahas perbedaan tiga mode build, pembangunan APK dan app bundle untuk Android, arsip iOS, dasar penandatanganan Android, serta nomor versi pada pubspec.yaml. Setelah topik ini dibaca, setiap perintah build dapat dipilih secara tepat sesuai saluran distribusinya.

Tiga mode build#

Flutter mengenal tiga mode build yang kegunaannya berbeda. Tabel berikut merangkum ketiganya.

ModeKegunaanCiri utama
debugpengembangan harianhot reload, asersi aktif, performa tidak mewakili
profilepengukuran performakompilasi AOT dengan alat profiler aktif
releasepenyebaran kepada penggunakompilasi AOT, kode dioptimalkan, asersi dilepas

Build debug membawa penanda dan layanan debugging tanpa optimasi, sehingga performanya jauh di bawah build rilis dan tidak boleh menjadi acuan penilaian kecepatan. Build release mengompilasi Dart secara AOT (ahead-of-time, dikompilasi penuh sebelum aplikasi disebarkan) dan melepas seluruh asersi. Build profile menggabungkan kompilasi AOT dengan instrumentasi pengukuran, sehingga pengukuran performa dilakukan dengan mode ini, bukan dengan build debug.

Membangun APK untuk Android#

APK (Android Package) adalah berkas pemasangan Android yang dapat disalin ke perangkat dan dipasang langsung. Perintahnya sebagai berikut.

bash
# tidak-dijalankan
# membangun APK rilis
flutter build apk --release

Hasilnya berada di build/app/outputs/flutter-apk/app-release.apk. Tanpa opsi tambahan, satu APK memuat kode mesin untuk semua arsitektur prosesor yang didukung, yang membuat ukurannya lebih besar. Apabila distribusinya melalui tautan unduhan langsung, satu APK per arsitektur mengecilkan unduhan.

bash
# tidak-dijalankan
# membangun satu APK per arsitektur prosesor
flutter build apk --release --split-per-abi

Perintah tersebut menghasilkan berkas seperti app-release-arm64-v8a.apk, satu berkas untuk setiap arsitektur. Pemisahan ini disebut per-ABI, dengan ABI (application binary interface) sebagai istilah untuk kelompok arsitektur prosesor.

Membangun app bundle untuk Google Play#

Google Play menerima format AAB (Android App Bundle) yang menyerahkan penyesuaian arsitektur dan sumber daya kepada Play.

bash
# tidak-dijalankan
# membangun app bundle untuk Google Play
flutter build appbundle

Hasilnya berada di build/app/outputs/bundle/release/app-release.aab. Play menyusun unduhan per perangkat dari bundle tersebut, sehingga pengguna menerima unduhan yang lebih kecil daripada APK universal. Untuk publikasi melalui Play, AAB adalah format yang direkomendasikan, sedangkan APK tetap berguna untuk distribusi di luar Play.

Arsip iOS#

Distribusi iOS dilakukan melalui Xcode dan hanya berjalan pada macOS karena Xcode tidak tersedia di sistem lain. Perintah flutter build ipa membangun arsip aplikasi di build/ios/archive, lalu mengekspornya menjadi berkas .ipa di build/ios/ipa, dengan penandatanganan yang menggunakan sertifikat distribusi dan provisioning profile yang disiapkan pada Xcode. Alternatifnya, arsip dapat dibangun dari Xcode melalui menu Product lalu Archive. Berkas arsip kemudian diunggah ke App Store Connect untuk diperiksa sebelum dirilis kepada pengguna.

Menandatangani aplikasi Android#

Build rilis Android wajib ditandatangani dengan keystore, yaitu berkas biner yang menyimpan kunci penandatanganan. Buat keystore dengan keytool yang disertakan pada JDK, dan simpan di luar direktori proyek.

bash
# tidak-dijalankan
# membuat keystore rilis di luar direktori proyek
keytool -genkey -v -keystore ~/kunci-rilis.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload

Kata sandi dan lokasi keystore kemudian ditulis pada berkas key.properties di dalam direktori android, yang bentuknya sebagai berikut.

ini Contoh: isi berkas android/key.properties
storePassword=<kata-sandi-keystore>
keyPassword=<kata-sandi-kunci>
keyAlias=upload
storeFile=<lokasi-berkas-keystore>

Konfigurasi build.gradle kemudian membaca berkas tersebut untuk menandatangani build rilis, dan dokumentasi resmi Android memuat langkahnya sampai tuntas. Karena isinya rahasia, berkas key.properties beserta keystore tidak boleh ikut dalam repository. Pastikan .gitignore mencakup keduanya.

Nomor versi pada pubspec.yaml#

Setiap rilis membawa dua nomor yang dikelola pada pubspec.yaml.

yaml Contoh: nomor versi pada pubspec.yaml
name: aplikasi_catatan
version: 1.0.0+1

Bagian sebelum tanda tambah adalah nama versi yang dilihat pengguna, sedangkan angka sesudahnya adalah nomor build yang wajib naik pada setiap unggahan. Android menerjemahkannya menjadi versionName dan versionCode, sedangkan iOS menjadi CFBundleShortVersionString dan CFBundleVersion. Kebiasaan yang baik adalah menaikkan nama versi pada rilis fitur dan menaikkan nomor build pada setiap unggahan, karena unggahan dengan nomor build yang sama akan ditolak.

Artefak untuk web#

Perintah flutter build web menghasilkan situs statis pada direktori build/web yang dapat disebarkan ke hosting statis apa pun. Penyebaran web adalah yang paling ringan di antara semuanya karena tidak memerlukan penandatanganan maupun toko aplikasi. Meskipun demikian, fitur yang mengandalkan API khusus platform tetap perlu diperiksa ketersediaannya di web sebelum aplikasi dipublikasikan.

Kesalahan umum#

  • Mengirim build debug kepada pengguna. Berkasnya lebih besar, lebih lambat, dan asersinya aktif, sehingga kesan pertama pengguna menjadi buruk.
  • Menaikkan nama versi tanpa menaikkan nomor build. Unggahan baru dengan nomor build yang sama ditolak oleh toko aplikasi.
  • Menyimpan keystore di dalam repository. Rahasia itu praktis bocor setelah sekali masuk, dan harus dianggap terbaca oleh publik.
  • Menandatangani rilis publik dengan keystore debug. Keystore debug digunakan bersama oleh semua proyek pada satu komputer, sehingga tidak mengidentifikasi pemilik aplikasi.

Ringkasan#

  • Mode debug untuk pengembangan, profile untuk pengukuran performa, dan release untuk penyebaran dengan kompilasi AOT serta asersi yang dilepas.
  • flutter build apk menghasilkan berkas pemasangan Android, flutter build appbundle menghasilkan AAB untuk Play, dan flutter build ipa menghasilkan arsip iOS dari macOS.
  • Penandatanganan Android menggunakan keystore dan key.properties yang keduanya wajib dijauhkan dari repository.
  • Nomor versi ditulis pada pubspec.yaml dengan bentuk 1.0.0+1, dan nomor build-nya wajib naik pada setiap unggahan.

Referensi#