Để triển khai ứng dụng Flutter của bạn trên thiết bị Android hoặc phát hành lên Google Play Store, bạn cần tạo một tệp APK (Android Package Kit) đã được ký điện tử. Quy trình này bao gồm việc tạo khóa ký, cấu hình dự án, và cuối cùng là biên dịch ứng dụng.
Bước 1: Tạo khóa ký điện tử (Signing Key)
Khóa ký điện tử là một yếu tố bảo mật quan trọng, dùng để xác minh danh tính của nhà phát triển và đảm bảo tính toàn vẹn của ứng dụng. Bạn có thể tạo khóa này bằng công cụ keytool có sẵn trong JDK (Java Development Kit) hoặc Android Studio.
Mở Terminal trong Android Studio hoặc Command Prompt/Terminal và chạy lệnh sau:
keytool -genkeypair -v -keystore C:/Android/KhoaKy/ung_dung_flutter.jks \
-storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias khoa_ung_dung
Giải thích các tham số:
-genkeypair: Lệnh để tạo một cặp khóa công khai/riêng tư.-v: Hiển thị thông tin chi tiết trong quá trình tạo khóa.-keystore C:/Android/KhoaKy/ung_dung_flutter.jks: Chỉ định đường dẫn và tên của tệp keystore sẽ được tạo. Thay đổi đường dẫnC:/Android/KhoaKy/thành thư mục mong muốn của bạn.-storetype JKS: Định dạng của keystore (Java KeyStore).-keyalg RSA: Thuật toán mã hóa cho khóa.-keysize 2048: Kích thước của khóa (bit).-validity 10000: Số ngày khóa có hiệu lực (ở đây là khoảng 27 năm).-alias khoa_ung_dung: Một biệt danh duy nhất cho khóa trong keystore. Hãy ghi nhớ biệt danh này.
Sau khi chạy lệnh, bạn sẽ được yêu cầu nhập mật khẩu cho keystore (storePassword) và mật khẩu cho khóa (keyPassword), cùng với một số thông tin cá nhân như tên, tổ chức, quốc gia. Hãy lưu lại mật khẩu và biệt danh này ở nơi an toàn vì bạn sẽ cần chúng sau này.
Bước 2: Cấu hình tệp thuộc tính khóa (key.properties)
Để dự án Flutter có thể truy cập thông tin khóa ký của bạn một cách an toàn, bạn nên tạo một tệp key.properties. Tệp này sẽ chứa các thông tin như mật khẩu và đường dẫn đến keystore.
Tạo một tệp mới có tên key.properties trong thư mục android/ của dự án Flutter của bạn (ngang hàng với thư mục app).
# Thong tin cau hinh khoa ky ung dung Flutter
matKhauKhoaGoc = matKhauKeystoreCuaBan
matKhauKhoa = matKhauKhoaRiengCuaBan
biDanhKhoa = khoa_ung_dung
duongDanTepKhoa = C:/Android/KhoaKy/ung_dung_flutter.jks
Hãy thay thế các giá trị mẫu bằng thông tin khóa ký thực tế của bạn đã tạo ở Bước 1. Đảm bảo đường dẫn duongDanTepKhoa là đường dẫn tuyệt đối chính xác đến tệp .jks của bạn.
Lưu ý quan trọng: Không bao giờ commit tệp key.properties chứa thông tin nhạy cảm của bạn vào hệ thống kiểm soát phiên bản (ví dụ: Git). Thêm key.properties vào tệp .gitignore của bạn.
Bước 3: Cấu hình quy tắc R8/ProGuard (Code Obfuscation)
R8 (hoặc ProGuard trên các phiên bản Android cũ hơn) giúp giảm kích thước ứng dụng bằng cách loại bỏ mã không sử dụng và làm rối mã nguồn, giúp bảo vệ ứng dụng khỏi bị đảo ngược thiết kế. Đối với ứng dụng Flutter, bạn cần giữ lại một số lớp nhất định.
Tạo một tệp có tên proguard-rules.pro trong thư mục android/app/ của dự án của bạn (nếu chưa có).
# Quy tac R8/ProGuard cho ung dung Flutter
# Giu lai cac lop co ban cua Flutter framework
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
# Giu lai cac lop giao dien JNI
-keep class * implements org.json.JSONObject$Accessor { *; }
-keep class * implements org.json.JSONArray$Accessor { *; }
Những quy tắc -keep này đảm bảo rằng các thành phần cốt lõi của Flutter và các plugin không bị loại bỏ hoặc làm rối mã nguồn, giúp ứng dụng hoạt động đúng cách sau khi biên dịch.
Bước 4: Điều chỉnh tệp build.gradle của ứng dụng
Cuối cùng, bạn cần chỉnh sửa tệp build.gradle của mô-đun ứng dụng Android để tích hợp thông tin khóa ký và quy tắc R8/ProGuard.
Mở tệp android/app/build.gradle của dự án.
Thêm đoạn mã sau vào đầu tệp, trước khối android { ... }, để đọc thông tin từ key.properties:
def tepCauHinhKhoa = rootProject.file("key.properties")
def thongTinKhoa = new Properties()
thongTinKhoa.load(new FileInputStream(tepCauHinhKhoa))
Sau đó, tìm khối android { ... } và thêm cấu hình signingConfigs bên trong nó, rồi áp dụng cấu hình này cho kiểu bản dựng release:
android {
compileSdkVersion flutter.compileSdkVersion // Hoac mot phien ban cu the nhu 33, 34
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
applicationId "com.example.tenungdungcuaBan" // Thay doi ID ung dung duy nhat cua ban
minSdkVersion flutter.minSdkVersion // Hoac mot phien ban cu the nhu 21
targetSdkVersion flutter.targetSdkVersion // Hoac mot phien ban cu the nhu 33
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// Cau hinh ky dien tu
signingConfigs {
release {
storeFile file(thongTinKhoa['duongDanTepKhoa'])
storePassword thongTinKhoa['matKhauKhoaGoc']
keyAlias thongTinKhoa['biDanhKhoa']
keyPassword thongTinKhoa['matKhauKhoa']
}
}
// Cau hinh cac loai ban dung
buildTypes {
release {
// Su dung cau hinh ky cho ban phat hanh
signingConfig signingConfigs.release
// Kich hoat toi uu hoa ma va lam roi ma nguon voi R8/ProGuard
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
Hãy đảm bảo applicationId là duy nhất và thay thế các giá trị compileSdkVersion, minSdkVersion, targetSdkVersion nếu bạn cần các phiên bản cụ thể không được tự động định nghĩa bởi Flutter.
Bước 5: Thực hiện đóng gói ứng dụng
Khi tất cả các cấu hình đã được thiết lập, bạn có thể tạo tệp APK phát hành bằng cách chạy lệnh sau trong thư mục gốc của dự án Flutter:
flutter build apk --release
Lệnh này sẽ biên dịch ứng dụng của bạn ở chế độ phát hành, áp dụng các quy tắc ký và R8/ProGuard. Sau khi quá trình hoàn tất, tệp APK đã ký sẽ nằm tại:
<duong_dan_du_an_flutter>/build/app/outputs/flutter/release/app-release.apk
Giờ đây, bạn có thể sử dụng tệp app-release.apk này để cài đặt thủ công lên thiết bị Android hoặc tải lên Google Play Console.