Dear các mọi người,
Ở bài viết này mình xin phép được chia sẻ góc nhìn và kiến thức mà mình tìm hiểu được và mình thấy đây là xu hướng mới để cải tiến các sản phẩm mobile app. Nếu có gì chưa đúng thì nhờ mọi người góp ý ạ. (Ở đây mình lấy bài toán ví dụ là trong công ty có rất nhiều app nội bộ khác nhau cho nhân viên)
[Đề bài]
- Dự án nội bộ Thực trạng hiện tại ở công ty lớn có rất nhiều các ứng dụng nội bộ (Ví dụ: Sale, KPI, Marketing...) khiến cho cán bộ nhân viên phải tải rất nhiều ứng dụng khác nhau để sử dụng trong công việc vì một ứng dụng chỉ hỗ trợ 1 nhóm công việc nhất định. Tạo ra 1 ứng dụng base chứa tất cả các sản phẩm/ứng dụng dưới dạng sub module.
- Dự án dành cho khách hàng Ứng dụng Customer Management app có chức năng phân quyền nên 1 số chức năng sẽ không active với 1 nhóm user nhưng với cơ chế hiện tại thì toàn bộ source code/resource (image, string ...) vẫn được tải sẵn trong app dù không được dùng đến. Hay đơn giản đợt tới Funny App sẽ được tích hợp vào Customer Management app dưới dạng sub module cũng sẽ làm Customer Management app tăng size ứng dụng.
[Mục tiêu]
Tạo ra 1 ứng dụng All In One (với Dự án nội bộ), giảm dung lượng tải xuống của ứng dụng khi cài đặt app trên store
[Khó khăn]
- Size mỗi ứng dụng cơ bản đã lớn (Android: ~35-70MB/ứng dụng, iOS: ~100-150Mb), nếu triển khai all in one app theo cách thông thường (thêm trực tiếp theo dạng module import vào base) thì dung lượng ứng dụng base sẽ tăng lên gần tương đương với mỗi module được thêm vào app base.
[Giải pháp]
Một số Big app (Momo, Zalo, VinID...) ngoài 1 số tính năng cơ bản thì nó chứa rất nhiều các tính năng nâng cao (mỗi tính năng tương đương 1 sub module và hoạt động độc lập) với đồ họa, animation... mà nó vẫn sở hữu dung lượng app chấp nhận được với một ứng dụng mobile cho lần cài đặt đầu tiên.
- Zalo: Android ~ 21Mb, iOS ~150Mb
- Momo: Android ~ 90Mb, iOS ~164Mb
- VinID: Android ~ 60Mb, iOS ~221Mb
1. Android Native
- Dynamic Feature ModulesNăm 2018 tại sự kiện Google I/O, Google đã giới thiệu định dạng cài đặt mới là Android App Bundle(.aab) để người dùng sẽ chỉ cần tải xuống phần tài nguyên mà họ cần (ví dụ tải xuống 1 trong các loại định dạng ảnh sau: mhdpi, xhdpi, xxhdpi ...) để chạy ứng dụng trên thiết bị của mình.Nhưng bản thân nó vẫn tải xuống tất cả tài nguyên thuộc định dạng máy bạn mà không cần thiết ngay từ đầu nên về cơ bản size ứng dụng vẫn lớn.Google có giới thiệu "dynamic feature modules" để người dùng có thể tải xuống các tính năng/modules khi cần nên nó sẽ có thể làm giảm size app khi người dùng tải app lần đầu.Dynamic Delivery Split APKs về cơ bản nó sẽ giống các apk bình thường (bao gồm các mã code, tài nguyên, dữ liệu ...) và nó sẽ chỉ tải về khi dùng đến và tránh phải tải xuống tài nguyên thừa không dùng đến.
Base APK là apk chứa code và resource chung mà tất cả các split apk khác có thể truy cập được và cung cấp các chức năng cơ bản cho ứng dụng. Khi người dùng cài đặt thì BaseApk sẽ được cài đặt đầu tiên bởi vi nó sẽ khai báo đầy đủ về các service, content-providers, permission, platform version, dependencies...Configuration APKs là nơi chứa native library và resource cho mỗi độ phân giải của màn hình, CPU architecture, language. Mỗi Config Apk sẽ phụ thuộc của một Base Apk hoặc Dynamic Future APK và nó sẽ được tải và cài đặt cùng với Future APK mà chúng phụ thuộc Dynamic Feature APKs là Apk chứa code và resource cho mỗi chức năng của app mà nó không phải bắt buộc cho lần đầu cài đặt ứng dụng. Nó sử dụng Play Core Library để có thể cài đặt các Feature Dynamic Apk vào sau khi khi Base Apk được cài đặt.
Chú ý:
- Dynamic Feature Modules chỉ hỗ trợ từ Android 4.4 (API 19) trở lên
- Khi chỉ cập nhật 1 Dynamic Feature Module thì chúng ta vẫn phải tải lên Google Store lại toàn bộ source code (bao gồm Base và các Dynamic Feature) để Google có thể check được khả năng tương thích giữa các module với nhau. (Hy vọng trong tương lai Google có thể phát triển việc update Dynamic Feature mà không cần phải cập nhật lại app). Nhưng khi user thực hiện update app thì Play Store sẽ quyết định những thứ mà người dùng sẽ tải về thông qua delta updates của Google nên việc tại về cũng sẽ được tối ưu
Tài liệu: https://developer.android.com/guide/playcore/feature-delivery?hl=vi https://medium.com/mindorks/dynamic-feature-modules-the-future-4bee124c0f1
2. iOS Native
Dường như iOS cũng có phương pháp (On Demand Resource) tương tự để giảm dung lượng của ứng dụng xuống, nhưng điểm khác biệt là On Demand Resource chỉ chia sẻ data, resource chứ không chia sẻ code.
Với mỗi level thì app mới tải xuống các resource cần thiết. Dù hơi ít nhưng dường như thế là cũng đủ để chúng ta đạt được mục đích giảm dung lượng của ứng dụng xuống.
3. Flutter
Flutter có khả năng xây dựng các ứng dụng có thể tải xuống các nội dung và code Dart bổ sung khi chạy. Điều này cho phép các ứng dụng giảm kích thước apk cài đặt và tải xuống các tính năng cũng như nội dung khi người dùng cần. Mình thấy nó chỉ mới có guide cho Android và cơ chế của nó cũng giống Dynamic Feature Modules trên Android Native và chưa thấy có tài liệu cho iOS Native