Overlay作用:
保持原生源码资源不变的基础上,实现某些UI的客制化。
通过overlay覆盖现有系统或应用中的资源。如strings, config, drawable...
Overlay实现:
两种方式:
1. 静态overlay,SRO-Static resource overly
资源替换发生在编译时, 需要在Android源码环境中进行配置。最终生成一个apk。
使用条件:有源码环境。
好处:内存占用少。
实现:
四個mk的變量:
DEVICE_PACKAGE_OVERLAYS--
PRODUCT_PACKAGE_OVERLAYS--級別最高,也就是優化用PRODUCT_PACKAGE_OVERLAYS中的overlays(高於DEVICE_PACKAGE_OVERLAYS)
PRODUCT_ENFORCE_RRO_TARGETS
PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS
在Android O上面 Google增加了一個enforced RRO的方法,可以把之前的build time overlay強制轉換成runtime resource overlay.如果overlay的是framework-res的資源包,那麼會自動生成一個file在/vendor/overlay/framework-res__auto_generated_rro.apk. 裏面會包含overlay的資源。也就是說,對於加了PRODUCT_ENFORCE_RRO_TARGETS的模塊,便由SRO變成RRO模式,如果仍然想保持SRO模式,就需要使用到PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS變量。
overlay只是覆蓋已有的資源文件,但對於新增的資源文件,需要這樣寫:
<!-- add for status bar system icon define -->
<add-resource type="string" name="status_bar_child_mode"/>
<string translatable="false" name="status_bar_child_mode">child_mode</string>
2. 动态overlay,即运行时overlay。RRO-Runtime resource overlay
资源替换发生在运行时,不必要源码。替换的资源会独立生成一个*.overlay.apk。
好处:不需要源码,可以为第三方app进行资源替换。
实现:overlay apk 的manifest中加入
<overlay android:targetPackage="com.xxx.xxx" android:priority="1"/>