成果展示

一个非常实用的东西,最关键的是家里的领导表示很满意,第一她每个月交电费,比较关注这个,二来放在客厅,瞄一下就能看到天气预报,第三,当作装饰展示,画面也还不错。可以说是折腾到现在,她最满意的一件作品。

类别 电力监测 天气预报
实拍
网页截图(白天)
网页截图(夜晚) /

前言

继上一篇使用Respeaker Lite + ESP32S3搞定家庭AI对话的DIY实践之后,对于设备DIY以及智能家居有了更深的认识以及探索欲望,深夜辗转反复,寻思着家里还能添置哪些好玩的东西,导致久久不能入眠。上一篇之后立下的不熬夜的flag立马抛之脑后。

网上看着各种设备,看中了 reterminal E1004 13.3英寸全彩电子墨水屏 ,但是售价要2200,无疑是一笔巨额开支,本着加入购物车,眼睛满足的前提下,突发灵感,想到我有一台 2023 年买的 柯达KODAK RWF-116 云相框 ,已经闲置好几年了,想着废物利用,能不能root变成普通的Android设备,然后自定义展示内容。

前期准备

一、查资料

心动不如行动,查询资料。

这台设备是深圳秋雨电子(Shenzhen Qiuyu Electronic)代工的 KODAK RWF-116(主板与 KODAK RWF-108H 共用模组,通常基于 Rockchip 32位 ARM 架构的精简版 Android 系统)。

二、确认需求

由于我只是要展示智能家居的状态,不需要改动Andriod底层,因此无需root,仅需adb权限即可。

不动root的情况,可以完美保留柯达相框,对我来说,安装一个桌面启动器,以及界面展示的应用就可以达到需求。

开启开发者模式

确定是:Android 系统 就好办多了,通过尝试疯狂点击 【固件型号】看能否进入 原生的Android桌面,能进入的话,说明有操作可能。还好可以比较顺利,能够进入Android桌面。

不同型号、不同固件版本可能有些许区别,但是如果进不了原生界面的话,就无法开启USB调试功能。
当然有些设备可能默认帮你开启了,可以用miniUSB连接电脑进行尝试。

来到【设置】-【系统】,继续疯狂点击设备型号,底部会提示:”已打开开发者模式“。

接着返回,找到【开发者模式】界面,找到【USB调试】并开启。

一、准备基础维护工具

相框自带的 kodaframeandroid 是默认桌面(Launcher)。千万不要尝试在安装新桌面启动器之前卸载它,否则重启后会黑屏无法进入系统:

  • 安装备用极简桌面:安装轻量级开源启动器 Text Launcher 或保留系统设置在桌面,确保随时能退回配置界面。

  • 安装悬浮返回键:因为没有物理返回/主页键,一但进入应用后将无法退出,安装 VirtualSoftKeys 并在“设置 -> 无障碍”中开启服务,提供边缘呼出的虚拟导航栏。

二、ADB

有线ADB

根据 KODAK RWF-108H 官方说明书,机身背部的标准 USB 接口是 Host 口(仅用于插 U 盘);miniUSB 才是连接电脑的数据口。

将电脑与miniUSB连接,正常情况可能已经识别了。

但是!!!我遇到的最大问题就是无法连接,为此还以为是数据线有问题,特地叫了跑腿买了根miniUSB转typeC的数据线,插上仍然无法连接。可能是因为MacOS的问题,由于没有Windows电脑,无法尝试。

尝试 开启无线ADB ,一方面可以规避有线连接的不识别问题,另一方面也方便以后通过网络进行调试。

无线ADB

  1. 准备一个U盘:设备仅支持最大 64GB、格式为 FAT32;

  2. 下载 Terminal Emulator 存放到U盘;

  3. 将前文的基础维护工具 Text Launcher 、VirtualSoftKeys一起存放到U盘

  4. 将U盘插在设备背面USB口

  5. 进入设备的原生Andriod界面,打开 APK安装器 或者 进入 文件管理器 进行安装

  6. 打开 Terminal Emulator 应用,在相框屏幕上依次输入以下四行命令(参考: 无线 ADB 开启指南):

    su
    setprop service.adb.tcp.port 5555
    stop adbd
    start adbd
  7. 查看设备的Wi-Fi地址,在电脑上使用 Android SDK Platform-Tools进行连接,macOS直接使用 brew install android-platform-tools 即可在终端连接。

由于设备底层的问题,每次重新连接网络,设备MAC地址都会变动,因此设备连接Wi-Fi的时候,强烈建议手动分配地址!!!每次都要查看IP地址很麻烦!!!

由于macOS与Windows的操作方法大同小异,以下涉及到一些adb命令,均为macOS下实践。如果是Windows设备,应该也仅需将adb加入到系统环境变量中即可。

无线ADB的认证

此时,我在电脑终端尝试通过 adb connect 10.1.1.153:5555 连接时提示: failed to authenticate to 10.1.1.153:5555

$root:~ adb connect 10.1.1.153:5555
failed to authenticate to 10.1.1.153:5555

这是一个好消息 —— 说明相框的无线 ADB 服务(5555 端口)已经成功启动并与我的电脑建立了连接,只是卡在了 RSA 密钥授权验证 。

可以直接将电脑的 ADB 公钥写入相框的信任目录 /data/misc/adb/adb_keys(参考 Stack Overflow Root 注入公钥方案):

  1. 导出电脑公钥到 U 盘:在终端执行以下命令将公钥复制到 U 盘根目录(也可以打开到对应的文件夹内,显示隐藏文件,把 /Users/你的用户名/.android/adbkey.pub 拖进 U 盘同时改名为 adb_keys):

    cp ~/.android/adbkey.pub /Volumes/你的U盘名称/adb_keys
  2. 拷贝到相框内置存储:将 U 盘插回相框,打开相框自带的“文件管理器”,复制adb_keys到内置存储(Internal Storage)根目录下。

  3. 在相框终端写入系统信任库:打开设备上的 Terminal Emulator,依次输入以下命令:

    su
    mkdir -p /data/misc/adb
    cp /sdcard/adb_keys /data/misc/adb/adb_keys
    chmod 644 /data/misc/adb/adb_keys
    chown system:shell /data/misc/adb/adb_keys
    stop adbd
    start adbd

  4. 在电脑上重连:回到电脑终端重启 ADB 服务并重连:

    adb kill-server
    adb connect <相框ip>:5555
    adb shell

到此,应该是连接成功了。

连上 adb shell 后,可以先运行 getprop ro.build.version.release 和 getprop ro.product.cpu.abi 查看相框的精确 Android 版本与 CPU 架构。

主板是瑞芯微 Rockchip RK3326,系统还是完整的64 位 (arm64-v8a) Android 8.1.0 架构。
可玩性可以说非常高。

改造升级

第一步:固化无线 ADB、同步时间并抓取原厂包名

回到终端界面:

# 1. 让无线 ADB 永久开机自启
adb shell su -c "setprop persist.adb.tcp.port 5555"

# 2. 将电脑当前时间同步给相框
adb shell su -c "date $(date +%m%d%H%M%Y.%S)"

# 3. 开启插电状态下屏幕常亮不休眠
adb shell su -c "svc power stayon true"

# 4. 查看当前 WebView 版本、安装路径以及原厂应用包名
adb shell "dumpsys webviewupdate | grep -E 'Current WebView|package:'"
adb shell pm path com.android.webview
adb shell "pm list packages | grep -iE 'koda|frame|rk|update|auth|check'"

原厂应用包名建议保存下来,后续会涉及到自启以及禁用自启的操作。或者后面根据需求再查包名。

第二步:升级系统 WebView 内核

RK3326 Android 8.1 出厂自带的 com.android.webview 是 2017 年的 Chromium 61,不支持现代前端语法。也就是说,版本太老,现代的网页很多内容都无法正常的加载出来。参考:Frameo as HASS Wall Mounted Dashboard - Share your Projects! - Home Assistant Community

  1. 在电脑上下载Android System WebView 138.0.7204.63 (arm64-v8a + arm-v7a) (Android 8.0+),放到桌面并重命名为 webview.apk。

    版本千万不能搞错,安装标有 Android 8.0+ 的,强行替换会导致 WebView 彻底瘫痪!

  2. 在终端依次执行以下命令替换系统内核(如果上一步中 pm path com.android.webview 输出的路径不是 /system/app/webview/webview.apk,替换成实际的路径,正常是没问题的):

    adb push ~/Desktop/webview.apk /sdcard/webview.apk
    adb shell su -c "mount -o remount,rw /system"
    adb shell su -c "cp /system/app/webview/webview.apk /system/app/webview/webview.apk.bak"
    adb shell su -c "rm -rf /system/app/webview/oat"
    adb shell su -c "cp /sdcard/webview.apk /system/app/webview/webview.apk"
    adb shell su -c "chown root:root /system/app/webview/webview.apk"
    adb shell su -c "chmod 644 /system/app/webview/webview.apk"
    adb shell su -c "mount -o remount,ro /system"
    adb reboot
  3. 相框重启后,在电脑终端 adb connect <相框ip>:5555 重新连接,再用 adb shell dumpsys webviewupdate 查看版本已变为 138.0.7204.63。此时打开WebView浏览器,网页内容都能正常显示出来就算完成了。

第三步:接管开机桌面并禁用内置启动器

因为我的需求是为了把相框变成智能家居屏,不需要卸载原厂应用(以防丢失底层设置入口),只要用新的启动器接管桌面,同时禁用原本的启动器:

安装kiFOSSk启动器

  1. 在电脑上下载kiFOSSk启动器:GitHub - ShinyDiscoBallsDev/kiFOSSk: Lightweight FOSS kiosk browser for dashboards

  2. adb安装:在电脑终端使用 adb install kiFOSSk-v1.1.4-release.apk 隔空安装

  3. 准备一个需要展示的网页(或者直接使用HomeAssistant的后台地址,由于是触摸屏,展示后可以在屏上登陆进行操作)

  4. 打开kiFOSSk,并输入上一步需要展示的网页的地址,保存并应用即可

关于展示页面:

简单点的话直接使用HomeAssistant的后台界面就行,简单实用,平时需要开关灯这类操作,可以直接在这块屏上直接点击。

复杂点的话让AI写一个接入HomeAssistant的接口的网页,比如我的HomeAssistant中有家庭用电的数据,先在创建一个HomeAssistant的长期访问令牌,再将关于用电数据的实体ID复制下来,一股脑的交给AI,让它帮你创建一个本地可以跑的简单网页程序。

禁用内置启动器

内置的启动一般是:

包名 用途
com.android.launcher3/com.android.launcher3.Launcher 系统原生桌面
com.shinydiscoballsdev.kifossk/com.shinydiscoballsdev.kifossk.MainActivity 当前 Kiosk 启动器
com.cloudhearing.digital.kodakframe.android/...StartActivity 设备自带的相框启动器
com.android.settings/com.android.settings.FallbackHome 系统兜底桌面,优先级 -1000,一般不主动选

我们可以直接通过 ADB 锁定默认主屏幕并冻结冲突启动器,分别执行以下命令:

# 1. 强制将 kiFOSSk 写入系统底层设为唯一默认主屏幕
adb shell su -c "cmd package set-home-activity com.shinydiscoballsdev.kifossk/.MainActivity"

# 2. 查看当前系统里还有哪些桌面程序在抢占 HOME 入口
adb shell "cmd package query-activities --brief -a android.intent.action.MAIN -c android.intent.category.HOME"

# 3. 关闭自动更新
adb shell su -c "pm disable-user --user 0 android.rockchip.update.service"

# 4. 关闭各启动器
adb shell su -c "pm disable-user --user 0 com.android.launcher3"
adb shell su -c "pm disable-user --user 0 com.cloudhearing.digital.kodakframe.android"

# 4. 验证当前默认桌面是否已成功绑定为 kiFOSSk
adb shell "cmd package resolve-activity --brief -a android.intent.action.MAIN -c android.intent.category.HOME"

日后若想恢复柯达原厂相框,只需将 disable-user --user 0 改为 enable 即可。

其他:远程调试

上文中用的命令都是终端不带界面的,要想带界面调试,可以使用scrcpy

macOS上面先安装 brew install scrcpy,然后使用 scrcpy --tcpip=<相框ip>:5555 来显示并且操作:

最后

这次折腾只花了两天时间,没有怎么熬夜,白天就差不多搞定了。

当然除了这个相框因为是光滑的屏幕导致有点反光之外,其他效果都还不错,能操作能显示。

我最终的方案是通过HomeAssistant的长期访问令牌读取电力数据,让AI帮我写了个电力监控以及天气预报的每10分钟轮转的界面,这样可以完美适配这块屏幕,再加一个后台设置实现以下四项功能:

  • 不同阶梯电价设置

  • Bark 推送通知与月度账单设置

  • 显示界面亮度与天气的配置

  • 数据报表的导出