Tại sao Android giữ các tệp APK của các ứng dụng đã cài đặt?


31

Android giữ các tệp APK của các ứng dụng người dùng đã cài đặt trong /data/appthư mục và ứng dụng hệ thống trong /system/appthư mục.

Điều đó có nghĩa là Android trích xuất các tệp dex từ các tệp APK mỗi khi ứng dụng được khởi chạy? Nếu không, tôi có thể xóa các tệp APK một cách an toàn và vẫn chạy ứng dụng không?

Câu trả lời:


43

Một APK Android thường chứa những thứ này.

assets/
lib/
META-INF/
res/
AndroidManifest.xml
classes.dex

Sau khi cài đặt, tệp APK được sao chép vào /data/appclasses.dexđược trích xuất và "tối ưu hóa" bằng cách chạy dex2oattrên nó (trên Android 5+ lib/cũng được trích xuất). Kết quả của việc tối ưu hóa được lưu trữ trong /data/dalvik-cache/nên ứng dụng chỉ cần được tối ưu hóa một lần cho mỗi lần cài đặt hoặc cập nhật . Mọi thứ khác được giữ trong APK. Vì vậy, câu trả lời đầu tiên rất rõ ràng: Những thứ như assetsresyêu cầu của ứng dụng phải được cung cấp và chúng nằm trong APK. Tệp APK được lưu giữ cho mục đích hỗ trợ. Nếu bạn xóa APK, ứng dụng chắc chắn sẽ không bắt đầu. (Ứng dụng: Tài sản của tôi đâu?)

Thứ hai, Google Play hỗ trợ cho "Delta Update" thêm rất lâu rồi . Trong thủ tục cập nhật delta, sự khác biệt giữa gói cũ và gói mới được tính toán. Sau đó, GP tải xuống "Delta" và áp dụng các thay đổi cho APK gốc để mang lại APK được cập nhật, do đó giảm kích thước tải xuống.

Một APK luôn được ký. Điều này có thể ngăn chặn sửa đổi độc hại cho gói. Bạn chắc chắn không muốn cài đặt một ứng dụng đã được sửa đổi mà không biết những gì đã được thay đổi hoặc liệu virus đã được tiêm hay chưa. Các META-INF/bên APK làm việc cho mục đích này. Những thay đổi không chính thức sẽ dẫn đến chữ ký không phù hợp và hệ thống Android sẽ từ chối cài đặt ứng dụng đã được sửa đổi.

Ngoài ra, khi bạn cập nhật HĐH Android, tất cả các tệp dex sẽ được "tối ưu hóa" lại để bạn không cần phải cài đặt lại từng cái một. Như đã nói ở trên, tối ưu hóa yêu cầu classes.dextập tin từ gói ban đầu.


5
Lưu ý rằng khả năng cập nhật delta của Cửa hàng Google Play phụ thuộc vào việc có APK để tính toán delta giữa phiên bản đã cài đặt và phiên bản cập nhật và bản vá tiếp theo. Thêm vào đó, APK được nén để tiết kiệm một số dung lượng (có ai nhớ bạn là ZipAlign không?)
Tamoghna Chowdhury

@Tamoghna Space thực sự không phải là vấn đề, nếu không, Android 5+ sẽ không được trích xuất lib/từ APK, iOS sẽ không trích xuất mọi thứ từ IPA. Nó chỉ để kiểm tra tính toàn vẹn cơ bản.
iBug

Các tệp thực thi hiếm khi nén tốt - việc tiết kiệm không gian có liên quan nhiều hơn đến các tài nguyên được nén như các tệp XML được mã hóa, không được trích xuất. Ngoài ra, về ZipAlign - truy cập tài nguyên có thể nhanh hơn một chút trên các tệp nén được tối ưu hóa (đọc từ được căn chỉnh).
Tamoghna Chowdhury

1
Vì vậy, các tệp tài sản như tệp html và js không được sao chép từ apk sang một vị trí cụ thể trong hệ thống tệp Android?
dùng1788736

1
@ user1788736 Có. Chúng được để lại trong APK.
iBug
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.