柯达云相框adb自定义启动实现智能家居信息展示
成果展示
一个非常实用的东西,最关键的是家里的领导表示很满意,第一她每个月交电费,比较关注这个,二来放在客厅,瞄一下就能看到天气预报,第三,当作装饰展示,画面也还不错。可以说是折腾到现在,她最满意的一件作品。
| 类别 | 电力监测 | 天气预报 |
|---|---|---|
| 实拍 | ![]() |
![]() |
| 网页截图(白天) | ![]() |
![]() |
| 网页截图(夜晚) | ![]() |
/ |
前言
继上一篇使用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
准备一个U盘:设备仅支持最大 64GB、格式为 FAT32;
下载 Terminal Emulator 存放到U盘;
将前文的基础维护工具 Text Launcher 、VirtualSoftKeys一起存放到U盘
将U盘插在设备背面USB口
进入设备的原生Andriod界面,打开 APK安装器 或者 进入 文件管理器 进行安装
打开 Terminal Emulator 应用,在相框屏幕上依次输入以下四行命令(参考: 无线 ADB 开启指南):
su setprop service.adb.tcp.port 5555 stop adbd start adbd查看设备的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 注入公钥方案):
导出电脑公钥到 U 盘:在终端执行以下命令将公钥复制到 U 盘根目录(也可以打开到对应的文件夹内,显示隐藏文件,把
/Users/你的用户名/.android/adbkey.pub拖进 U 盘同时改名为adb_keys):cp ~/.android/adbkey.pub /Volumes/你的U盘名称/adb_keys拷贝到相框内置存储:将 U 盘插回相框,打开相框自带的“文件管理器”,复制
adb_keys到内置存储(Internal Storage)根目录下。在相框终端写入系统信任库:打开设备上的 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在电脑上重连:回到电脑终端重启 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
在电脑上下载Android System WebView 138.0.7204.63 (arm64-v8a + arm-v7a) (Android 8.0+),放到桌面并重命名为
webview.apk。版本千万不能搞错,安装标有
Android 8.0+的,强行替换会导致 WebView 彻底瘫痪!在终端依次执行以下命令替换系统内核(如果上一步中
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相框重启后,在电脑终端
adb connect <相框ip>:5555重新连接,再用adb shell dumpsys webviewupdate查看版本已变为138.0.7204.63。此时打开WebView浏览器,网页内容都能正常显示出来就算完成了。
第三步:接管开机桌面并禁用内置启动器
因为我的需求是为了把相框变成智能家居屏,不需要卸载原厂应用(以防丢失底层设置入口),只要用新的启动器接管桌面,同时禁用原本的启动器:
安装kiFOSSk启动器
在电脑上下载kiFOSSk启动器:GitHub - ShinyDiscoBallsDev/kiFOSSk: Lightweight FOSS kiosk browser for dashboards
adb安装:在电脑终端使用
adb install kiFOSSk-v1.1.4-release.apk隔空安装准备一个需要展示的网页(或者直接使用HomeAssistant的后台地址,由于是触摸屏,展示后可以在屏上登陆进行操作)
打开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 推送通知与月度账单设置
显示界面亮度与天气的配置
数据报表的导出














