App Size Optimization — tập hợp các kỹ thuật nhằm giảm kích thước tệp cài đặt (APK, AAB, IPA) mà không làm mất chức năng. Theo Android Reduce APK Size Guide, mỗi megabyte giảm kích thước có thể tăng tỷ lệ chuyển đổi cài đặt lên 1–2% ở các khu vực có internet chậm. App Thinning — công nghệ chủ chốt của Apple chỉ cung cấp những tài nguyên mà một thiết bị cụ thể cần.
Những điểm chính
App Size Optimization là một lĩnh vực trong phát triển di động nhằm giảm thiểu kích thước gói cài đặt ứng dụng. Nó bao gồm loại bỏ mã nguồn và tài nguyên chết, nén hình ảnh, tối ưu hóa thư viện, phân chia bản dựng cho các kiến trúc khác nhau và sử dụng công nghệ phân phối theo yêu cầu.
Kích thước ứng dụng ảnh hưởng không đồng đều đến các phân khúc người dùng khác nhau. Ở các khu vực có cơ sở hạ tầng di động phát triển (Mỹ, Châu Âu, Nhật Bản), sự khác biệt giữa 50 và 100 MB có thể không đáng kể. Ở các khu vực đang phát triển (Ấn Độ, Indonesia, Brazil), mỗi megabyte thừa đều làm giảm tỷ lệ chuyển đổi cài đặt do giới hạn gói dữ liệu và tốc độ internet di động. Google Play giới hạn kích thước APK ở mức 200 MB, nhưng khuyến nghị giữ dưới 100 MB.
Đối với iOS App Store, kích thước tải xuống tối đa qua mạng di động là 200 MB (trước năm 2023 là 150 MB). Nếu IPA vượt quá giới hạn này, người dùng chỉ có thể cài đặt ứng dụng qua Wi-Fi. Apple cũng hỗ trợ App Thinning, bao gồm Slicing, Bitcode và On-Demand Resources — các công nghệ tự động giảm kích thước cài đặt trên một thiết bị cụ thể mà không cần sự can thiệp của nhà phát triển.
Kích thước ứng dụng không chỉ ảnh hưởng đến tỷ lệ chuyển đổi cài đặt mà còn ảnh hưởng đến tỷ lệ giữ chân người dùng, tần suất cập nhật và tốc độ khởi chạy đầu tiên. Mỗi megabyte thừa là một rào cản giữa người dùng và việc sử dụng sản phẩm của bạn.
Theo dữ liệu từ Google I/O 2024, giảm APK 10 MB làm tăng tỷ lệ chuyển đổi cài đặt trung bình 3,5%. Đối với các ứng dụng có kích thước 150+ MB, tỷ lệ chuyển đổi có thể thấp hơn 20–30% so với các ứng dụng cùng loại có kích thước 50 MB. Hiệu ứng này đặc biệt rõ rệt trên Google Play, nơi người dùng nhìn thấy kích thước trước khi cài đặt. Trên App Store, kích thước được hiển thị trên trang ứng dụng và người dùng có gói dữ liệu hạn chế trì hoãn cài đặt sang Wi-Fi, sau đó thường quên mất ứng dụng.
Các ứng dụng lớn ít được cập nhật OTA hơn — người dùng trì hoãn tải xuống bản vá sang Wi-Fi, bỏ lỡ các bản sửa lỗi bảo mật quan trọng. Google Play cho phép Incremental Updates (bản vá lên tới 10 MB), nhưng việc cài đặt lại hoàn toàn vẫn tải xuống toàn bộ APK hoặc AAB. Apple App Store sử dụng Delta Updates, chỉ truyền các tệp đã thay đổi, nhưng ngay cả delta cũng có thể đáng kể khi tài nguyên thay đổi.
Kích thước ảnh hưởng trực tiếp đến thời gian khởi chạy đầu tiên: ứng dụng phải giải nén tài nguyên, biên dịch mã nguồn (Android) hoặc ký bộ nhớ đệm (iOS). Một ứng dụng 200 MB có thể khởi chạy chậm hơn 10–15 giây so với ứng dụng 50 MB trên một thiết bị trung bình. Điều này làm xấu đi Trải nghiệm khởi tạo — người dùng có thể đóng ứng dụng mà không chờ nó tải xong.
| Kích thước | Thời gian tải (3G) | Thời gian khởi chạy đầu tiên |
|---|---|---|
| 30 MB | ~20 giây | 3–5 giây |
| 100 MB | ~70 giây | 5–8 giây |
| 200 MB | ~140 giây | 10–15 giây |
Tài nguyên — hình ảnh, phông chữ, âm thanh, video — chiếm 60–80% kích thước của một ứng dụng di động điển hình. Tối ưu hóa tài nguyên mang lại lợi ích lớn nhất với công sức tối thiểu. Các hướng chính là: nén, loại bỏ trùng lặp và tài sản không dùng, chọn định dạng phù hợp.
WebP — định dạng hình ảnh từ Google cung cấp khả năng nén tốt hơn 25–35% so với PNG và 15–20% tốt hơn so với JPEG ở cùng chất lượng hình ảnh. Android hỗ trợ WebP gốc từ API 18. Đối với iOS, WebP được hỗ trợ qua thư viện SDWebImage hoặc Kingfisher, và từ iOS 17 đã có hỗ trợ gốc. AVIF — định dạng hiện đại hơn giúp tiết kiệm thêm 10–15% so với WebP, nhưng giải mã chậm hơn.
Loại bỏ tài nguyên không dùng — cách đơn giản nhất để giảm kích thước. Trên Android, sử dụng tính năng tái cấu trúc với Android Studio: Analyze → Run Inspection → Unused Resources. Trên iOS — Build Settings → Remove Unused Resources. Thường thì trong dự án còn sót lại sprite từ các phiên bản trước, biểu tượng cũ, hình ảnh màn hình khởi động không dùng làm phình to kích thước mà không có tải trọng chức năng nào.
| Định dạng | Nén so với PNG | Hỗ trợ |
|---|---|---|
| PNG | — | Tất cả nền tảng |
| WebP | 25–35% | Android gốc, iOS qua thư viện |
| AVIF | 35–45% | Android 12+, iOS 17+ |
| JPEG XR | 30–40% | Chỉ Windows |
Phông chữ tùy chỉnh có thể chiếm 5–15 MB, đặc biệt nếu bao gồm toàn bộ bộ phông chữ (tất cả kiểu: Regular, Bold, Italic, BoldItalic). Chỉ sử dụng các kiểu cần thiết và tập hợp con ký tự thông qua subsetting — loại bỏ glyph cho các ngôn ngữ không được ứng dụng hỗ trợ. Các dịch vụ như Google Fonts và Transfonter cho phép tạo tập hợp ký tự tối thiểu. Đối với âm thanh, sử dụng AAC/HE-AAC thay vì WAV và các định dạng không nén — tiết kiệm đến 90% mà không mất chất lượng.
Mã nguồn chiếm 20–40% kích thước ứng dụng, nhưng việc tối ưu hóa nó phức tạp hơn tài nguyên vì đòi hỏi phân tích phụ thuộc, làm rối và loại bỏ mã chết mà không có rủi ro làm hỏng chức năng.
ProGuard là công cụ dành cho Android thực hiện làm rối, thu nhỏ và tối ưu hóa mã nguồn. R8 — người kế nhiệm của nó, được tích hợp trong Android Gradle Plugin, hoạt động nhanh hơn và hiệu quả hơn. R8 loại bỏ các lớp và phương thức không dùng, rút ngắn tên biến và viết lại mã nguồn để giảm số lượng lệnh. Mức giảm kích thước tệp DEX điển hình với R8 là 30–50%.
// build.gradle — cấu hình R8 để thu nhỏ
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt')
shrinkResources true
}
}
}
Thư viện — nguyên nhân phổ biến gây phình to kích thước. Một thư viện có thể kéo theo các phụ thuộc bắc cầu làm tăng kích thước thêm 5–20 MB mà không mang lại lợi ích trực tiếp cho ứng dụng. Sử dụng Gradle Version Catalog cho Android và Swift Package Manager cho iOS với khai báo phụ thuộc rõ ràng. Phân tích kích thước bằng Build Analyzer trong Android Studio hoặc Xcode Build Timeline. Thay thế thư viện nặng bằng các lựa chọn thay thế nhẹ hơn: ví dụ OkHttp (3 MB) thay vì Apache HTTP (15 MB).
Dead Code Stripping — tự động loại bỏ các phương thức và lớp không dùng ở giai đoạn liên kết trong Xcode. Được bật qua Build Settings → Dead Code Stripping = YES. Bitcode — biểu diễn trung gian mà Apple có thể biên dịch lại cho các kiến trúc khác nhau, loại bỏ các hàm không dùng. Tuy nhiên, từ Xcode 14, Bitcode trở thành tùy chọn và đóng góp của nó vào việc giảm kích thước là 5–15% cho các dự án Objective-C và ít hơn cho Swift.
App Thinning — công nghệ của Apple tự động giảm kích thước ứng dụng đã cài đặt bằng cách chỉ cung cấp những tài nguyên cần thiết cho một thiết bị cụ thể. Nó bao gồm ba thành phần: Slicing, On-Demand Resources và Bitcode. Trên Android, tương đương là Android App Bundle (AAB) với Dynamic Delivery.
AAB — định dạng xuất bản trên Google Play nơi cửa hàng tạo APK riêng cho từng thiết bị, chỉ bao gồm tài nguyên cho kiến trúc (armeabi-v7a, arm64-v8a), mật độ màn hình (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi) và ngôn ngữ của nó. Mức giảm kích thước cài đặt điển hình khi chuyển từ APK phổ thông sang AAB là 20–40%. Play Feature Delivery cho phép tải mô-đun theo yêu cầu, trong khi mô-đun Install-time được bao gồm trong cài đặt cơ bản.
// build.gradle — cấu hình AAB và Dynamic Features
android {
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
On-Demand Resources (ODR) — cơ chế iOS nơi tài nguyên (cấp độ trò chơi, hình ảnh độ phân giải cao, video) được tải xuống từ máy chủ Apple chỉ khi người dùng thực sự cần. Kích thước cài đặt ban đầu có thể giảm 50–80%. Tài nguyên được chia thành ba loại: Initial Install Tags (tải xuống trong khi cài đặt), Prefetched Tag Order (tải xuống nền sau khi cài đặt) và On-Demand (chỉ tải xuống khi có yêu cầu). Apple khuyến nghị sử dụng ODR cho nội dung không cần trên màn hình đầu tiên: cấp độ trò chơi, nội dung bổ sung, hướng dẫn bằng video.
SwiftUI hỗ trợ ODR qua thuộc tính Bundle.module, trong khi UIKit sử dụng NSBundleResourceRequest. Đối với trò chơi trên Unity và Unreal Engine, ODR được tích hợp ở cấp độ wrapper gốc. Hạn chế chính là tài nguyên ODR bị hệ thống xóa khi dung lượng thấp, vì vậy dữ liệu quan trọng phải được bao gồm trong bản dựng chính.
Các câu hỏi thường gặp
Dưới 50 MB — kích thước lý tưởng để đạt tỷ lệ chuyển đổi cài đặt tối đa. 50–100 MB — chấp nhận được cho hầu hết ứng dụng. Trên 100 MB — cần biện minh bằng kích thước (trò chơi, bản đồ ngoại tuyến, trình chỉnh sửa nội dung).
Tài nguyên mang lại lợi ích lớn hơn trong thời gian ngắn hơn. Bắt đầu bằng cách loại bỏ tài sản không dùng, chuyển đổi PNG sang WebP và nén âm thanh. Sau đó chuyển sang tối ưu hóa mã nguồn qua R8 hoặc Dead Code Stripping.
Google Play tạo APK chỉ cho thiết bị cụ thể: mã arm64-v8a, tài nguyên xhdpi, ngôn ngữ cần thiết. APK phổ thông chứa tất cả biến thể cùng lúc, làm tăng kích thước lên 1,5–2 lần. AAB giải quyết vấn đề này ở cấp cửa hàng.
Gián tiếp. Kích thước lớn hơn đồng nghĩa với nhiều mã nguồn cho biên dịch JIT/AOT hơn, nhiều tài nguyên để tải vào bộ nhớ hơn và nhiều thời gian phân tích tệp kê khai hơn. Tuy nhiên, tác động trực tiếp đến hiệu suất thời gian chạy là tối thiểu — kích thước ảnh hưởng đến cài đặt và lần khởi chạy đầu tiên.
Install-time — một phần của cài đặt cơ bản, có sẵn ngay lập tức. On-Demand — được tải khi truy cập lần đầu, không bao gồm trong cài đặt ban đầu. Sử dụng On-Demand cho các tính năng mà dưới 20% người dùng cần: chẩn đoán, hướng dẫn, bộ lọc AR.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm