Mục lục
Xuất một APK từ Android Studio nghĩa là tạo ra một gói release đã ký qua Build, Generate Signed Bundle or APK: chọn module, trỏ vào keystore release của bạn, chọn biến thể release rồi build. Flutter cần một lệnh, React Native cần một task Gradle, còn lấy một APK đã cài khỏi điện thoại thì cần ADB. Hãy chỉ xuất những bản build bạn sở hữu, ký mọi bản release và bảo vệ keystore.
Thuộc trung tâm modding: Cách mod APK · Lấy app đã cài: Trích APK · Ký bất cứ thứ gì: Ký APK.
Bởi Abdul Emam, người kiểm thử APK tại ApkZena. Tôi từng gửi một bản build thử ký bằng khóa debug sang thiết bị thứ hai và mất một tiếng tự hỏi vì sao bản cập nhật release từ chối cài đè lên nó. Khác khóa là khác ứng dụng. Hãy kiểm tra chữ ký trước khi bạn chia sẻ bất cứ thứ gì.
Hướng dẫn này trình bày bản debug so với release, việc thiết lập keystore, wizard xuất của Studio, các bản build Flutter và React Native, việc lấy APK đã cài, quyết định APK so với AAB, việc ký, cùng những lỗi build bạn sẽ gặp.
APK debug so với release
APK debug dùng cấu hình phát triển và nhằm mục đích thử nghiệm, còn APK release dùng cấu hình build sản xuất cùng một khóa ký release; hãy chọn biến thể release cho phân phối, rồi xác minh chứng chỉ và hành vi của nó trên thiết bị đích.
Khi nào dùng loại nào
Debug cho phát triển hằng ngày và các phiên logcat. Release cho người thử, phân phối sideload và bất cứ thứ gì rời khỏi máy của bạn. Một bản build debug lọt ra ngoài không thể nhận cập nhật đúng sau này, và bỏ rơi mọi người đã cài nó.
Trước khi xuất
Trước khi xuất, hãy xác nhận rằng keystore release tồn tại, mật khẩu của nó có sẵn, một bản sao lưu được lưu an toàn, và biến thể build đã đặt ở release; những kiểm tra này ngăn lỗi thiếu khóa cùng việc vô tình tạo ra một artifact ký debug để phân phối.
Thiết lập keystore
Tạo nó một lần bằng keytool, ghi lại cả hai mật khẩu ở một nơi bền, và sao chép tệp tới hai vị trí độc lập. Tài liệu ký ứng dụng của Google mô tả mọi cờ cùng lý do giữ các khóa release ở chế độ riêng tư.
Sa lưu keystore trước đã
Mất tệp này tức là làm mồ côi mọi ứng dụng mà nó ký: không khôi phục, không khiếu nại, mọi người dùng phải cài lại. Hãy sao lưu nó trước lần xuất đầu tiên, chứ không phải sau lần sợ hãi đầu tiên. Một ổ USB được mã hóa cộng một kho lưu trữ ngoại tuyến phủ gần hết mọi chế độ hỏng.
Cấu hình build variants
Chọn biến thể release trong bảng Build Variants để lần xuất dùng cấu hình sản xuất. Build nhầm biến thể debug cho ra một gói trông như đã hoàn thiện và hành xử như một bản build thử, gồm cả chữ ký sai.
Cách xuất APK đã ký
Wizard Generate Signed Bundle or APK của Android Studio dẫn bạn qua các lần xuất một lần và việc thiết lập keystore lần đầu, hỏi về module, khóa và biến thể release trước khi build; hãy xác minh chứng chỉ thu được thay vì chỉ dựa vào thông báo thành công của wizard.
Bước 1: Mở wizard
Chọn Build, rồi Generate Signed Bundle or APK từ thực đơn. Hãy chọn APK thay vì Bundle khi mục tiêu là phân phối trực tiếp, vì các bundle chỉ trở nên cài được qua xử lý của Play.
Bước 2: Chọn module và keystore
Chọn module ứng dụng, rồi chọn tệp keystore release cùng mật khẩu của nó. Chỉ tạo keystore mới tại đây nếu chưa có, và sao lưu ngay sau đó: wizard sẽ không nhắc bạn lần thứ hai.
Bước 3: Chọn release và build
Chọn loại build release, bật shrinking rồi chạy build. APK đã ký nằm dưới app/release/, được đặt tên theo biến thể và sẵn sàng để xác minh.
Bước 4: Xác minh bằng apksigner
apksigner verify --print-certs app-release.apk
Hãy xác nhận chứng chỉ của bạn và một kết quả sạch. Rồi cài lên thiết bị thật, không chỉ emulator, vì các đường dẫn mã chuyên biệt cho phần cứng chỉ tồn tại trên phần cứng.
Cách build APK trong Flutter
Build Android của Flutter biên dịch mã Dart và đóng gói ứng dụng qua Gradle; sau khi cấu hình ký release, flutter build apk --release tạo một APK trong thư mục đầu ra của Flutter, và nó nên được xác minh trước khi phân phối cho người thử trên các thiết bị đích được hỗ trợ.
Lệnh release
flutter build apk --release
Thêm --split-per-abi để có các tệp nhỏ hơn theo từng kiến trúc, cài nhanh hơn trên thiết bị hạn chế tài nguyên. Đầu ra nằm trong build/app/outputs/flutter-apk/, như được ghi trong hướng dẫn triển khai Android của Flutter.
Thiết lập ký
Tạo android/key.properties trỏ vào keystore release của bạn và nối nó vào cấu hình Gradle. Không có nó, Flutter ký bằng khóa debug và đầu ra trông như hoàn thiện nhưng mang một danh tính dùng một lần.
Cách build APK trong React Native
APK Android của React Native được build qua Gradle wrapper trong thư mục android/ của dự án; hãy cấu hình keystore release trước, rồi dùng task release của dự án và làm theo hướng dẫn ký chính thức để thiết lập Gradle.
Task Gradle
cd android && ./gradlew assembleRelease
APK đã ký xuất hiện dưới android/app/build/outputs/apk/release/. Hãy cấu hình signingConfigs với keystore release trước, nếu không task sẽ phát ra một artifact chưa ký và bạn cần apksigner xử lý sau đó.
Cách trích APK của một ứng dụng đã cài
Việc xuất biên dịch một APK mới từ một dự án mã nguồn, còn việc trích xuất sao chép gói đã cài trên thiết bị; hãy dùng một ứng dụng trích xuất, hoặc adb shell pm path với adb pull cho việc thứ hai, theo hướng dẫn trích xuất APK.
APK so với AAB cho phân phối
Android App Bundle là một định dạng phát hành mà Google Play xử lý thành các APK riêng cho từng thiết bị, còn một APK độc lập cài được trực tiếp cho thử nghiệm hoặc phân phối; hãy chọn artifact dựa trên kênh đích và yêu cầu hiện tại của nền tảng.
Khi nào tạo loại nào
Niêm yết trên Play nghĩa là AAB, luôn luôn. Sideloading, giao tệp cho người thử, lưu trữ và làm nền tảng modding nghĩa là APK. Tạo sai artifact thì lãng phí một chu kỳ build và làm bối rối người nhận, nên hãy quyết định kênh trước khi mở bất kỳ wizard nào.
So sánh APK với AAB trình bày cơ chế bundle, việc ký của Play và các trường hợp định dạng nào thắng.
Cách ký một APK đã build
Android Studio có thể ký một APK khi wizard xuất hoặc cấu hình Gradle cung cấp một keystore, còn apksigner ký và xác minh được đầu ra từ các hệ thống build khác; hãy kiểm tra chứng chỉ trước khi chia sẻ và giữ khóa sẵn sàng cho các cập nhật sau.
Việc tạo keystore, việc chọn lược đồ và mọi thông báo lỗi nằm trong hướng dẫn ký. Hãy ký và xác minh như một động tác duy nhất trước khi bất kỳ tệp nào rời khỏi máy của bạn.
Những lỗi build thường gặp
Keystore thiếu, cấu hình ký vắng mặt, Gradle thất bại và các lớp bị reflection tham chiếu bị gỡ có thể ảnh hưởng tới build của Android Studio, Flutter hay React Native; hãy xem thông báo lỗi đầu tiên và xác định signing, thiết lập dependency hay release shrinking hỏng trước khi chạy lại task build.
Không tìm thấy keystore
Sai đường dẫn, tệp đã bị di chuyển, hoặc alias gõ sai. Hãy xác nhận bằng trình quản lý tệp cùng keytool -list, rồi lưu các keystore trong một thư mục cố định để đường dẫn không bao giờ lệch giữa các dự án.
Thiếu signing config
Gradle build mà không có signingConfigs, hoặc thiếu tệp properties mà nó tham chiếu. Hãy thêm cấu hình, trỏ nó vào keystore release rồi build lại. Đầu ra chưa ký do nguyên nhân này trông đầy đủ nhưng không cài ở đâu được.
Gradle build thất bại
Việc giải quyết dependency, giấy phép SDK hoặc lệch phiên bản khiến quá trình dừng trước khi đóng gói bắt đầu. Chỉ đọc lỗi đầu tiên: Gradle dừng ở nguyên nhân gốc, và mọi thứ dưới đó thường chỉ là hệ quả.
R8 gỡ nhầm mã cần thiết
Thu gọn xóa một lớp mà ứng dụng reaches qua reflection, gây crash lúc chạy trong các bản build release mà bản debug không bao giờ hiện. Hãy thêm keep rule cho các lớp bị ảnh hưởng, build lại và thử lại trên phần cứng.
Xung đột version code
Một bản build release có version code bằng hoặc thấp hơn bản đang cài sẽ được cài dạng downgrade và thất bại im lặng hoặc ồn ào tùy thiết bị. Hãy tăng versionCode cho mọi bản build được phân phối, và ghi lại mã nào đã gửi cho nhóm người thử nào.
Thiếu thành phần SDK
Một chiếc máy mới mà không có đúng bản build-tools sẽ thất bại trước khi biên dịch bất cứ thứ gì. Hãy cài đúng phiên bản platform và build-tools mà dự án nhắm tới qua SDK Manager, và giữ chúng cố định trên mọi máy trong nhóm.
Danh sách kiểm tra trước khi chia sẻ
Trước khi chia sẻ một APK release, hãy xác nhận biến thể release, chứng chỉ ký kỳ vọng, version code tăng dần, lượt cài thành công trên thiết bị đích và bản sao lưu keystore hiện hành; những kiểm tra này bắt lỗi đóng gói trước khi người nhận dựa vào tệp đó cho việc thử nghiệm hay phân phối.
Năm xác nhận
- Đã chọn biến thể release, không phải debug.
- apksigner verify nêu đúng chứng chỉ sản xuất của bạn.
- Version code vượt mọi bản build đã phân phối.
- Đã cài và khởi động một lần trên phần cứng thật.
- Đã xác nhận bản sao lưu keystore là mới nhất trước khi gửi tệp.
Hãy xuất các bản release, ký chúng bằng một keystore đã sao lưu, và xác minh trước khi chia sẻ. Khi mục tiêu là nghiên cứu một ứng dụng đã cài thay vì build một ứng dụng, hướng dẫn trích xuất tiếp quản từ đây.
Điểm chính
- Chỉ xuất bản release, ký bằng một keystore sản xuất mà bạn sao lưu hai lần.
- Flutter và React Native mỗi bên build APK release bằng một lệnh một khi đã cấu hình ký.
- Xác minh mọi đầu ra bằng apksigner và thử trên thiết bị thật trước khi phân phối.
Các câu hỏi thường gặp
APK debug và release khác nhau thế nào?
Bản debug dùng một khóa tự tạo và giữ tính năng gỡ lỗi bật, nên chỉ cài để thử nghiệm và không bao giờ được phân phối. Bản release được thu gọn, ký bằng keystore sản xuất của bạn và đại diện cho danh tính vĩnh viễn của ứng dụng. Hãy chỉ phát hành bản release, và giữ keystore được sao lưu hai lần.
Làm sao xuất APK đã ký từ Android Studio?
Mở Build, rồi Generate Signed Bundle or APK, chọn APK, chọn module của bạn và trỏ wizard tới keystore release. Chọn biến thể release, bật shrinking rồi build. Xác minh đầu ra bằng apksigner trước khi phân phối cho bất kỳ thiết bị hay người thử nào.
Keystore là gì?
Keystore là một tệp được mã hóa chứa khóa ký riêng cùng chứng chỉ của bạn, khóa bằng các mật khẩu mà bạn tự đặt. Android nhận diện ứng dụng của bạn qua khóa này trong mọi bản cập nhật mà nó từng nhận. Mất tệp đó tức là làm ứng dụng mồ côi vĩnh viễn, buộc người dùng phải cài lại dưới một danh tính mới.
Tôi có thể trích APK mà không root không?
Được. Các ứng dụng trích xuất và ADB chạm tới mọi ứng dụng bạn đã cài mà không cần root, dùng pm path để định vị gói và adb pull để sao chép. Root chỉ quan trọng với các phân vùng hệ thống mà bạn nên để yên. Toàn bộ quy trình nằm trong hướng dẫn trích xuất của chúng tôi.
Làm sao build APK trong Flutter?
Chạy flutter build apk --release từ thư mục gốc của dự án, hoặc thêm --split-per-abi để có các tệp nhỏ hơn theo từng kiến trúc. Đầu ra nằm dưới build/app/outputs/flutter-apk/. Hãy cấu hình android/key.properties với keystore release trước, nếu không build sẽ ký bằng khóa debug.
APK và AAB khác nhau thế nào?
APK cài trực tiếp trên bất kỳ thiết bị nào, còn AAB là một định dạng phát hành mà chỉ Google Play biến thành các APK riêng cho từng thiết bị. Hãy tải AAB lên cửa hàng và xuất APK cho phân phối trực tiếp, thử nghiệm và sideloading. Hướng dẫn APK so với AAB của chúng tôi so sánh cả hai con đường.
Làm sao ký một APK tôi đã build?
Hãy ký APK bằng apksigner và keystore release của bạn, rồi xác minh chứng chỉ trước khi phân phối. Android Studio có thể ký trong lúc chạy wizard hoặc qua signingConfigs của Gradle khi đã cấu hình. Hãy xác nhận cả loại build lẫn mã phiên bản, vì riêng chữ ký hợp lệ không làm một bản debug sẵn sàng cho người dùng.
R8 shrinking là gì?
R8 là công cụ thu gọn và obfuscation mã của Android: nó gỡ các lớp và phương thức không dùng, rồi đổi tên phần còn lại. Bản release bật nó để giảm dung lượng và làm chậm việc reverse-engineering tùy tiện. Hãy thử các bản đã thu gọn trên thiết bị thật, vì thu gọn mạnh thỉnh thoảng gỡ cả mã mà ứng dụng cần.
Làm sao xác minh APK đã ký đúng?
Chạy apksigner verify --print-certs trên tệp và xác nhận nó nêu đúng chứng chỉ của bạn, không kèm lỗi nào. Verify qua nghĩa là gói còn nguyên vẹn và cài được. Verify fail nghĩa là bản build, khóa hay lượt chuyển tệp cần được xem lại trước khi phát hành bất cứ thứ gì.
Tôi có thể build APK miễn phí không?
Được. Android Studio, SDK build tools, Flutter và React Native đều miễn phí, và ký bằng keystore của riêng bạn không tốn phí. Chi phí thật duy nhất là một chiếc máy chạy được IDE và kỷ luật sao lưu keystore hai lần.