Android为什么会保留已安装应用的APK文件?


31

Android将安装的用户应用的APK文件保留在/data/app目录中,将系统应用保留在/system/app目录中。

这是否意味着Android每次启动时都会从APK文件中提取dex文件?如果没有,我可以安全地删除APK文件并仍然运行该应用程序吗?

Answers:


43

Android APK通常包含这些内容。

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

安装后,APK文件将复制到/data/app,并classes.dex通过dex2oat在其上运行进行提取和“优化” (在Android 5+ lib/上也被提取)。优化的结果存储在其中,/data/dalvik-cache/因此每个安装或更新仅需对应用程序进行一次优化。其他所有内容都保留在APK中。所以第一个答案是很清楚的:比如像assetsres的需要的通过必须提供的应用程序,它们是APK内。保留APK文件是出于支持目的。如果您删除APK,则该应用肯定不会启动。(应用程序:我的资产在哪里?)

其次,谷歌播放添加了“增量更新”的支持早就。在增量更新过程中,将计算旧软件包与新软件包之间的差异。然后,GP下载“ Delta”并将更改应用于原始APK,以生成更新的APK,从而减小了下载大小。

APK始终是签名的。这样可以防止恶意修改程序包。您绝对不希望在不知道更改内容或是否已注入病毒的情况下安装经过修改的应用程序。在META-INF/里面的APK适用于这一目的。非官方的更改将导致签名不匹配,Android系统将拒绝安装修改后的应用。

同样,当您更新Android操作系统时,所有dex文件都会再次“优化”,因此您无需一一安装。如上所述,优化需要classes.dex原始程序包中的文件。


5
请注意,Google Play商店的增量更新功能取决于APK是否能够计算已安装和更新版本之间的增量以及后续的补丁。另外,APK已压缩,因此可以节省一些空间(有人记得吗ZipAlign?)
Tamoghna Chowdhury

@Tamoghna Space并不是真正的问题,否则Android 5+不会lib/从APK中提取,iOS不会从IPA中提取所有内容。它仅用于基本完整性检查。
iBug

可执行文件很少很好地压缩-节省空间与压缩后的资源(如二进制化的XML文件)更多相关,后者不会被提取。此外,关于ZipAlign,在优化(读取字对齐)的压缩文件上,资源访问可以更快一些。
Tamoghna Chowdhury's

1
因此,资产文件(例如html和js文件)是否不会从apk复制到android文件系统中的特定位置?
user1788736 '18

1
@ user1788736是。它们留在APK中。
iBug
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.