+11

Cơ bản về Android App Bundle

1. Giới thiệu

Android App Bundle là định dạng format upload mới lên Google Play. Android App Bundle gồm tất cả source code và resource nhưng chưa tạo thành APK và chưa được ký bởi keystore.

Model để đóng gói cho Google Play mới này được gọi là Dynamic Delivery . Dynamic Delivery sẽ sử dụng app bundle nhận được rồi sẽ tạo và tối ưu lại APK phù hợp với mỗi device android. Người dùng lúc này chỉ cần tải source code và resource cần thiết để chạy app.

Lúc này developer sẽ không cần phải build, ký app và quản lý các loại devices khác nhau; người dùng sẽ nhận được app với dung lượng nhỏ hơn và tối ưu hơn.

Ngoài ra, bạn có thể thêm Dynamic Feature Modules vào project và thêm trong app bundle. Modules này sẽ giúp bạn quyết định phần nào không được thêm vào khi người dùng mới cài lần đầu. Sử dụng Play Core Library giúp ứng dụng có thể tải những module cần thiết về devices thông qua Dynamic Delivery.

2. Cài đặt

Điều kiện tiên quyết để build ra app bundle thì phải sử dụng Android Studio 3.2 trở lên.

Sau đó bạn tạo project Android bình thường. Kết quả là khi chạy lên sẽ hiển thị "Hello, World!" trên màn hình.

Đối với Android Studio 3.2 trở lên sẽ có 2 chế độ build như sau:

  • Đối với Build APK thì bạn đã biết. Tất cả source code và resource sẽ được đóng gói thành 1 file apk. Và tất nhiên sẽ được ký bởi keystore của bạn.
  • Đối với Build Bundle thì sẽ xuất ra file dưới định dạng .aab (Android App Bundle) trong app > build > outputs > bundle > debug > app.aab

Khi bạn upload file .aab này lên Google Play thì google play sẽ chỉ cài resource apk tương ứng với devices đó.

Resource tương ứng gồm:

  • Chỉ chứa res values theo locale: Ví dụ người dùng để ngôn ngữ mặc định là Japanese thì sẽ chỉ lấy values-jp.
  • Chỉ chứa assets theo density của devices: Ví dụ màn hình thuộc loại xxxhdpi thì chỉ có drawable-xxxhdpi sẽ được cài lên máy.
  • Nếu module có hỗ trợ kiến trúc CPU x86 và ARM thì khi cài lên device sẽ chỉ cài những thư viện theo kiến trúc CPU trên devices đó.

Chỉ định resource được phân tách

Mở app/build.gradle và thêm đoạn sau vào android {}

bundle {
   language {
       enableSplit = true
   }
   density {
       enableSplit = true
   }
   abi {
       enableSplit = true
   }
}

Chú ý: mặc định tất cả giá trị đều được gán true. Nên đoạn này sẽ không cần thiết nếu không có thay đổi gì.

Dynamic Delivery phân chia APK như thế nào ?

Về Dynamic Delivery sẽ chỉ hoạt động đối với Android 5.0 (API 21) trở lên. Dynamic Delivery sẽ giúp Google Play chia các loại apk tương ứng để phù hợp với từng devices của người dùng.

Khi chia ra như vậy sẽ được phân loại dưới 3 hình thức sau:

Base APK

Sẽ chứa code và resource mà các apk được phân tách khác cũng có thể truy cập và cung cấp các function cơ bản để sử dụng. Khi user tải app về thì loại apk này sẽ luôn được tải về máy.

Configuration APKs

Chỉ bao gồm các thư viện và tài nguyên chuyên biệt cho từng loại devices:

  • Locale
  • Screen density
  • CPU architecture

Dynamic feature APKs

Đây là những thành phần không bắt buộc khi cài app lần đầu tiên nhưng cũng có thể sẽ được tải và cài đặt sau.

Đối với Android 4.4 (API 19) trở xuống

Vì Android 4.4 trở xuống không được hỗ trợ App Bundle, nên Google Play sẽ đóng gói tất cả source code và resource vào trong 1 apk. Cách này về đúng phương thức truyền thống từ trước đến nay.

Do Android dưới 4.4 sẽ tải tất cả về 1 lần nên đối với Dynamic Features Modules cũng sẽ được tải cùng luôn (còn Android 5.0 trở lên thì Dynamic Features Modules tải lúc sau cũng được) . Nên bạn cần phải quan tâm đến 1 vài config theo link sau để có thể support tốt nhất Dynamic feature modules

3. Cấu trúc Android App Bundle (.aab)

Trong hình dưới đây, những phần màu xanh dương (drawable, values, lib) là phần để cho Google Play tạo config cho APK đối với mỗi modules.

Chi tiết bạn hãy đọc trong: https://developer.android.com/guide/app-bundle/#aab_format

4. Chạy thử Android App Bundle

Android App Bundle phục vụ cho Google Play đóng gói apk tốt hơn. Vậy nên cách đơn giản nhất để kiểm thử là upload file .aab lên Play Console để thử nghiệm.

Nhưng vẫn còn cách khác để bạn kiểm thử là dùng bundletool

Sử dụng bundletool

Các bạn tải file jar trong link sau https://github.com/google/bundletool/releases Hiện tại version mới nhất là 0.9.0. Và tất nhân máy bạn đã phải cài java rồi thì mới chạy được file jar

Sau khi tải xong bạn sẽ được file bundletool-all-0.9.0.jar.

Cú pháp để build 1 file .aab thành .apks như sau: (lưu ý apks chứ không phải là apk nhé 😃 )

bundletool build-apks --bundle=<path to .aab> --output=<out.apks>

Lưu ý: các lệnh terminal dưới đây mình đang thực hiện trên macos. Vậy nên trên hệ điều hành khác sẽ có khác đôi chút.

Bước 1: Build file .aab

Các bạn vào Android Studio để build ra file .aab

và folder sẽ là

./app/build/outputs/bundle/debug/app.aab

Bước 2: build .aab thành .apks

java -jar bundletool-all-0.9.0.jar build-apks --bundle=MyApplication/app/build/outputs/bundle/debug/app.aab --output=out.apks

Lúc này bạn sẽ được file out.apks

Bước 3: Giải nén file .apks thành apk

Tạo folder để chứa tệp tin giải nén

mkdir apks

Giải nén file apks vào thư mục apks:

unzip out.apks -d apks

Kết quả chạy sẽ được như sau:

Archive:  out.apks
 extracting: apks/splits/base-hdpi.apk  
 extracting: apks/splits/base-ldpi.apk  
 extracting: apks/splits/base-mdpi.apk  
 extracting: apks/splits/base-xhdpi.apk  
 extracting: apks/splits/base-xxhdpi.apk  
 extracting: apks/splits/base-xxxhdpi.apk  
 extracting: apks/splits/base-da.apk  
 extracting: apks/splits/base-ca.apk  
 extracting: apks/splits/base-tvdpi.apk  
 extracting: apks/splits/base-ka.apk  
 extracting: apks/splits/base-fa.apk  
 extracting: apks/splits/base-ja.apk  
 extracting: apks/splits/base-nb.apk  
 extracting: apks/splits/base-ta.apk  
 extracting: apks/splits/base-pa.apk  
 extracting: apks/splits/base-be.apk  
 extracting: apks/splits/base-de.apk  
 extracting: apks/splits/base-ne.apk  
 extracting: apks/splits/base-te.apk  
 extracting: apks/splits/base-af.apk  
 extracting: apks/splits/base-bg.apk  
 extracting: apks/splits/base-fi.apk  
 extracting: apks/splits/base-hi.apk  
 extracting: apks/splits/base-th.apk  
 extracting: apks/splits/base-si.apk  
 extracting: apks/splits/base-kk.apk  
 extracting: apks/splits/base-vi.apk  
 extracting: apks/splits/base-sk.apk  
 extracting: apks/splits/base-mk.apk  
 extracting: apks/splits/base-uk.apk  
 extracting: apks/splits/base-ml.apk  
 extracting: apks/splits/base-gl.apk  
 extracting: apks/splits/base-el.apk  
 extracting: apks/splits/base-nl.apk  
 extracting: apks/splits/base-pl.apk  
 extracting: apks/splits/base-sl.apk  
 extracting: apks/splits/base-am.apk  
 extracting: apks/splits/base-km.apk  
 extracting: apks/splits/base-tl.apk  
 extracting: apks/splits/base-kn.apk  
 extracting: apks/splits/base-in.apk  
 extracting: apks/splits/base-bn.apk  
 extracting: apks/splits/base-lo.apk  
 extracting: apks/splits/base-ko.apk  
 extracting: apks/splits/base-mn.apk  
 extracting: apks/splits/base-ro.apk  
 extracting: apks/splits/base-sq.apk  
 extracting: apks/splits/base-ar.apk  
 extracting: apks/splits/base-mr.apk  
 extracting: apks/splits/base-hr.apk  
 extracting: apks/splits/base-fr.apk  
 extracting: apks/splits/base-tr.apk  
 extracting: apks/splits/base-or.apk  
 extracting: apks/splits/base-sr.apk  
 extracting: apks/splits/base-as.apk  
 extracting: apks/splits/base-ur.apk  
 extracting: apks/splits/base-bs.apk  
 extracting: apks/splits/base-cs.apk  
 extracting: apks/splits/base-es.apk  
 extracting: apks/splits/base-is.apk  
 extracting: apks/splits/base-ms.apk  
 extracting: apks/splits/base-et.apk  
 extracting: apks/splits/base-it.apk  
 extracting: apks/splits/base-lt.apk  
 extracting: apks/splits/base-pt.apk  
 extracting: apks/splits/base-eu.apk  
 extracting: apks/splits/base-gu.apk  
 extracting: apks/splits/base-ru.apk  
 extracting: apks/splits/base-lv.apk  
 extracting: apks/splits/base-hu.apk  
 extracting: apks/splits/base-zu.apk  
 extracting: apks/splits/base-sv.apk  
 extracting: apks/splits/base-iw.apk  
 extracting: apks/splits/base-sw.apk  
 extracting: apks/splits/base-hy.apk  
 extracting: apks/splits/base-ky.apk  
 extracting: apks/splits/base-my.apk  
 extracting: apks/splits/base-uz.apk  
 extracting: apks/splits/base-az.apk  
 extracting: apks/splits/base-en.apk  
 extracting: apks/splits/dynamic_feature-ldpi.apk  
 extracting: apks/splits/base-zh.apk  
 extracting: apks/splits/dynamic_feature-mdpi.apk  
 extracting: apks/splits/dynamic_feature-hdpi.apk  
 extracting: apks/splits/dynamic_feature-xhdpi.apk  
 extracting: apks/splits/dynamic_feature-xxxhdpi.apk  
 extracting: apks/splits/dynamic_feature-xxhdpi.apk  
 extracting: apks/splits/dynamic_feature-tvdpi.apk  
 extracting: apks/splits/dynamic_feature-master.apk  
 extracting: apks/splits/base-master.apk  
  inflating: apks/toc.pb             

Trong thư mục apks sẽ như sau:

Trong đó:

  • splits là thư mục chứa apk được giản nén
  • toc.pb (*.pb viết tắt của từ Module Protocol Buffer): để định nghĩa các cấu hình riêng tương ứng với apk nào trong thư mục splits

5. Kết luận

Đến đây bạn đã hiểu cơ bản thế nào là Android App Bundle. Để hiểu rõ hơn về cách tạo Dynamic Feature bạn hãy tham khảo trong ví dụ theo link:

https://github.com/googlesamples/android-dynamic-features

Chúc các bạn thành công !

Tài liệu tham khảo

  1. https://developer.android.com/guide/app-bundle/#get_started
  2. https://developer.android.com/guide/app-bundle/#playcore
  3. https://github.com/googlesamples/android-dynamic-features
  4. https://developer.android.com/studio/projects/dynamic-delivery#top_of_page
  5. https://github.com/google/bundletool
  6. https://codelabs.developers.google.com/codelabs/your-first-dynamic-app/index.html?index=..%2F..index#0

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí