Giảm chi phí dữ liệu cho hàng tỷ
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Gói dữ liệu ở một số quốc gia có thể tốn hơn 10% thu nhập hằng tháng của một người dùng thông thường. Điều này có nghĩa là việc giảm thiểu kích thước tải xuống của ứng dụng và cho phép người dùng kiểm soát cách ứng dụng sử dụng dữ liệu có thể mang lại lợi ích lớn và hữu hình cho nhiều người dùng. Việc giảm thiểu kích thước tải xuống cũng giúp tiết kiệm dung lượng trong bộ nhớ trong (một nguồn tài nguyên khan hiếm ở một số thiết bị).
Tại đây, bạn có thể tìm thấy một số chiến lược giúp tối ưu hoá lượng dữ liệu mà ứng dụng của bạn sử dụng, cả trên mạng và trong bộ nhớ trong.
Giảm kích thước ứng dụng
Giảm kích thước ứng dụng là một trong những cách cơ bản giúp người dùng tiêu thụ ít dữ liệu hơn, cả về dữ liệu mạng và bộ nhớ trong. Phần này mô tả một số phương pháp để giảm kích thước ứng dụng.
Giảm kích thước thành phần đồ hoạ của APK
- Các thành phần đồ hoạ thường chiếm phần lớn kích thước của tệp APK. Việc tối ưu hoá những thành phần này có thể giúp giảm kích thước tải xuống và do đó, giảm thời gian cài đặt cho người dùng.
- Đối với các thành phần đồ hoạ như biểu tượng, hãy dùng định dạng Đồ hoạ vectơ có thể mở rộng (SVG). Hình ảnh SVG có kích thước nhỏ so với đồ hoạ bitmap và có thể được kết xuất ở thời gian chạy với mọi độ phân giải. Thư viện hỗ trợ Android cung cấp một phương thức triển khai tương thích ngược cho các tài nguyên vectơ đối với Android 2.1 (API cấp 7).
Bắt đầu sử dụng vectơ bằng
bài đăng này trên Medium.
- Đối với hình ảnh không phải vectơ (chẳng hạn như ảnh), hãy sử dụng WebP để giảm thời gian tải hình ảnh và tiết kiệm băng thông mạng. WebP đã được chứng minh là có kích thước tệp nhỏ hơn so với các tệp PNG và JPG tương ứng, với chất lượng hình ảnh ít nhất là tương đương. Ngay cả ở chế độ cài đặt có tổn thất, WebP vẫn có thể tạo ra hình ảnh gần như giống hệt với hình ảnh gốc. Android đã hỗ trợ WebP suy hao từ Android 4.0 (API cấp 14: Ice Cream Sandwich) và hỗ trợ WebP không suy hao, trong suốt từ Android 4.2 (API cấp 17: Jelly Bean).
- Nếu bạn có nhiều hình ảnh lớn trên nhiều mật độ, hãy cân nhắc sử dụng Tính năng hỗ trợ nhiều APK để chia APK theo mật độ. Điều này dẫn đến việc tạo các bản dựng nhắm đến mật độ cụ thể, tức là người dùng có thiết bị mật độ thấp sẽ không phải chịu mức phạt khi tải xuống các thành phần có mật độ cao không dùng đến.
- Để biết thêm thông tin về cách giảm kích thước tệp APK, hãy xem phần Giảm kích thước tệp APK và Thu hẹp mã và tài nguyên. Ngoài ra, bạn có thể xem hướng dẫn chi tiết về cách giảm kích thước tệp APK trong
loạt bài đăng này trên Medium.
Giảm kích thước mã
- Mọi thư viện trong dự án Android của bạn đều có thể thêm mã không dùng đến vào APK. Hãy đặc biệt cẩn thận khi sử dụng các thư viện bên ngoài vì không phải thư viện nào cũng được thiết kế để sử dụng trong ứng dụng di động. Đảm bảo rằng các thư viện mà ứng dụng của bạn đang sử dụng được tối ưu hoá cho việc sử dụng trên thiết bị di động.
- Hãy cân nhắc việc tối ưu hoá mã đã biên dịch bằng một công cụ như ProGuard. ProGuard xác định mã không được dùng và xoá mã đó khỏi APK của bạn. Ngoài ra, hãy
bật tính năng rút gọn tài nguyên tại thời điểm tạo bằng cách đặt
minifyEnabled=true
, shrinkResources=true
trong build.gradle
. Thao tác này sẽ tự động xoá các tài nguyên không dùng đến khỏi APK của bạn.
- Khi sử dụng Dịch vụ Google Play, bạn chỉ nên
chọn lọc đưa các API cần thiết vào APK của mình.
- Để biết thêm thông tin về cách giảm kích thước mã trong tệp APK, hãy xem khoá đào tạo của Android về cách Tránh các khung tiêm phần phụ thuộc.
Cho phép di chuyển ứng dụng sang bộ nhớ ngoài (thẻ SD)
- Các thiết bị giá rẻ thường có ít bộ nhớ trên thiết bị. Người dùng có thể mở rộng bộ nhớ này bằng thẻ SD; tuy nhiên, các ứng dụng cần phải khai báo rõ ràng rằng chúng hỗ trợ việc cài đặt vào bộ nhớ ngoài trước khi người dùng có thể di chuyển chúng.
- Cho phép cài đặt ứng dụng vào bộ nhớ ngoài bằng cách sử dụng cờ
android:installLocation
trong AndroidManifest.xml. Để biết thêm thông tin về cách cho phép di chuyển ứng dụng sang bộ nhớ ngoài, hãy xem hướng dẫn của Android về Vị trí cài đặt ứng dụng.
Giảm mức sử dụng đĩa của ứng dụng sau khi cài đặt
- Việc duy trì mức sử dụng đĩa thấp cho ứng dụng có nghĩa là người dùng ít có khả năng gỡ cài đặt ứng dụng của bạn khi thiết bị có ít dung lượng trống. Bạn cần áp dụng các giới hạn cho bộ nhớ đệm để ngăn chặn việc ứng dụng của bạn sử dụng dung lượng ổ đĩa vô thời hạn. Hãy nhớ đặt dữ liệu được lưu vào bộ nhớ đệm trong
getCacheDir()
. Hệ thống có thể xoá các tệp được đặt ở đây khi cần, vì vậy, các tệp này sẽ không xuất hiện dưới dạng bộ nhớ được cam kết cho ứng dụng.
Cung cấp khả năng sử dụng mạng có thể định cấu hình
Nền tảng Android có một số cách để bạn cho phép người dùng kiểm soát mức sử dụng mạng của ứng dụng, tối ưu hoá mức sử dụng đó cho nhu cầu của riêng họ. Ví dụ: khi sử dụng lần đầu, ứng dụng của bạn có thể hướng dẫn người dùng thực hiện nhiều chế độ cài đặt liên quan đến mạng.
Bạn cũng có thể cung cấp một màn hình lựa chọn ưu tiên về mạng từ bên ngoài ứng dụng.
Cung cấp trải nghiệm làm quen cho các lựa chọn mạng của người dùng
- Những ứng dụng cho phép người dùng giảm mức sử dụng dữ liệu được đón nhận, ngay cả khi chúng có yêu cầu cao về dữ liệu. Nếu ứng dụng của bạn sử dụng một lượng lớn băng thông (ví dụ: ứng dụng phát trực tuyến video), bạn có thể cung cấp trải nghiệm tham gia cho người dùng để định cấu hình việc sử dụng mạng. Ví dụ: bạn có thể cho phép người dùng buộc các luồng video có tốc độ bit thấp hơn trên mạng di động.
- Các chế độ cài đặt bổ sung để người dùng kiểm soát việc đồng bộ hoá dữ liệu, tìm nạp trước và hành vi sử dụng mạng (ví dụ: chỉ tìm nạp trước tất cả danh mục tin tức được gắn dấu sao trên Wi-Fi) cũng giúp người dùng điều chỉnh hành vi của ứng dụng cho phù hợp với nhu cầu của họ.
- Để biết thêm thông tin về cách quản lý mức sử dụng mạng, hãy xem khoá đào tạo Android về Quản lý mức sử dụng mạng.
Cung cấp một màn hình lựa chọn ưu tiên về mạng
- Bạn có thể chuyển đến phần cài đặt mạng của ứng dụng từ bên ngoài ứng dụng bằng màn hình tùy chọn ưu tiên về mạng. Bạn có thể gọi màn hình này từ màn hình cài đặt hệ thống hoặc màn hình mức sử dụng dữ liệu hệ thống.
- Để cung cấp một màn hình lựa chọn ưu tiên về mạng mà người dùng có thể truy cập từ bên trong ứng dụng của bạn cũng như từ phần cài đặt hệ thống, hãy thêm một hoạt động hỗ trợ thao tác
ACTION_MANAGE_NETWORK_USAGE
vào ứng dụng của bạn.
- Để biết thêm thông tin về cách thêm màn hình lựa chọn ưu tiên về mạng, hãy xem khoá đào tạo Android về
Triển khai một Hoạt động về lựa chọn ưu tiên.
Tài nguyên khác
Để tìm hiểu thêm về chủ đề này, hãy xem các tài nguyên bổ sung sau đây:
Bài đăng trên blog
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[null,null,["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Reduced data cost for billions\n\n\u003cbr /\u003e\n\n\nData plans in some countries can cost upwards of 10% of a typical user's monthly income. This\nmeans that minimizing your app's download size and letting the user control how your app uses\ndata can have a large, tangible benefit to many users. Minimizing download size also helps\nconserve space in internal storage, which is a scarce resource in some devices.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\nHere you can find some strategies to help optimize the amount of data your app uses, both over\nthe network and in internal storage.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\nReduce app size\n---------------\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\nReducing app size is one of the fundamental ways you can help your user consume less data, in\nterms of both network data and internal storage. This section describes several approaches to\nreducing app size.\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n### Reduce APK graphical asset size\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n- Graphical assets are often the largest contributor to the size of the APK. Optimizing these can result in smaller downloads and thus faster installation times for users.\n- For graphical assets such as icons, use the Scalable Vector Graphics (SVG) format. SVG images are tiny in size compared to bitmap graphics and can be rendered at runtime to any resolution. The [Android Support Library](/tools/support-library) provides a backward-compatible implementation for vector resources to Android 2.1 (API level 7). Get started with vectors with [this Medium post](https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88).\n- For non-vector images, such as photos, use [WebP](https://developers.google.com/speed/webp/) to reduce image load times and save network bandwidth. WebP is proven to result in smaller file sizes than its PNG and JPG counterparts, with at least the same image quality. Even at lossy settings, WebP can produce a nearly identical image to the original. Android has included lossy WebP support since Android 4.0 (API level 14: Ice Cream Sandwich) and support for lossless, transparent WebP since Android 4.2 (API level 17: Jelly Bean).\n- If you have many large images across multiple densities, consider using [Multiple\n APK support](/google/play/publishing/multiple-apks) to split your APK by density. This results in builds targeted for specific densities, meaning users with low-density devices won't have to incur the penalty of downloading unused high-density assets.\n- For more information about reducing APK size, see [Reduce APK Size](/topic/performance/reduce-apk-size) and [Shrink Your Code and Resources](/studio/build/shrink-code). In addition, you can find a detailed guide on reducing APK size in this [series of Medium posts](https://medium.com/@wkalicinski/smallerapk-part-4-multi-apk-through-abi-and-density-splits-477083989006).\n\n### Reduce code size\n\n- Every library in your Android project is adding potentially unused code to the APK. Be particularly careful about using external libraries because not all libraries are designed for use in mobile apps. Ensure that the libraries your app is using are optimized for mobile use.\n- Consider optimizing your compiled code using a tool such as [ProGuard](/tools/help/proguard). ProGuard identifies code that isn't being used and removes it from your APK. Also [enable resource shrinking](http://tools.android.com/tech-docs/new-build-system/resource-shrinking) at build time by setting `minifyEnabled=true`, `shrinkResources=true` in `build.gradle`---this automatically removes unused resources from your APK.\n- When using Google Play services, you should [selectively include](/google/play-services/setup#add_google_play_services_to_your_project) only the necessary APIs into your APK.\n- For more information on reducing code size in your APK, see the Android training on how to [Avoid\n dependency injection frameworks](/training/articles/memory#DependencyInjection).\n\n### Allow app to be moved to external (SD) storage\n\n- Low-cost devices often come with little on-device storage. Users can extend this with SD cards; however, apps need to explicitly declare that they support being installed to external storage before users can move them.\n- Allow your app to be installed to external storage using the [`\n android:installLocation`](/guide/topics/manifest/manifest-element#install) flag in your AndroidManifest.xml. For more information on enabling your app to be moved to external storage, see the Android guide on [App Install\n Location](/guide/topics/data/install-location).\n\n\u003cbr /\u003e\n\n### Reduce post-install app disk use\n\n\u003cbr /\u003e\n\n- Keeping your app's disk use low means that users are less likely to uninstall your app when the device is low on free space. It's important to apply bounds around your caches---this prevents your app's disk use from growing indefinitely. Be sure you put your cached data in [getCacheDir()](/reference/android/content/Context#getCacheDir())---the system can delete files placed here as needed, so they won't show up as storage committed to the app.\n\n\u003cbr /\u003e\n\nOffer configurable network use\n------------------------------\n\n\nThe Android platform includes a number of ways you can give the user control\nover your app's network use, optimizing it for their own needs. For example,\non first use, your app can walk the user through a variety of network-related settings.\nYou can also provide a network preferences screen from outside the app.\n\n### Provide onboarding experiences for users' network\nchoices\n\n\u003cbr /\u003e\n\n- Apps that allow users to reduce data use are well received, even if they have heavy data requirements. If your app uses a considerable amount of bandwidth (for example, video streaming apps), you can provide an onboarding experience for users to configure network use. For example, you could allow the user to force lower-bitrate video streams on cellular networks.\n- Additional settings for users to control data syncing, prefetching, and network use behavior (for example, prefetch all starred news categories on Wi-Fi only), also help users tailor your app's behavior to their needs.\n- For more information on managing network use, see the Android training on [Managing\n Network Usage](/training/basics/network-ops/managing).\n\n### Provide a network preferences\nscreen\n\n- You can navigate to the app's network settings from outside the app by means of a network preferences screen. You can invoke this screen from either the system settings screen or the system data usage screen.\n- To provide a network preferences screen that users can access from within your app as well as from the system settings, in your app include an activity that supports the [ACTION_MANAGE_NETWORK_USAGE](/reference/android/content/Intent#ACTION_MANAGE_NETWORK_USAGE) action.\n- For further information on adding a network preferences screen, see the Android training on [Implementing a Preferences Activity](/training/basics/network-ops/managing#prefs).\n\n\u003cbr /\u003e\n\nAdditional resources\n--------------------\n\nTo learn more about this topic, view the following additional resources:\n\n### Blog posts\n\n- [Nurture trust through cost transparency](https://medium.com/google-design/nurture-trust-through-cost-transparency-b61a5947d2fc)"]]