Skia Cache Miss 1.0方案适配更新说明

注意事项

  • 由于shader cache与平台相关,因此建议针对不同平台做单独适配
  • 建议在硬件和软件平台稳定之后再做方案适配,且最好使用P2的机器,否则会由于硬件和软件不同导致缓存失效
  • 当前1.0方案预制的是二进制缓存,在GPU驱动升级后缓存会失效,因此需要在GPU驱动升级后更新缓存。GPU驱动可能会频繁更新,建议各适配方视情况针对重点机型和重点阶段做缓存优化
  • 系统层(比如Framework)和应用自身更新有时也会导致缓存失效
  • 当前方案可以有效解决首次启动时大量Cache Miss连续出现导致的卡顿问题,但依然会存在偶然的个别单独Cache Miss无法消除的现象。出现这种情况时,可以尝试尽可能多的遍历场景并生成cache,但不保证能完全解决该问题

适配过程

这里以N18平台适配home.miui.home为例,具体说明适配过程

步骤一、生成cache

  1. 刷机:建议刷最新版的daliy包
  2. root和remount

adb root && adb remount

首次刷机可能会遇到remount之后

adb disable-verity

adb reboot

adb root && adb remount

  1. 查询方案是否已经配置过

adb shell getprop | grep precache

  • 如果平台上查询配置此机型没有经过配置的话,和上图一致,可跳过步骤4和步骤5
  • 如果平台上查询配置是下图,继续执行步骤4

  1. 设置property

adb shell setprop persist.sys.precache.enable false

  1. 清除应用的原有cache

adb shell stop

adb shell “rm -rf /data/user_de/0/com.miui.home/cache/*”

adb shell start

  1. 运行应用,执行需要优化的场景,比如启动、界面滑动和退出等,此时应用会自动生成对应的cache

步骤二、提交change

  1. 下载代码

需要下载的代码仓:device/xiaomi/[机型名称],比如对于N18,其对应的仓为device/xiaomi/goku

所在分支可以通过步骤一中Rom的product组件下的manifest查询,如N18的product下的manifest

当前N18的product组件下的device/xiaomi/goku仓,使用master-v-qcom分支

  1. 修改mk文件

product/miui/miui_[机型名称].mk添加编译property项

PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.enable=true

PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.number=1

PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.appstrs1=com.miui.home

注意:

  • 需要添加到有precache注释的代码下,如果原本已有上面两个property配置,则只需要对其修改即可
  • 可能会有多个以数字结尾的persist.sys.precache.appstrs项,每个property项总长度不要超过90,单个property项中以半角逗号分割不同应用名称。
  • 如果某个persist.sys.precache.appstrs已经包含了当前需要适配的应用的包名,则不需要再次修改mk文件
  • 如果当前最新property大小不足,则可以添加新的persist.sys.precache.appstrs,这里的结尾数字需要与前面的persist.sys.precache.number值一致
  • 如果当前最新property大小不足,则可以添加新的persist.sys.precache.appstrs,此时还需要对应的修改persist.sys.precache.number
  • 如果是非国内版,则需要区分region,如下所示
查询get-miproduct-region的定义,目前在部分mk中get-miproduct-region只定义了cn、global、eea, 且盘古编译选择海外版是
build_region=global
[2024-12-18T13:28:04.303Z] device/xiaomi/missi/definitions.mk:101: warning: is-missi-region-cn is 
[2024-12-18T13:28:04.303Z] device/xiaomi/missi/definitions.mk:102: warning: is-missi-region-eea is 
[2024-12-18T13:28:04.303Z] device/xiaomi/missi/definitions.mk:103: warning: is-missi-region-global is true
这个造成当我们是针对IN TR等其他国际版适配时无法准确获取到region区分
以IN为例,大家可以查看ROM编译log查看TARGET_MOD_DEVICE
[2024-12-18T13:22:58.135Z] + export TARGET_MOD_DEVICE=fire_in_global
[2024-12-18T13:22:58.135Z] + TARGET_MOD_DEVICE=fire_in_global
后续限制IN、TR等版本时可以改成
else ifneq ($(findstring in, $(BUILD_TARGET_MOD_DEVICE)),)
# pre cache setting and shader cache files
ifeq ($(call get-miproduct-region), cn)
PRODUCT_COPY_FILES += \
    $(call find-copy-subdir-files,*,device/xiaomi/sheng/product/miui/cn/shader_cache,$(TARGET_COPY_OUT_PRODUCT)/etc/shader_cache)
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.enable=true
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.number=1
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.appstrs1=com.miui.home,com.android.systemui
 
else ifeq ($(call get-miproduct-region), global)
PRODUCT_COPY_FILES += \
    $(call find-copy-subdir-files,*,device/xiaomi/sheng/product/miui/global/shader_cache,$(TARGET_COPY_OUT_PRODUCT)/etc/shader_cache)
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.enable=true
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.number=1
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.appstrs1=com.miui.home,com.android.systemui
 
else ifeq ($(call get-miproduct-region), xxx)
PRODUCT_COPY_FILES += \
    $(call find-copy-subdir-files,*,device/xiaomi/sheng/product/miui/xxx/shader_cache,$(TARGET_COPY_OUT_PRODUCT)/etc/shader_cache)
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.enable=true
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.number=1
PRODUCT_PRODUCT_PROPERTIES += persist.sys.precache.appstrs1=应用包名
 
endif

appstr后面大家列举应用名单时单个字符串最多90个字符

appstr后面大家列举应用名单时应用与应用之间用”,“相隔就好,不用空格

  1. 新建cache目录

目录位置:product/miui/cn/shader_cache/com.miui.home/

注意:上面的cn对应的是国内机型,如果是适配国外机型,则应该替换为对应的缩写,早期机型可能未做国内和国际区分,因此也可能没有cn这一级目录(原则是cache的路径必须要和上一步中mk文件所配置的路径一致)。适配国际版部分机型可能没有global、eea等文件夹,自行创建。

  1. 拉取缓存到上述新建的cache目录,注意这一步骤需要在cache生成(步骤一.5)完成一段时间后(至少4s)再拉取缓存,因为cache的落盘会有一个4s以上的延迟。

cd product/miui/cn/shader_cache/com.miui.home/

adb pull /data/user_de/0/com.miui.home/cache/com.android.skia.shaders_cache

adb pull /data/user_de/0/com.miui.home/cache/com.android.opengl.shaders_cache

某些应用可能不存在com.android.opengl.shaders_cache ,属于正常现象

  1. 提交change到gerrit

以O2机型为例,适配home,systemui,personalassistant,provision为例其最终的change如下

https://gerrit.pt.mioffice.cn/c/device/xiaomi/haotian/+/4486507

注意:后续提交 change 请备注GPU Version

可以使用adb shell dumpsys SurfaceFlinger | grep -iE GLES查询

最终的效果展示类似与下图

步骤三、打包验证

将上一步提交的change,放到product组件下,打包ROM,并刷机

  1. 查看property

adb shell getprop | grep persist.sys.precache.appstrs

确保以上打印出的property中包含对应的包名,如com.miui.home

  1. 查看预制缓存

adb shell ls -al /product/etc/shader_cache/com.miui.home

确保存在cache文件,查看放置进的文件大小和你提交的文件大小是否一致

  1. 验证没问题之后,就可以将change合入了

步骤四、云控配置(可选)

该功能可以通过云控打开和关闭。云控没有配置时,功能默认打开。具体云控配置由@叶男 @Felix Liu 刘飞 负责

缓存更新

GPU驱动更新时需要重新预制缓存,此时只需要按照前面的适配过程,重新制备com.android.skia.shaders_cachecom.android.opengl.shaders_cache两个缓存文件即可,mk文件不需要再做更新。

GPU驱动更新时会在以下群内通知,请各位加群并关注所负责机型的更新信息