Bài viết này mình sẽ chia sẻ cách sử dụng và cấu hình Android App Bundle và Dynamic Feature để chia nhỏ ứng dụng thành nhiều module. Từ đó, ứng dụng vẫn có trải nghiệm tốt với kích thước APK nhỏ đi đáng kể
Nội dung chính của bài viết
Tại sao cần đến Android App Bundle và Dynamic Feature?
Việc tạo ra một ứng dụng có thể hiển thị đẹp trên toàn bộ các thiết bị của Android là một thách thức vô cùng lớn cho nhà phát triển.
Có một giải pháp đó là tách mã nguồn ra thành nhiều phần để tương thích với từng loại thiết bị. Đơn giản như việc để resource vào nhiều thư mục khác nhau như: drawable-xxxhdpi, drawable-hdpi…
Điều này vô tình làm cho kích thước file apk ngày càng phình to khi bạn càng muốn hỗ trợ nhiều thiết bị hơn.
Nếu bạn đã tìm hiểu về tối ưu ASO thì bạn sẽ hiểu tầm quan trọng của kích thước APK. Kích thước file APK cứ tăng thêm 6MB, thì tỉ lệ chuyển đổi cài đặt sẽ giảm 1%. Quá khủng khiếp phải không?
Hiểu được điều này, Google đã cho ra đời hai tính năng quan trọng: Android App Bundle và Dynamic Feature nhằm giúp bạn có thể giảm kích thước APK
Android App Bundle là gì?
Trước đây, để publish một ứng dụng Android, bạn có hai lựa chọn:
- Một là, tạo một file APK duy nhất cùng với tất cả code và resource cho tất cả các loại device Android khác nhau
- Hai là, tạo ra multi-APKs nhắm đến các cấu hình máy riêng biệt. Mỗi APK là một phiên bản đầy đủ.
Giờ đây, bạn có thêm một lựa chọn thứ 3. Đó là: publish 1 gói ứng dụng Android (.aab) và phần còn lại cứ để Google Play!
Một khi bạn tải file .aab lên, Google Play sẽ dùng nó để tiến hành các bước sau đây:
- Tạo Base APK: File này chứa tất cả các code và tài nguyên cần thiết cho việc chạy các chức năng cơ bản của ứng dụng. Bất cứ khi nào người dùng tải ứng dụng, Base APK sẽ là được tải đầu tiên, và các APK tiếp theo chỉ việc hoạt động dựa trên Base APK này.
- Tạo Configuration APK(s): Sau khi người dùng tải ứng dụng về, Google Play sẽ sử dụng dịch vụ phân phối động (Dynamic Delivery) để phân phối APK có cấu hình phù hợp với cấu hình thiết bị người dùng.
Thường thì, một ứng dụng có một hoặc thậm chí là nhiều tính năng không cần thiết cho việc chạy các chức năng chính. Chẳng hạn, bạn phát triển ứng dụng nhắn tin, nhưng không phải tất cả người dùng đều có nhu cầu sử dụng tính năng ảnh GIFs hay emojis.
Khi bạn xây dựng App Bundle, bạn có thể giảm kích thước file APK bằng việc phân tách những tính năng thành những module để người dùng có thể download tùy theo nhu cầu.
Nếu người dùng yêu cầu một module nào đó, dịch vụ phân phối động Dynamic Delivery sẽ phân phối đến máy người dùng file APK mà chứa chỉ code và resource để chạy tính năng đó thôi.
Quá vi diệu phải không?
Tại sao nên sử dụng App Bundle để publish ứng dụng?
Điểm cộng lớn nhất của Android App Bundles chính là khả năng giảm kích thước file APK.
Nếu trước đây bạn sử dụng cách thức tạo multi-APKs. Vậy thì App Bundle sẽ giúp bạn đơn giản hóa quy trình phát triển và phát hành ứng dụng.
Công việc của bạn bây giờ chỉ là build một file .aab và mọi việc còn lại cứ để Google Play!
Tuy nhiên, có một vài giới hạn sau đây.
Thứ nhất, APKs được tạo ra từ App Bundle chỉ được dung lượng tối đa là 100MB.
Thêm vào đó, các thiết bị chạy trên nền tảng Android 4.4 hoặc thấp hơn không hỗ trợ. Do vậy Google Play chỉ có thể cung cấp App Bundle của bạn dưới dạng multi-APKs.
Mặc dù Multi-APKs này đã được tối ưu cho các độ phân giải màn hình và ABIs khác nhau. Nhưng chúng vẫn sẽ chứa resources và code cho từng loại ngôn ngữ mà ứng dụng hỗ trợ.
Do vậy, người dùng Android 4.4 trở về trước sẽ không tiết kiệm được nhiều dung lượng cho lắm
Hướng dẫn tạo ứng dụng hỗ trợ Android App Bundle
Bạn có thể publish một ứng dụng đã có dưới dạng App Bundle. Nhưng để đơn giản, mình sẽ tạo một dự án hoàn toàn mới, Sau đó xây dựng nó để hỗ trợ App Bundle.
Để chỉ định Goole Play Console biết chính xác những file APKs phải tạo. Hãy mở project của bạn lên, trong file build.gradle thêm khối lệnh bundle{}
android { compileSdkVersion 28 defaultConfig { applicationId "com.jessicathornsby.androidappbundle" minSdkVersion 24 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } bundle { //To do// } }
Trong khối bundle, bạn chỉ đơn giản là bật/tắt những tính năng để Google Play biết mà tạo những APK cụ thể hỗ trợ
android { compileSdkVersion 28 defaultConfig { applicationId "com.jessicathornsby.androidappbundle" minSdkVersion 24 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } bundle { //Generate APKs for devices with different screen densities// density { enableSplit true } //Generate APKs for devices with different CPU architectures// abi { enableSplit true //Create a split APK for each language// } language { enableSplit true }
Cách testing Android App Bundle
Để test ứng dụng, bạn có thể chọn cách sử dụng universal APK hay một APK từ Bundle
Để deploy một APK từ App Bundle, bạn làm như sau:
- Trong Android Studio, bạn chọn Run > Edit Configurations… trên thanh toolbar
- Chọn Deploy option, sau đó chọn APK from app bundle.
- Cuối cùng nhấn nút Apply
Thêm tính năng on-demand bằng cách sử dụng Dynamic Delivery
Mặc dù đến bước này, bạn hoàn toàn có thể build được ra App Bundle. Nhưng mình muốn giới thiệu cho các bạn một tính năng rất hay ho đó là: Dynamic Delivery, để có thể tạo module cho app.
Để tạo dynamic module, bạn làm như sau
- Vẫn trong Android Studio, bạn chọn File > New > New Module…
- Bạn tìm đến Dynamic Feature Module, rồi click nút Next.
- Sau đó mở Base application module, chọn app.
- Tên của module là dynamic_feature_one, rồi click nút Next.
- Để có thể tạo module hỗ trợ on-demand, bạn cần phải bật tính năng này bằng cách tick vào checkbox: Enable on-demand. Nếu ứng dụng của bạn hỗ trợ Android 4.4 trở về trước thì bạn cũng cần phải bật cả Fusing.
- Tiếp theo thì bạn điền title cho module. Ví dụ này mình điền là Dynamic Feature One.
- Cuối cùng click Finish.
Tìm hiểu tính năng Dynamic Feature Module
Sau khi bạn đã hoàn thành tạo module ở bước trên. Giờ bạn có thêm class, layout và các assets khác như ảnh, font…vào dynamic feature module vừa tạo.
Tuy nhiên, Dynamic Feature Module có một vài điểm khác biệt so các loại module. Bạn có thể kiểm tra build.gradle hay Manifest file để thấy sự khác biệt rõ nhất.
#1. Tệp Manifest của Dynamic Feature Module
Cũng giống như phone/tablet module, manifest của Dynamic Feature Module sẽ định nghĩa những đặc điểm, thuộc tính của cả module.
Bạn có thể thấy các thẻ XML trong manifest có đôi chút khác biệt so với manifest mà bạn hay gặp đúng không?
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dist="http://schemas.android.com/apk/distribution" package="com.jessicathornsby.dynamic_feature_one"> <dist:module //Whether the module should be available as an on-demand download// dist:onDemand="true" //The module’s user-facing title// dist:title="@string/title_dynamic_feature_one"> //Whether to include this module in multi-APKs targeting Android 4.4 and earlier// <dist:fusing dist:include="true" /> </dist:module> </manifest>
#2. Tệp build.gradle
Sự khác biệt duy nhất là bạn sử dụng plugin dynamic-feature. Đây là plugin có tất cả những Gradle task cần thiết để build một App Bundle, trong đó có dynamic feature module.
Ngoài ra, bạn cũng cần lưu ý là tệp build.gradle nên khai báo “app” module như là dependency
Bạn có thể tham khảo một tệp build.gradle mẫu như bên dưới:
apply plugin: 'com.android.dynamic-feature' android { compileSdkVersion 28 defaultConfig { minSdkVersion 24 targetSdkVersion 28 versionCode 1 versionName "1.0" } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':app') }
#3. Manifest của Base feature module
Mỗi khi bạn tạo một dynamic feature module mới, Android Studio sẽ tự động update vào file build.gradle để link đến dynamic featute module đó.
dynamicFeatures = [":dynamic_feature_one"] }
Hướng dẫn cách Requesting features khi chạy ứng dụng
Mỗi khi bạn tạo một dynamic feature module, bạn sẽ cần phải thông báo cho người dùng biết cách để yêu cầu gọi đến module đó.
Mình lấy ví dụ, bạn xây dựng một ứng dụng giảm cân. Khi người dùng chọn “Advanced exercises” menu. Tại đây, người dùng có thể được gọi ý để tải “Advanced exercises” module từ google play store về.
Để request một module, bạn cần sử dụng Google Play Core library.
Đơn giản là bạn thêm 'com.google.android.play:core'
vào build.gradle của base feature module như bên dưới.
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' //Add the following// implementation 'com.google.android.play:core:1.3.5'
Tiếp theo, mở Activity hay Fragment mà bạn muốn tải dynamic feature module.
Như ví dụ này mình muốn load ở MainActivity
splitInstallManager = SplitInstallManagerFactory.create(getApplicationContext()); } SplitInstallRequest request = SplitInstallRequest .newBuilder() .addModule("dynamic_feature_one") .addModule("dynamic_feature_two") .build();
Một ứng dụng có thể có nhiều module. Vì vậy, bạn vần phải định nghĩa rõ cụ thể module nào muốn download. Một request cũng có thể download nhiều module cùng một lúc cũng được, không sao cả.
splitInstallManager .startInstall(request)
Cuối cùng thì bạn cần xử lý khi download module thành công hay thất bại.
.addOnSuccessListener(new OnSuccessListener<Integer>() { @Override //If the module is downloaded successfully...// public void onSuccess(Integer integer) { //...then do something// } }) .addOnFailureListener(new OnFailureListener() { @Override //If the module isn’t downloaded successfully….// public void onFailure(Exception e) { //...then do something// } }); } }
Mỗi khi bạn update App Bundle lên phiên bản mới, Google Play sẽ tự động update tất cả những APKs cần thiết, kể cả APKs cho dynamic feature module.
Quá trình update này hoàn toàn tự động, một khi module đã được người dùng cài đặt thì bạn sẽ không cần phải quan tâm đến việc update cho từng module.
Bật tính năng truy cập tức thì tới Dynamic Feature Modules
Mặc định, người dùng sẽ cần phải khởi động lại ứng dụng trước khi có thể truy cập vào module vừa cài đặt.
Tuy nhiên, bạn có thể bật tính năng truy cập tức thì bằng cách thêm SplitCompatApplication vào trong manifest của “App” module
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jessicathornsby.androidappbundle"> <application //Add the following// android:name="com.google.android.play.core.splitcompat.SplitCompatApplication"
Hướng dẫn publish Android App Bundle lên Google Play
Sau tất cả, bạn đã hoàn thành việc phát triển, testing kĩ càng module cho ứng dụng. Giờ là lúc bạn publish module đó lên market.
Cũng giống như cách bạn release APK để đưa lên Google Play, bạn cũng cần phải build một phiên bản với key cho App Bundle
Từ Android Studio:
- Chọn Build > Generate Signed Bundle/APK
- Nhớ check vào box: Android App Bundle
- Màn hình tiếp theo, bạn chọn app
- Điện keystore, alias vaf password, sau đó click vào Next.
- Chọn thư mục Destination folder.
- Chọn kiểu build là Release.
- Cuối cùng nhấn Finish và tận hưởng thành quả
Android Studio sẽ generate ra App Bundle và lưu tại thư mục AndroidAppBundle/app/release.
Tải Android App Bundle lên Google play console
Đăng nhập vào Google play console. Chọn Create Application -> Create -> Save
Sau đó, từ menu bên trái, bạn chọn App releases và làm theo hướng dẫn của Google Play console
Cũng giống như APK thông thường, Google play hỗ trợ nhiều phiên bản test như alpha, beta trước khi chính thức ra thị trường.
Tổng kết
Bài viết này khá dài phải không? Hi vọng những chia sẻ trong bài viết này sẽ giúp các bạn sử dụng Android App Bundles để triển khai ứng dụng tối ưu nhất.
Bạn nghĩ sao về cách thức phát hành ứng dụng dạng module như thế nào? Mình rất muốn nghe ý kiến của các bạn
Nều thấy bài viết hay thì đừng ngại chia sẻ cho người khác cũng đọc nhé
Mình cũng đang viết về App bundle và Dynamic delivery trong Android
http ở đây, mong dk trao đổi vs các bạn:
https://viblo.asia/p/app-bundle-va-dynamic-delivery-trong-android-bJzKmwOYl9N