Android APK缓存

原文:https://source.android.com/devices/tech/perf/apk-caching

本文介绍了APK缓存解决方案的设计,以便在支持A/B分区的设备上快速安装预加载的应用程序。

OEM可以将预加载和流行应用程序放置在APK缓存里,存储在大多数新A/B分区设备上的空B分区中,而不会影响任何面向用户的数据空间。通过在设备上提供APK缓存,新的或最近恢复出厂设置的设备可以立即使用,无需从Google Play下载APK文件。

用例

  • 将预加载的应用程序存储在B分区中以便更快配置
  • 将流行的应用程序存储在B分区中以便更快恢复

先决条件

要使用此功能,设备需要:

  • 安装了Android 8.1(O MR1)版本
  • 实现了A / B分区

只能在首次启动时复制预加载的内容。这是因为在支持A / B系统更新的设备上,B分区实际上并不存储系统映像文件,而是存储一些预加载内容,如零售演示资源,OAT文件和APK缓存等。将资源复制到/ data分区(这发生在首次启动时)后,B分区将被OTA更新用来下载系统映像的更新版本。

因此,无法通过OTA更新APK缓存; 它只能在出厂时预装。恢复出厂设置仅影响/ data分区。系统B分区一直保存预加载的内容直到OTA映像被下载。恢复出厂设置后,系统将再次进行首次启动。这意味着如果将OTA映像下载到B分区后,再将设备恢复出厂设置,则APK缓存不可用。

实现

方法1. system_other分区上的内容

赞成:恢复出厂设置后预加载的内容不会丢失(重启后将从B分区复制)。

反对:B分区需要空间。恢复出厂设置后启动需要额外的时间来复制预加载的内容。

为了在首次引导期间复制预加载,系统将调用脚本/system/bin/preloads_copy.sh。使用单参数(system_b分区的只读挂载点的路径)来调用该脚本:

要实现此功能,请进行这些特定设备的更改。以下是Marlin的一个例子:

  1. 将执行复制的脚本添加到device-common.mk 文件(本例为device/google/marlin/device-common.mk)中,如下所示:
# Script that copies preloads directory from system_other to data partition
PRODUCT_COPY_FILES += \
    device/google/marlin/preloads_copy.sh:system/bin/preloads_copy.sh

在以下位置查找示例脚本源:device/google/marlin/preloads_copy.sh

  1. 编辑init.common.rc文件以使其创建必要的/data/preloads目录和子目录:
$ mkdir /data/preloads 0775 system system`
$ mkdir /data/preloads/media 0775 system system`
$ mkdir /data/preloads/demo 0775 system system`

在以下位置查找示例init文件源:device/google/marlin/init.common.rc

  1. preloads_copy.te文件中定义新的SELinux域:
type preloads_copy, domain, coredomain;
type preloads_copy_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(preloads_copy)

allow preloads_copy shell_exec:file rx_file_perms;
allow preloads_copy toolbox_exec:file rx_file_perms;
allow preloads_copy preloads_data_file:dir create_dir_perms;
allow preloads_copy preloads_data_file:file create_file_perms;
allow preloads_copy preloads_media_file:dir create_dir_perms;
allow preloads_copy preloads_media_file:file create_file_perms;

# Allow to copy from /postinstall
allow preloads_copy system_file:dir r_dir_perms;

在以下位置找到示例SELinux域文件:/ device/google/marlin/+/master/sepolicy/preloads_copy.te

  1. 在新/sepolicy/file_contexts 文件中注册域:
/system/bin/preloads_copy\.sh     u:object_r:preloads_copy_exec:s0

查找示例SELinux上下文文件:device/google/marlin/sepolicy/preloads_copy.te

  1. 在构建时,必须将具有预加载内容的目录复制到 system_other分区:
# Copy contents of preloads directory to system_other partition
PRODUCT_COPY_FILES += \
    $(call find-copy-subdir-files,*,vendor/google_devices/marlin/preloads,system_other/preloads)

这是一个Makefile中的更改示例,它允许将来自供应商的Git存储库(本例是vendor/google_devices/marlin/preloads)中的APK缓存资源复制到system_other分区上的位置,该位置稍后将被复制到/data/preloads当设备首次启动时。此脚本在构建时运行以准备system_other映像。它希望预加载的内容在vendor/google_devices/marlin/preloads中可用。OEM可以自由选择实际的仓库名称/路径。

  1. APK缓存位于/data/preloads/file_cache并具有以下布局:
/data/preloads/file_cache/
    app.package.name.1/
          file1
          fileN
    app.package.name.N/

这是设备上的最终目录结构。只要最终文件结构复制上述文件结构,OEM就可以自由选择任何实现方法。

方法2. 在出厂时存存储用户数据镜像的内容

此替代方法假定预加载的内容已包含在/data分区的/data/preloads目录中。

赞成:开箱即用(无需进行设备自定义即可在首次启动时复制文件)。内容已在 /data分区上。

反对:恢复出厂设置后,预加载的内容会丢失。虽然这对某些人来说可能是可以接受的,但对于在进行质量控制检查后恢复出厂设设备的OEM可能并不总是有效。

新@SystemApi方法,getPreloadsFileCache()加入到 android.content.Context。它返回预加载缓存中特定于应用程序的目录的绝对路径。

添加了一个新方法,IPackageManager.deletePreloadsFileCache允许删除preloads目录以回收所有空间。该方法只能由具有SYSTEM_UID的应用程序调用,如“系统服务”或“设置”。

应用准备

只有特权应用程序才能访问预加载缓存目录。对于该访问,应用程序必须安装在/system/priv-app目录中。

验证

  • 首次启动后,设备应在/data/preloads/file_cache目录中包含内容 。
  • 如果设备的存储空间不足,则必须删除file_cache/目录中的内容。

使用示例ApkCacheTest 应用程序来测试APK缓存。

  1. 通过从根目录运行下面命令来构建应用程序:
$ make ApkCacheTest
  1. 将应用程序安装为特权应用程序。(记住,只有特权应用才能访问APK缓存)。这需要已root的设备:
$ adb root && adb remount
$ adb shell mkdir /system/priv-app/ApkCacheTest
$ adb push $ANDROID_PRODUCT_OUT/data/app/ApkCacheTest/ApkCacheTest.apk /system/priv-app/ApkCacheTest/
$ adb shell stop && adb shell start
  1. 如果需要,模拟文件缓存目录及其内容(也需要root权限):
$ adb shell mkdir -p /data/preloads/file_cache/com.android.apkcachetest
$ adb shell restorecon -r /data/preloads
$ adb shell "echo "Test File" > /data/preloads/file_cache/com.android.apkcachetest/test.txt"
  1. 测试应用程序。安装此应用并创建测试file_cache目录后,打开ApkCacheTest应用程序。它应该显示一个test.txt文件及其内容。请参阅此屏幕截图,了解这些结果在用户界面中的显示方式。
图 1. ApkCacheTest结果
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,364评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,114评论 9 467
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,127评论 2 34
  • 就是没完没了的下雨。 一月接着二月接着三月…… 四点多天就黑了。
    doiwant阅读 225评论 0 0