学习站实测:在刷好安卓 11 的 ThinkSmart View 上,从源码把开源学习站装起来

第一部分:概述与结论

缘起

X 上 @SamyeeiYu(反方向的钟)开源了 thinksmart-learning-station:一台两百多元的二手联想 ThinkSmart View,装上他自制的桌面、家长端、手动键盘等组件,再配官方 ChatGPT 应用和 MusicFree,就成了一台带连续语音、拍题提问、中文输入和家长查看的学习终端。项目地址:https://github.com/samyeei/thinksmart-learning-station ,原帖:https://x.com/samyeeiyu/status/2116374849769914773

关键前提:作者的参考环境是这台机器的原厂安卓 8.1,文档也写明这是源码预览版、只在作者自己一台设备上验过。我们这台不同:同一天刚刷成带谷歌套件的安卓 11(刷机过程以后单独成文)。教程在新两代的系统上还能不能照做,就是本文要验的事。

实测结论速览

  • 从源码构建:✅ 通过。工具链从零搭好后一次构建成功(中途唯一失败是环境变量问题,与代码无关,见步骤 1 的注意)。
  • 官方安装脚本:在安卓 11 上被它自带的版本门槛如实拦下——这是负责任的设计,不是 bug。我们没有改门槛放行,改走逐个手动安装。
  • 五个组件:四个半可用。家长端、桌面、重启按钮(预期形态)、手动键盘均正常;不息屏开关本体可用,但桌面卡片的状态同步在安卓 11 上失效(已知问题 #1)。
  • 家长监督:✅ 全环通过(设密码→服务→授权→手机同网查看)。短板是家长页走未加密 HTTP,只能在可信家庭网络内用。
  • 中文键盘:✅ 已按官方脚本启用(含设置备份);真机打字全套验收我们尚未做完,如实挂账。
  • 官方 ChatGPT 应用:✅ 本次最大悬念落地——32 位老机器在 Play 商店正常装上当前版本并登录,桌面大卡可直达。
  • 音乐:MusicFree 能装能开,但它的本地扫描在这台安卓 11 机器上失效(已知问题 #2);我们改用系统自带「音乐」播放本地文件,正常。音频只用授权干净的来源(VOA 公版课程等)。
  • 一个教程没写的代价:把学习桌面设为默认主屏幕后,没有应用列表入口,其他应用在桌面上点不到(详见步骤 9)。

总评:作者的声称基本属实,但「开箱即用」不属实——换设备、换系统版本,就要逐项趟雷。下面第二部分是完整可复现的步骤,命令都来自官方文档与我们这次的实测记录;凡是我们没验完的地方,都明确标注了状态,不写成已完成。

成本与前置

  • 费用:软件全部开源或免费,0 元;设备为二手 ThinkSmart View,两百多元;时间约一晚。
  • 前置条件:一台已装好可用安卓系统(带谷歌服务更佳)的 ThinkSmart View;一台 Windows 电脑;一条能传数据的 USB 线;一个移动硬盘目录用于备份(官方脚本硬性要求,且目录必须事先存在)。

第二部分:详细步骤(安卓 11 实测版)

以下命令在 Windows 的 CMD 中执行;<设备序列号>替换为你自己设备 adb devices 显示的序列号,不要照抄别人的。

步骤 0:准备清单

电脑端工具链(版本与官方要求对齐):

sdkmanager "platforms;android-37.2" "build-tools;37.0.0" "platform-tools"

并设置环境变量 ANDROID_HOME 指向 SDK 根目录。

git clone https://github.com/samyeei/thinksmart-learning-station

(网络不便时也可下载仓库 ZIP 解压,效果相同。)

后续步骤还要另行获取的文件/应用,先有个清单:官方 ChatGPT 应用(步骤 7)、Fcitx5 输入法(步骤 6)、MusicFree 安装包(步骤 8),都在各自步骤里给官方来源。

步骤 1:构建

在项目根目录执行:

gradle --no-daemon testDebugUnitTest assembleDebug
node app/src/test/js/parent-login.test.cjs
node app/src/test/js/parent-password.test.cjs
python -m unittest discover -s scripts/tests

成功标志:BUILD SUCCESSFUL,且五个模块的 APK 出现在固定路径(这是后面手动安装的弹药):

模块 APK 路径 包名 作用
app app/build/outputs/apk/debug/app-debug.apk local.thinksmart.chatgpt 家长端/主应用
dashboard dashboard/build/outputs/apk/debug/dashboard-debug.apk local.thinksmart.dashboard 学习桌面
screen-toggle screen-toggle/build/outputs/apk/debug/screen-toggle-debug.apk local.thinksmart.screenmode 不息屏开关
reboot-button reboot-button/build/outputs/apk/debug/reboot-button-debug.apk local.thinksmart.reboot 重启按钮
manual-keyboard manual-keyboard/build/outputs/apk/debug/manual-keyboard-debug.apk local.thinksmart.manualkeyboard 手动键盘

注意(我们踩过的坑):第一次构建若报 SDK location not found,先别怀疑代码——多半是运行 Gradle 的进程没继承到 ANDROID_HOME。最稳的修法是在项目根目录放一个 local.properties,写一行(按你的实际 SDK 路径):

sdk.dir=C:\\Android\\Sdk

我们第一次构建就是栽在这里,补上后 3 分 47 秒构建成功。构建日志里的 Deprecated(过时 API)类提示是警告不是错误,可忽略。

步骤 2:先跑计划模式,别急着装

官方安装脚本默认只出计划、不动设备,先跑它:

python scripts/install.py --serial <设备序列号> --backup-dir <移动硬盘备份目录>
  • 在作者的参考环境(安卓 8.1 / API 27)上,核对计划无误后加 --apply 即可由脚本完成全部安装,还会自动备份旧组件和原息屏时间。
  • 在安卓 11 上(我们的情况),脚本会打印完设备属性后报错停机:大意是「本源码版本只在安卓 8.1/API 27/ARMv7 上验证过」。不要去改脚本里的门槛放行——那是作者的安全设计;改走步骤 3–4 的手动路线,代价只是多敲几条命令,而且每装一个验一个,心里更有底。

步骤 3:装之前先量基线

adb -s <设备序列号> shell settings get system screen_off_timeout
adb -s <设备序列号> shell pm path local.thinksmart.chatgpt

其余四个包名同理。基线的作用:确认五个组件确实未装、记下你原来的息屏时间(手动路线不会动它;脚本路线会把它改成 30 秒,日后恢复要用到原值)。我们这台的原值是 1800000(30 分钟)。

步骤 4:逐个手动安装五个组件

按这个顺序,一个一个来(以 app 为例,其余把路径和包名换成步骤 1 表格里的):

adb -s <设备序列号> install -r app/build/outputs/apk/debug/app-debug.apk
adb -s <设备序列号> shell pm path local.thinksmart.chatgpt

看到 Success 且 pm path 能返回安装路径,再在设备上点开验收,然后装下一个。每个组件的验收点和注意:

  • app(家长端):打开后 ChatGPT 网页应完整加载(输入框、语音按钮、登录入口都在)。注意:不要在这个内置网页里点「登录」死磕——我们实测会卡在人机验证页面,这是内嵌浏览器过反机器人验证的通病;账号登录走步骤 7 的官方应用。
  • dashboard(桌面):大时钟、日期、每日一句、Wi-Fi 图标、四张卡齐全即为正常。此时点 ChatGPT / MusicFree 卡会弹「入口暂不可用」,是因为那两个应用还没装(步骤 7、8),不是故障。
  • screen-toggle(不息屏开关):注意:它没有界面,每启动一次就把开关翻转一次,不要好奇连点。启动后会有提示闪过。我们实测开关本体有效;但桌面「不息屏」卡始终显示「待同步」——已知问题 #1:安卓 11 上两个组件间的状态同步没通(疑似新系统的应用可见性限制),卡的显示是坏的,功能本身可用。
  • reboot-button(重启按钮):点「确认重启」后弹「暂时无法重启 / 桌面管理服务暂不可用」是预期形态。它依赖另一个开源项目 FreeKiosk 的本机接口与密钥,没配置就是不可用,官方文档也如实说明新装默认不能重启。要真重启,用系统电源菜单即可。
  • manual-keyboard(手动键盘):装完先别找它——此时只是「已注册、未启用」,在 ime list -s(只列已启用)里看不到它属正常;用 ime list -a 才能查到注册记录。启用在步骤 6。

步骤 5:家长监督四步

  1. 在设备上打开首次设置界面(若没自动出现,用命令拉起):
adb -s <设备序列号> shell am start -n local.thinksmart.chatgpt/.ParentSetupActivity

密码必须由家长本人在设备上输入(12–128 字符),不要经过聊天、脚本参数或配置文件传递。设置完成后监控服务会自动开始运行。

  1. 授予「使用情况访问」:
adb -s <设备序列号> shell appops set local.thinksmart.chatgpt GET_USAGE_STATS allow
adb -s <设备序列号> shell appops get local.thinksmart.chatgpt

第二条返回 GET_USAGE_STATS: allow 才算授好。

  1. 手机连同一个家里 Wi-Fi,打开 http://<设备局域网IP>:8766,用刚设的密码登录,能看到状态页(前台时长等)即全环通过。我们实测第一次打开可能报连接失败,服务刚启动时有瞬时现象,重试一次即可。

  2. 安全注意(重要):这个家长页是未加密的 HTTP。只在可信的家庭局域网内使用,绝不要用任何方式把它暴露到公网。出门在外要看,建议给设备装 Tailscale(https://tailscale.com)走加密的私有组网通道访问——家长服务监听所有网卡,装好组网即可直达,不用改代码(我们已装;跨网络实测留待后续与家庭组网改造一并验证,本文不夸大)。另外记住:在家长页里改密码后,所有已登录会话立即失效,需要用新密码重新登录。

步骤 6:中文输入(Fcitx5 + 手动键盘)

先装输入法本体:小企鹅输入法 5(Fcitx 5),从 Google Play 搜索安装,或从上游获取:https://github.com/fcitx5-android/fcitx5-android 。装好后打开一次,再启用它:

adb -s <设备序列号> shell ime enable org.fcitx.fcitx5.android/.input.FcitxInputMethodService

然后运行官方启用脚本:

python scripts/keyboard.py --serial <设备序列号> --backup-dir <移动硬盘备份目录> enable

这个脚本做事很规矩,值得说明:它先检查 Fcitx 是否已启用(不在就拒绝执行、不乱改设置),先把原有输入相关设置备份到备份目录的 keyboard-before.json,再授予手动键盘组件所需的开发权限、启用折叠键盘和配套的无障碍服务,最后打印五项设置现状供核对。核对点:已启用输入法里包含 local.thinksmart.manualkeyboard/.CollapsedIme、无障碍服务里包含 local.thinksmart.manualkeyboard/.ManualKeyboardService、无障碍总开关为 1。注意默认输入法此时仍不是它——这是设计:无障碍服务只在家长端输入框获得焦点时才切换。

工作方式是:点输入框时键盘不自动弹,屏幕右下角出现「手动键盘」按钮,点了才升起 Fcitx,打完点「收起」完全隐藏——目的是不让键盘遮挡学习内容。想停用助手用 disable 子命令(同上把 enable 换成 disable);它只移除本助手,不是完整恢复,原设置按备份目录里的 keyboard-before.json 由本人恢复。

我们的状态:启用与五项核对已通过;竖屏下「点输入框→手动展开→拼音打『你好』→收起」的全套真机验收我们还没做完,如实标注未测,后来人请自己补这一项。

步骤 7:官方 ChatGPT 应用(核心)

从官方入口获取:https://chatgpt.com/download/ ,或直接在设备的 Play 商店搜 ChatGPT 安装。只用官方来源,不要装任何「破解版」。

  • 我们最担心的变数:这台机器是 32 位 ARMv7,而 ChatGPT 当前版本(恰与作者实测的版本号一致)在部分渠道的变体列表里只显示 64 位。实测结论:Play 商店正常给这台机器下发并安装成功,32 位没有被砍。
  • 登录由使用者本人用自己的账号完成。登录后回桌面点 ChatGPT 大卡,应直接跳进官方应用——这是整套学习站的核心验收点。
  • 注意:不要用主应用内置网页登录(步骤 4 已说明,会卡人机验证);辅导的用法(让它多提问、分步引导而不是直接给答案)靠官方的辅导模板设置,模板文件在项目 docs/tutoring-instructions.txt,由家长自行放入账号/项目指令。模板是引导不是强制边界,实际表现要靠家长抽查。

步骤 8:音乐——先说清 MusicFree 的真相,再给两条路

MusicFree 本体不带任何音乐来源:它是个播放器框架,推荐歌单、搜索要靠第三方插件,没插件时打开推荐页会提示「还没有安装支持的插件」。它也不在 Play 商店上架,只在 GitHub 发布:https://github.com/maotoumao/MusicFree 。我们用的版本是 v0.6.2 的 app-armeabi-v7a-release.apk(认准与机器匹配的 32 位包),下载后校验文件再侧载:

adb -s <设备序列号> install <MusicFree安装包路径>

桌面音乐卡就是跳它,装上后卡片可正常打开。给它读本地文件的权限:

adb -s <设备序列号> shell pm grant fun.upup.musicfree android.permission.READ_EXTERNAL_STORAGE

(或在系统设置→应用→MusicFree→文件和媒体权限里选「允许管理所有文件」。)

已知问题 #2(我们的实测,后来人重点看):权限给满、整机重启之后,MusicFree 的「本地音乐」扫描在这台安卓 11 机器上依然扫不到任何文件,连文件夹都列不出来。文件本身和系统媒体库都是好的(下方替代路线当场证明),这是它在本机的适配问题。

替代路线(我们实际在用的):系统自带「音乐」(包名 com.android.music)读系统媒体库,放本地文件进去就能播。先确认它在:

adb -s <设备序列号> shell pm list packages music

把音频推进公共音乐目录(整文件夹批量推可用循环命令,或逐个推):

adb -s <设备序列号> push <本地音频文件> /sdcard/Music/

没有应用抽屉时拉起系统音乐:

adb -s <设备序列号> shell monkey -p com.android.music -c android.intent.category.LAUNCHER 1

我们推进去的 20 个文件它全部列出。音源的规矩:只用自己有权使用的文件。我们用的是 VOA Learning English 初级课程(Let's Learn English – Level 1,美国政府出品、公有领域,https://learningenglish.voanews.com)前 15 课加几首公版/自由授权英文儿歌,每个文件的出处与授权依据都留了清单;有两首想收的儿歌没找到授权干净的演唱版本,就没收。来路不明的插件源和盗版下载站,劝你也别碰。

步骤 9:设默认桌面(先看代价,再动手)

把学习桌面设为默认主屏幕有两种方式。系统设置路线(官方文档推荐):

adb -s <设备序列号> shell am start -a android.settings.HOME_SETTINGS

在打开的界面里选 Learning Station。命令路线(我们用的):

adb -s <设备序列号> shell cmd role add-role-holder android.app.role.HOME local.thinksmart.dashboard

设好后按 Home 键应回到学习桌面大时钟(用行为验证;注意 cmd role get-role-holders 这个查询命令在安卓 11 上不存在,别拿它验证——我们给错过一次)。

动手前必须知道的代价(原教程没写):这个桌面没有应用抽屉/应用列表入口。设为默认后,Play 商店等其他应用在桌面上根本点不到——我们一度误以为「Play 商店坏了」,查了半天(没被禁用、存储也够)才想明白。想清楚这台机器就是要当专用学习机,再设。

补救与逃生路线都给你备好:

  • 撤销默认桌面,恢复系统桌面:
adb -s <设备序列号> shell cmd role remove-role-holder android.app.role.HOME local.thinksmart.dashboard
  • 临时拉起任意应用(以 Play 商店为例):
adb -s <设备序列号> shell monkey -p com.android.vending -c android.intent.category.LAUNCHER 1
  • 不靠电脑:用方块键(最近任务)在已开应用间切换;或从屏幕顶端下拉通知栏,点齿轮进设置改默认应用。

步骤 10:人工验收清单(官方清单 + 我们的状态)

源码测试通过不等于硬件验收通过,逐项记录「通过/失败/未测」:

  • 桌面四入口、时钟走时、Wi-Fi 断开与重连:通过
  • 家长页:登录看状态、错密码拦截、改密码后旧会话失效:登录与状态通过;改密码失效未测
  • 官方 ChatGPT:连续语音至少 5 分钟、拍题与照片方向、要求直接给答案时是否继续分步引导:未测(登录与跳转已通过)
  • 竖屏中文键盘全套动作:未测(启用已通过)
  • 不息屏开关的真息屏/保持亮屏对照、30 秒息屏行为:未测(开关翻转通过;我们保留了 30 分钟息屏,没采用官方的 30 秒,取舍在使用者)
  • 按需看屏幕的设备端授权流程:未测
  • 拔掉 USB、重启后桌面/键盘/家长服务独立运行:重启后桌面与家长服务通过(拔电重启实测),键盘随服务恢复未单独复测

回退速查

  • 停用键盘助手:keyboard.py ... disable(见步骤 6)
  • 恢复原息屏时间:adb -s <设备序列号> shell settings put system screen_off_timeout <步骤3记下的原值>
  • 撤销默认桌面:见步骤 9 的 remove-role-holder 命令
  • 卸载组件用系统设置即可;注意签名:以后更新这五个组件必须用同一密钥重新构建,签名不一致时不要卸载重装硬来,更不要清数据解决签名问题

结语

再重复一遍总评:东西是真的、能用,但只在作者那台安卓 8.1 的机器上验过。换到安卓 11,构建要补一行配置、安装要绕开脚本门槛手动逐个来、桌面同步和音乐扫描各有一个适配毛病、默认桌面还有个文档没写的日常代价。把这些都写出来,后来人就能少走我们这一晚的弯路——这正是这个博客要做的事。

← 返回首页