问题描述
Android13-EDLA项目中,因认证需求,APK的API必须支持到33,此前使用的Android原生的DeskClock无法满足API-33的要求;所以适配最新版本的GoogleDeskClock(支持API-33);适配后发现原先透明的时钟插件变成了白色背景,且UI显示不全。如下图所示;
Launcher3适配GoogleDeskClockleukemia参考 Android13 原生Launcher3兼容Google Deskclock
原因分析:
Android 12上Google时钟插件新增插件样式功能,可以设置为白色底和透明两种样式。默认白色底,设置为白色底时,若插件太小,UI 会显示不全;此前的原生DeskClock无此问题,且只有透明样式
解决方案:
1.按道理,因为插件小显示不全,只要把插件放大即可,此处的时钟插件大小为3×1,修改成3×2即可解决问题,但是因为3×2的时钟插件UI太大,不符合产品需求,所以此方案在这个项目中行不通。
如何修改时钟插件大小?可以在添加时钟插件的xml文件中修改大小;
例如我是在vendor\partner_gms\apps\GmsSampleIntegration\res_dhs_full\xml\partner_default_layout.xml 中添加的时钟插件。
<appwidget screen="0" x="2" y="1" packageName="com.google.android.deskclock" className="com.android.alarmclock.DigitalAppWidgetProvider" spanX="3" spanY="1"/>
此处的 spanX=“3” spanY=“1” 就是插件在桌面中的大小,spanX代表宽,spanY代表高
2.因为GoogleDeskClock无源码,无法通过修改样式源码来实现目的;但可以尝试 Overlay动态资源替换(RPO)方式来替换Google应用中的资源文件。
因为是桌面插件(小组件),插件提供者会在 appwidget-provider 中定义插件的布局、大小、 宽高、预览图片、更新间隔 等基本配置信息。Appwidget相关的知识这里不细说,可自行百度了解。参考 Android Widget 基础介绍以及常见问题
通过反编译GoogleDeskClock发现 digital_appwigget.xml 如下:
<?xml version="1.0" encoding="utf-8"?><appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="@dimen/default_legacy_digital_widget_width"
android:minHeight="@dimen/default_legacy_digital_widget_height"
android:updatePeriodMillis="0"
android:initialLayout="@layout/loading_widget"
android:previewImage="@drawable/appwidget_legacy_digital_clock_preview"
android:resizeMode="vertical|horizontal"
android:minResizeWidth="0dp"
android:minResizeHeight="0dp"
android:widgetCategory="keyguard|home_screen"/>
<dimen name="default_legacy_digital_widget_height">117dp</dimen><dimen name="default_legacy_digital_widget_width">203dp</dimen>
DigitalAppWidget 的 minWidth 为 203dp ,minHeight为117dp。
通过修改 default_legacy_digital_widget_height 和 default_legacy_digital_widget_width 实现放大DigitalAppWidget ;具体修改如下:
1. 在vendor\partner_gms\overlay目录下新增DeskClockGoogleOverlay,内容如下
res 是需要替换的资源文件
dimens.xml
<?xml version="1.0" encoding="utf-8"?><resources><dimen name="default_legacy_digital_widget_height">240dp</dimen><dimen name="default_legacy_digital_widget_width">500dp</dimen><dimen name="default_digital_widget_height">240dp</dimen><dimen name="default_digital_widget_width">500dp</dimen></resources>
Android.bp 文件如下:
runtime_resource_overlay {
name:"DeskClockGoogleOverlay",
resource_dirs:["res"],
vendor:true,
sdk_version:"current",}
AndroidManifest.xml 如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.google.android.deskclock.overlay"
android:versionCode="1"
android:versionName="1.0"><application android:hasCode="false"/><overlay android:targetPackage="com.google.android.deskclock" android:priority="1" android:isStatic="true"/></manifest>
package 定义包名,一般命名为目标的apk包名.overlay
targetPackag为目标包名; android:priority 优先级
2. 另外还需要添加预编译,vendor\partner_gms\products\gms.mk 新增 DeskClockGoogle
# DeskClockGoogleRRO packages
PRODUCT_PACKAGES+=DeskClockGoogleOverlay
3. 测试发现, DigitalAppWidget无法通过 minWidth 和 minHeight随意放大,可能是桌面行高和列宽限制,具体原因暂不明确。在12小时制时插件字体仍会贴边显示,所以设置默认24小时。
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
+<string name="time_12_24" translatable="false">24</string>
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadIntegerSetting(stmt,Settings.System.POINTER_SPEED,R.integer.def_pointer_speed);++//defect 24+loadStringSetting(stmt,Settings.System.TIME_12_24,R.string.time_12_24);/*
* IMPORTANT: Do not add any more upgrade steps here as the global,
4. 最终修改效果
总结
- 无源码且需要修改资源的情况下可以使用Overlay动态资源替换(RPO)方式实现,
- 此问题中DigitalAppWidget的宽度改变很小,无法随意设置大小,如果有更好的方式,欢迎一起交流讨论。
- 此解决方案可能只适用本项目,若有更好的方式,欢迎指教。
参考
Android Widget 基础介绍以及常见问题
Android Overlay动态资源替换(RPO)踩坑日记
android overlay app,修改字符串资源
Launcher插件显示被截断
版权归原作者 五八哥 所有, 如有侵权,请联系我们删除。