VPS

Flutter build APK và AAB trên máy chủ Linux

Thanh Nguyễn Đăng 9 phút đọc 4 khối lệnh

Flutter build APK và AAB trên máy chủ Linux
Mục lục bài viết
  1. Cài Flutter trên máy không màn hình
  2. APK hay AAB, chọn cái nào
  3. Ký bản phát hành
  4. Xử lý các lỗi hay gặp
  5. Tự động hóa để mỗi lần đẩy code là có bản mới
  6. Chọn định dạng đóng gói cho đúng
  7. Cài trên máy không màn hình và các lỗi hay gặp
  8. Ký bản phát hành: điều quan trọng nhất
  9. Câu hỏi thường gặp
  10. Bài viết liên quan

Trả lời nhanh: Trên máy chủ Linux, flutter build apk và flutter build appbundle chạy hoàn toàn bình thường, chỉ cần Flutter SDK cộng chuỗi công cụ Android. Ba điều nên nắm: nộp lên cửa hàng thì dùng AAB, gửi file cài trực tiếp thì dùng APK; bản phát hành phải được ký bằng keystore của bạn, không dùng khóa gỡ lỗi; và máy nên có từ 8GB RAM vì Gradle rất dễ bị hệ điều hành giết khi thiếu bộ nhớ.

Build Flutter trên laptop thì đơn giản, nhưng khi cả đội cần bản thử mỗi ngày thì việc chiếm máy cá nhân để chạy build không còn hợp lý. Đưa lên máy chủ giải quyết chuyện đó, và tiện thể mở đường cho việc tự động hóa. Bài này đi từ máy trắng tới file cài đặt ký sẵn.

Cài Flutter trên máy không màn hình

TerminalCài Flutter trên máy không màn hìnhbash
# Chuoi cong cu Android da co san theo bai truocsudo apt install -y curl git unzip xz-utils zip libglu1-mesa cd /optsudo git clone https://github.com/flutter/flutter.git -b stableecho 'export PATH=$PATH:/opt/flutter/bin' | sudo tee /etc/profile.d/flutter.shsource /etc/profile.d/flutter.sh flutter doctor

Phần Android SDK, JDK và bước chấp nhận giấy phép đã nói kỹ ở bài dựng máy build Android, làm xong phần đó rồi hãy quay lại đây.

Lệnh flutter doctor sẽ báo thiếu Xcode và thiếu thiết bị kết nối. Cả hai đều bình thường trên máy chủ Linux, bạn chỉ cần quan tâm hai dòng: Flutter và Android toolchain phải có dấu tích xanh. Nếu Android toolchain báo lỗi giấy phép thì chạy lại lệnh chấp nhận giấy phép của SDK.

APK hay AAB, chọn cái nào

Hai định dạng cho hai mục đích khác nhau:

  • AAB là định dạng nộp lên cửa hàng Google Play. Bạn nộp một file, cửa hàng tự sinh bản cài tối ưu cho từng loại máy. Người dùng tải về ít dung lượng hơn.
  • APK là file cài trực tiếp. Dùng khi gửi bản thử cho đồng nghiệp qua đường link, hoặc phát hành ngoài cửa hàng chính thức.
TerminalAPK hay AAB, chọn cái nàobash
flutter build appbundle --release      # nop cua hangflutter build apk --release            # mot file cai duoc ngayflutter build apk --release --split-per-abi   # tach theo kien truc

Tùy chọn đáng dùng khi phát hành APK trực tiếp: thay vì một file chứa mã máy cho mọi kiến trúc, bạn được nhiều file nhỏ hơn hẳn, mỗi file cho một loại chip. Người dùng tải đúng bản của máy mình. Nhớ đưa cả bản cho kiến trúc 64 bit và 32 bit nếu còn hỗ trợ máy đời cũ.

Ký bản phát hành

Bản gỡ lỗi được ký bằng khóa tạm, cài lên máy để thử thì được nhưng không nộp cửa hàng được và không nên phát cho người ngoài. Bản phát hành phải ký bằng keystore của bạn:

TerminalKý bản phát hànhbash
keytool -genkey -v -keystore ~/khoa-ky-app.jks   -keyalg RSA -keysize 2048 -validity 10000 -alias phat-hanh

Sau đó tạo file android/key.properties trỏ tới keystore, và khai báo trong android/app/build.gradle để bản release dùng khóa đó.

Ba điều bắt buộc nhớ về keystore: không đưa file này vào Git; sao lưu ở ít nhất hai nơi an toàn; và ghi lại mật khẩu ở nơi quản lý bí mật của công ty. Mất keystore nghĩa là không bao giờ cập nhật được ứng dụng đó trên cửa hàng nữa, phải phát hành như một ứng dụng mới và mất toàn bộ người dùng cũ.

Trên máy chủ CI, đặt keystore ngoài thư mục dự án và cấp quyền đọc chỉ cho người dùng chạy build.

Xử lý các lỗi hay gặp

Tiến trình bị giết giữa chừng. Gần như luôn là hết RAM. Giảm mức bộ nhớ cấp cho Gradle trong android/gradle.properties xuống mức nhỏ hơn RAM thật, thêm swap, hoặc nâng máy lên 8GB. Thông báo lỗi trong trường hợp này thường vô nghĩa nên dễ đi sai hướng.

Bản dựng đầu tiên rất lâu. Bình thường, vì Gradle tải toàn bộ thư viện phụ thuộc. Giữ nguyên thư mục ~/.gradle và ~/.pub-cache giữa các lần chạy thì những lần sau nhanh hơn nhiều. Trên CI, hãy cấu hình lưu đệm hai thư mục này.

Lỗi phiên bản plugin không tương thích. Hay xảy ra khi máy chủ cài bản Flutter mới hơn bản mà dự án đang dùng. Cách chắc chắn là ghim đúng phiên bản Flutter cho từng dự án thay vì luôn chạy bản mới nhất.

Thiếu giấy phép SDK. Chạy lệnh chấp nhận giấy phép, đây là lỗi kinh điển trên máy chủ vì không có ai bấm đồng ý.

Tự động hóa để mỗi lần đẩy code là có bản mới

Khi build tay đã chạy trơn, bước tiếp theo là để máy làm. Luồng thường dùng: mỗi lần đẩy code lên nhánh chính thì CI chạy kiểm thử, dựng bản APK gỡ lỗi và đưa lên nơi lưu trữ để đội kiểm thử tải về; còn khi gắn thẻ phiên bản thì mới dựng bản phát hành đã ký.

Chạy CI trên chính máy chủ của bạn thay vì dịch vụ tính theo phút thường rẻ hơn nhiều với dự án mobile, vì mỗi bản dựng tốn hàng chục phút. Phân tích chi phí và cách dựng nằm ở bài CI/CD tự host.

Một lời khuyên vận hành: dọn thư mục build theo lịch. Mỗi bản dựng để lại vài trăm MB, và sau vài tuần bạn sẽ hết ổ vào đúng ngày cần phát hành gấp.

Chọn định dạng đóng gói cho đúng

Định dạngDùng khi nàoGhi chú
Gói cài đặt truyền thốngPhát cho người thử, cài trực tiếpCài được ngay, không qua cửa hàng
Gói phát hành lên cửa hàngNộp lên cửa hàng ứng dụngCửa hàng yêu cầu định dạng này cho ứng dụng mới

Điểm hay nhầm: gói phát hành lên cửa hàng không cài trực tiếp lên máy được. Nếu bạn cần gửi bản thử cho đồng nghiệp, phải xuất bản gói cài đặt truyền thống. Nhiều người dựng nhầm định dạng rồi không hiểu vì sao không cài được.

Cài trên máy không màn hình và các lỗi hay gặp

TerminalCài trên máy không màn hình và các lỗi hay gặpbash
# Chap nhan giay phep cong cu truoc, buoc hay bi quenyes | sdkmanager --licenses # Kiem moi thu da san sang chua, lenh nay chi ra dung thu con thieuflutter doctor -v # Bo qua phan kiem cong cu chi co tren may co man hinhflutter config --no-analytics # Dung: kiem bo nho trong luc chaywatch -n2 'free -h'dmesg | tail -20 | grep -i "out of memory\|killed" # Neu bi dung tien trinh giua chung: dat vung nho tamfallocate -l 4G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfileecho '/swapfile none swap sw 0 0' >> /etc/fstab # Gioi han bo nho cho tien trinh dungexport GRADLE_OPTS="-Xmx3g"
Lỗi hay gặpNguyên nhânCách xử
Chưa chấp nhận giấy phépBỏ qua bước chấp nhận khi càiChạy lệnh chấp nhận giấy phép
Tiến trình bị dừng giữa chừngHết bộ nhớThêm RAM hoặc đặt vùng nhớ tạm
Báo thiếu công cụ dòng lệnhCài thiếu thành phầnChạy lệnh kiểm tra để biết thiếu gì
Dựng được nhưng không cài lên máy đượcXuất nhầm định dạngXuất định dạng gói cài đặt truyền thống

Ký bản phát hành: điều quan trọng nhất

Tệp khóa ký là tài sản không thay thế được. Mất nó là không cập nhật được ứng dụng đã phát hành, và phải phát hành lại như một ứng dụng mới, mất toàn bộ người dùng cũ. Ba quy tắc: không đưa vào kho mã nguồn; sao lưu ở ít nhất hai nơi khác nhau; và ghi lại mật khẩu khóa trong kho bí mật của công ty, không phải trong đầu một người.

Câu hỏi thường gặp

Build Flutter trên VPS có khác gì trên máy cá nhân không?

Không khác về kết quả, file APK và AAB tạo ra giống hệt. Khác ở chỗ máy chủ không có giao diện nên bạn không chạy được trình giả lập theo cách thông thường, và mọi thứ đi qua dòng lệnh.

Cấu hình VPS bao nhiêu để build Flutter?

Tối thiểu 4 vCPU và 8GB RAM cho dự án vừa. Dưới mức đó rất hay gặp lỗi tiến trình bị giết. Ổ đĩa nên từ 60GB vì Flutter SDK, Android SDK và bộ nhớ đệm cộng lại đã chiếm đáng kể.

Có build được bản iOS trên máy này không?

Không. Nhánh iOS bắt buộc qua macOS, đó là ràng buộc từ công cụ và điều khoản của Apple. Máy Linux lo trọn nhánh Android còn bản iOS phải chạy trên máy Mac riêng.

Nên nộp cửa hàng bằng APK hay AAB?

Google Play yêu cầu AAB cho ứng dụng mới, nên hãy dùng AAB khi nộp. APK vẫn hữu ích để gửi bản thử trực tiếp cho người kiểm thử hoặc phát hành ngoài cửa hàng chính thức.

Chia sẻ:Facebook

Thanh Nguyễn

TND

Tư vấn bản quyền, VPS và máy chủ kèm hóa đơn VAT, hợp đồng đầy đủ cho doanh nghiệp.