1. Coil Coil là một thư viện với một cách tiếp cận thực sự mới mẻ để tải hình ...
Mình đang xây dựng nhóm "anh Thầy & Đồng bọn (Hỏi đáp, chia sẻ kiến thức)" mục đích để các bạn có một nơi giao lưu trao đổi.
Đội MOD của group và mọi người sẽ hỗ trợ bạn ngay lập tức.
Join ở đây nè: https://www.facebook.com/groups/anhthayvadongbon
Bài viết: [Android] Những cách giảm thiểu kích cỡ ứng dụng khi lập trình Android studio
Lượt xem: 1131 lượt xem
Người dùng thường tránh tải xuống các ứng dụng có vẻ quá lớn, đặc biệt là ở các thị trường mới nổi nơi các thiết bị kết nối với mạng 2G và 3G hoạt động trên các gói trả theo byte. Trong những năm gần đây kích cỡ ứng dụng và game android ngày một tăng,
1. Tại sao lại cần giảm thiểu kích cỡ trong xây dựng ứng dụng Android?
Người dùng thường tránh tải xuống các ứng dụng có vẻ quá lớn, đặc biệt là ở các thị trường mới nổi nơi các thiết bị kết nối với mạng 2G và 3G hoạt động trên các gói trả theo byte. Trong những năm gần đây kích cỡ ứng dụng và game android ngày một tăng, tính từ năm 2012 đến nay con số này đã tăng lên đến 5 lần, đây là thực sự là vấn đề đối với cả những thiết bị cao cấp với bộ nhớ lớn, các thiết bị này có thể dễ dàng bị lấp đầy bởi các nội dụng 4k chất lượng cao và bộ nhớ là một trong những nguyên nhân hàng đầu gây giảm trải nghiệm người dùng và là nguyên nhân khiến họ phải gỡ bỏ ứng dụng. Trong bài viết này cũng cấp các cách giảm kích thước APK của ứng dụng, cho phép nhiều người dùng tải xuống ứng dụng của bạn hơn.
2. Cấu trúc của một file ứng dụng (Apk).
File APK bao gồm tệp lưu trữ ZIP chứa tất cả các tệp trong ứng dụng của bạn. Các tệp này bao gồm các tệp lớp Java, các tệp tài nguyên và một tệp chứa các file được biên dịch. Một file APK chứa các thư mục sau:
META-INF /
: Chứa các tệp chữ ký CERT.SF
, CERT.RSA
và tệp kê khai MANIFEST.MF
.assets/
: Chứa tài nguyên của ứng dụng mà có thể truy xuất bằng cách sử dụng đối tượng AssetManager
.res/
: Chứa các tài nguyên không được biên dịch thành resource.arsc
.lib/
: Chứa mã được biên dịch dành riêng cho lớp phần mềm của bộ xử lý. Thư mục này chứa thư mục con cho từng loại nền tảng, như armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 và mips.resource.arsc
: Chứa các tài nguyên được biên dịch. Tệp này chứa nội dung XML từ thư mục res/value/
. Công cụ đóng gói trích xuất nội dung XML này, biên dịch nó thành dạng nhị phân và lưu trữ. Nội dung này bao gồm strings và styles, cũng như các đường dẫn đến nội dung không được chứa trực tiếp trong tệp resource.arsc
, chẳng hạn như layout và image.class.dex
: Chứa các lớp được biên dịch theo định dạng tệp DEX được hiểu bởi máy ảo Dalvik / ART.AndroidManifest.xml
: Là tệp kê khai của Android. Tệp này liệt kê tên, phiên bản, quyền truy cập và các tệp thư viện được tham chiếu của ứng dụng. Tệp sử dụng định dạng XML nhị phân của Android.
3. Sử dụng công cụ Lint để phát hiện tài nguyên không được sử dụng.
res/
của bạn mà bạn không tham chiếu đến (không sử dụng). Khi công cụ lint phát hiện ra một resources không được sử dụng trong project của bạn, nó sẽ xuất ra một thông báo như ví dụ sau.res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
to be unused [UnusedResources]
assets/
, assets được tham chiếu thông qua reflection hoặc tệp thư viện mà bạn đã liên kết với ứng dụng của mình. Ngoài ra, nó cũng không loại bỏ resources không sử dụng đó giúp bạn mà nó chỉ cảnh báo bạn về sự hiện của các tài nguyên không sử dụng đó thôi. Việc loại bỏ bạn sẽ phải tự thực hiện.
4. Sử dụng ShrinkResources tối ưu tài nguyên sử dụng.
build.gradle
tại module app của bạn.android {
// Other settings
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
Sau khi bạn bật chế độ shrinkResources . Trong suốt quá trình bạn build ứng dụng, đầu tiên ProGuard sẽ loại bỏ các đoạn code không cần thiết sau đó Gradle sẽ loại bỏ các resources không cần thiết.
5. Sử dụng các thư viên ngoài một cách hợp lý.
6. Chỉ hỗ trợ một số mật độ cụ thể thay vì tất cả.
drawable-nodpi/
. Tuy vậy ứng dụng của bạn nên bao gồm ít nhất một biến thể hình ảnh xxhdpi
.
7. Sử dụng đối tượng Drawable.
<shape>
trong XML) chỉ chiếm một lượng không gian nhỏ trong APK của bạn và điều này sẽ giúp bạn giảm thiểu được kích cỡ ứng dụng. Ngoài ra, các đối tượng XML Drawable tạo ra các hình ảnh tuân thủ theo material design mà google đưa ra.
8. Sử dụng lại resources.
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_thumb_up"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="180" />
9. Render hình ảnh từ code.
<shape>
thay thế cho một hình ảnh.<shape android:shape="line">
<stroke
android:width="2dp"
android:color="@color/black" />
<size
android:width="10dp"
android:height="10dp" />
</shape>
10. Sử dụng appt để tối ưu hóa file PNG.
res/drawable/
với việc sử dụng nén không mất dữ liệu (lossless compression) trong quá trình xây dựng ứng dụng. Ví dụ: công cụ aapt có thể chuyển đổi một ảnh PNG không yêu cầu nhiều hơn 256 màu thành PNG với bảng màu 8 bit. Làm như vậy sẽ giữ cho hình ảnh có chất lượng tương đương nhưng dung lượng bộ nhớ nhỏ hơn rất nhiều.asset/folder
.cruncherEnables
trong Gradle ngăn chặn việc này.aaptOptions {
cruncherEnabled = false
}
11. Nén các file PNG và JPEG.
pngcrush
, pngquant
hoặc zopflipng
. Tất cả các công cụ này có thể giảm kích thước tệp PNG trong khi vẫn giữ được chất lượng hình ảnh.pngcrush
đặc biệt hiệu quả: Công cụ này lặp lại các bộ lọc PNG và các tham số zlib (Deflate), sử dụng từng tổ hợp bộ lọc và tham số để nén hình ảnh. Sau đó, nó chọn cấu hình mang lại đầu ra nén nhỏ nhất. Các công cụ trên bạn có thể dễ dàng add thêm vào project của mình.
12. Sử dụng định dạng WebP cho hình ảnh.
13. Sử dụng đồ họa định dạng vector.
14. Giảm thiểu các mã code.
class.dex
của ứng dụng của bạn điều này làm phình to ứng dụng của bạn. Nếu có thể, hãy cân nhắc sử dụng chú thích @IntDef và ProGuard để loại bỏ các enumerations và chuyển đổi chúng thành intergers. Chuyển đổi loại này giúp giữ lại tất cả các lợi ích an toàn loại của enums nhưng đồng thời giúp giảm kích thước của tệp..so
trong APK bằng cách đặt android: extractNativeLibs = "false"
trong thẻ <application>
trong file Manifest của bạn. Việc vô hiệu hóa này sẽ ngăn PackageManager sao chép các tệp .so
từ APK sang hệ thống tệp trong khi cài đặt và có thêm lợi ích là làm cho các bản cập nhật của ứng dụng của bạn nhỏ hơn. Tuy nhiên bạn nên cân nhắc việc này vì việc này giúp cho bản cập nhật nhỏ hơn và kích cỡ ứng dụng khi cài đặt sẽ nhỏ hơn. Tuy nhiên bạn hoàn toàn có thể set giá trị true cho thuộc tính này và kích cỡ app tải xuống sẽ giảm đi vì các thư vien native sẽ được nén trong Apk tuy nhiên kích cỡ khi cài đặt thì không hề nhỏ và việc cài đặt app sẽ lâu hơn vì cần giải nén. Bạn có thể cân nhắc sử dụng tùy trường hợp.
15. Sử dụng Android App Bundles.
Tài liệu tham khảo:
Bạn có muốn xác nhận hoàn thành bài học này không?