TCL 配置 AnyLauncher 实现开机即看网络电视 L48A71/L48C71
声明
本教程针对具有一定动手能力的人,请尽量理解自己的每一步操作并谨慎执行。最好在完全看完本教程之后再动手操作。操作不当可能导致系统无法退出播放器页面或无法进入系统桌面,请量力而行。
家里的电视是 TCL L48A71,2013年9月就上市了,很老的型号。配置有48英寸1080P分辨率的屏幕,买了没几年就感觉已经远远落后于时代了。目前主要是家里的中老年人在观看。诉求很简单,打开电视就能看到直播频道。
基本情况
电视开机会经过一个较长时间的加载,然后会进入系统桌面。如果使用了网络电视客户端,则需要切换到应用页后,自行打开对应的网络电视应用才能看电视。这些操作对于家里的中老年人,尤其是老年人来说极为繁琐,操作起来比较困难。
为了实现开机即可以收看网络电视,我借助了 AnyLauncher 来将网络电视应用直接作为电视桌面应用,这样一来,系统开机之后进入桌面的步骤就会被替换为进入网络电视应用,这样就大大简化了看电视的步骤。
下面来简单介绍一下设计思路和具体步骤。
- 基本情况
- 开启 ADB (Android Debug Bridge)
- 使用设置打开【未测试】
- 使用 TCP 报文打开【已测试】
- Windows
- Linux/macOS
- 安装与连接 ADB
- 安装 ADB
- Windows
- Linux
- macOS
- 通过 ADB 连接电视
- 安装 ADB
- 安装相关软件并配置
- 下载对应软件安装包
- 使用 ADB 安装对应软件包
- 配置 AnyLauncher 实现开机进入直播
- 实现原理
- 系统恢复
- 临时打开系统桌面
- 完全恢复系统桌面
- 拓展阅读:系统配置及设置双桌面
- 系统原始状态
- 源代码分析
- 代码修改
- 打包与安装
- 【进阶】远程配置 AnyLauncher
- 结语
开启 ADB (Android Debug Bridge)
TCL 开启 ADB 的方式有很多,下面提供两种方式供大家参考:
使用设置打开【未测试】
操作步骤为:打开 设置 → 系统信息 ,按下遥控器的 上下左右 键,出现相关设置,按屏幕提示操作即可。
使用 TCP 报文打开【已测试】
分不同的操作系统,可以使用不同的方法发送 TCP 报文。需要注意的是,你需要提前知道电视的 IP 地址。这个地址可以通过打开 设置 → 网络 → 无线网络(或者有线网络)→ 网络详情 得到。同时需要保障你操作的电脑和电视处于同一网络环境下,例如连接到同一个路由器。
Windows
Window 上可用的工具很多,下面介绍一种简单的。
工具下载:TCP&UDP测试工具下载-华军软件园
使用该工具的TCP测试模式-客户端模式,这里的内容填写如下:
项目 | 值 | 说明 |
---|---|---|
目标 IP | 192.168.X.X | 上文中查到的电视IP地址 |
端口 | 8090 | 电视监听的端口 |
创建完成后,点击页面左侧的连接按钮。连接成功后,在发送区填写 start adbd
,点击发送,如果操作正确,接收区将显示 ok
。
Linux/macOS
使用 nc
命令即可。
echo "start adbd" | nc 192.168.X.X 8090
其中 192.168.X.X
即为前文中获得的电视 IP 地址。
安装与连接 ADB
成功打开电视的 ADB 远程调试功能后,需要使用 adb
命令完成接下来的操作。
安装 ADB
Windows
ADB 的安装可参考Windows下adb的安装方法【小白向】 - 哔哩哔哩,这里推荐一种更简单的安装方法- choco
。
Windows 程序包管理器 Chocolatey 的使用 - 飞仔FeiZai - 博客园
使用 cmd
或者 PowerShell
安装好 choco
之后,运行:
choco install adb
安装完成后,系统会自动将 adb
添加到可执行文件目录( %PATH%
)中。
Linux
使用系统自带的包管理器安装 adb
包即可:
# Ubuntu/Debian
sudo apt install adb
# Arch/Manjaro
sudo pacman -S android-tools
# Fedora (Traditional )
sudo dnf install -y android-tools
# Fedora (Atomic Desktops)
rpm-ostree install android-tools
macOS
工具 | 最简方式在 macOS 中安装 adb 工具 - 知乎
# Install Homebrew
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
# Install ADB via Homebrew
bash brew install android-platform-tools --cask
# If error, remove --cask
bash brew install android-platform-tools
通过 ADB 连接电视
adb connect 192.168.X.X 5555
如果命令运行结果为:
connected to 127.0.0.1:5555
# Or
already connected to 127.0.0.1:5555
且
adb devices
可以显示连接到的设备,就可以继续进行下一步了。
安装相关软件并配置
为了实现开机即进入网络直播软件,需要安装的工具有两个:
- 网络直播软件,这里使用的是 友窝(Yowar Player)
- AnyLauncher ,可以将任意应用作为系统的主页应用。
tumuyan/AnyLauncher: You can choose any Android application and set it as a Luncher. (github.com)
其中网络直播软件可以任意挑选,有其他可用的也可以在评论区一起交流。
下载对应软件安装包
网络直播软件安装包请自行搜索, AnyLauncher 的安装包下载地址在:https://github.com/tumuyan/AnyLauncher/releases/download/1.13/app-release.apk
使用 ADB 安装对应软件包
在进行操作前,请确保 adb devices
中列出了电视设备。
将安装包放置在一个便于找到的目录下,例如根目录或者一级目录下,这里我放在了 E:\TCL\
目录下:
adb install E:\TCL\player.apk
adb install E:\TCL\AnyLauncher.apk
如果顺利的话,这两条命令都会显示:
Performing Streamed Install:
pkg: /data/local/tmp/*****.apk
Success
之后,即可在电视的 应用 → 全部应用 看到对应的软件APP图标。
配置 AnyLauncher 实现开机进入直播
【注意】操作不当可能会引起无法进入系统桌面!请谨慎操作!
打开 AnyLauncher 页面,有三个按钮:
- 设置桌面
- 选择应用
- 延迟启动
如果只是需要配置开机进入直播软件,直接用遥控器操作:
- 选择 选择应用;
- 在弹出的列表中选择 优先从后台切换到前台;
- 在列表中选择对应的应用程序即可;
- 如果应用太多无法翻页,请在 搜索框 内输入应用名称并点击右侧 搜索 按钮进行过滤
- 如果需要设置备用桌面,请再次选择 选择应用;
- 在弹出的列表中选择 备用启动器;
- 在列表中选择对应的系统桌面,
- TCL 原系统桌面显示为
901 DTV
,包名为com.tcl.cyberui
- TCL 原系统桌面显示为
- 在备用启动器后的选框中打钩。
之后,按遥控器上的 Home
键(形状为一个小房子),在弹出的对话框中选择 AnyLauncher
并选择下方的 始终 。
如果配置正确,此时电视会直接打开网络直播软件。
实现原理
配置完成后,系统将使用 AnyLauncher 作为默认的桌面应用,这就导致每次开机或者按 Home
键时,系统都会自动切换到 AnyLauncher 。之后 AnyLauncher 开始接管,并按照配置设置打开对应的直播APP。
同时,如果短时间内多次按 Home
键,理论上来说 AnyLauncher 将会打开备用的系统桌面。
系统恢复
在进行上述操作之后,实测很难打开备用桌面。由于系统的版本陈旧,且硬件水平也比较落后,加上遥控器的编码问题,这就让 AnyLauncher 无法检测到短时间内多次按下的 Home 。如果你需要进入系统桌面,则需要如下操作:
临时打开系统桌面
按照前文方法完成与电视端 ADB 的连接,之后运行:
adb shell am start -n com.tcl.cyberui/.MainActivity
可以临时打开系统桌面。
完全恢复系统桌面
按照前文方法完成与电视端 ADB 的连接,之后运行:
adb shell am start -n com.tcl.cyberui/.MainActivity
可以临时打开系统桌面,卸载 AnyLauncher 即可恢复。
或者直接在 adb
上卸载 AnyLauncher:
adb uninstall com.tumuyan.fixedplay
拓展阅读:系统配置及设置双桌面
这一部分主要写如何修改 AnyLauncher 代码实现双桌面来回切换。
由于在前文的实践中无法切换到备用桌面,而 AnyLauncher 是开放源代码的,因此可以直接修改其源码,来实现切换到备用桌面的逻辑。
系统原始状态
家里这台 TCL L48A71 使用的还是 Android 4.2 版本的系统,相当老旧。
通过 adb shell cmd shortcut get-default-launcher
可以得知:
原始桌面包名:com.tcl.cyberui
原始桌面活动名:com.tcl.cyberui.MainActivity
需要实现的效果是:
源代码分析
AnyLauncher 的源代码可以在 tumuyan/AnyLauncher 获取到。使用 Android Studio 打开该项目,定位到其负责执行应用跳转逻辑的部分:
// app/src/main/java/com/tumuyan/fixedplay/MainActivity.java
// ...
// Start from Line 89
public void go() {
SharedPreferences read = getSharedPreferences("setting", MODE_MULTI_PROCESS);
...
// Line 98
boolean apply2nd = read.getBoolean("apply2nd", false);
long lastTime = read.getLong("lastTime", 0);
int combo = read.getInt("combo", 0);
final String app_2nd = read.getString("app_2nd", "");
final String class_2nd = read.getString("class_2nd", "");
Log.w("2nd", app_2nd + ", combo=" + combo);
if (apply2nd) {
// Line 108
long time = System.currentTimeMillis();
if (combo > 3)
combo = 0;
else {
if (time - lastTime < 500) {
combo++;
} else {
combo = 0;
}
}
// Line 118
Log.w("combo", "" + combo);
{
SharedPreferences.Editor editor = getSharedPreferences("setting", MODE_MULTI_PROCESS).edit();
editor.putInt("combo", combo);
editor.putLong("lastTime", time);
editor.commit();
}
if (combo > 1) {
if (app_2nd.length() > 0) {
Intent intent = new Intent();
intent = packageManager.getLaunchIntentForPackage(app_2nd);
if (intent != null) {
intent.addCategory(Intent.CATEGORY_HOME);
Log.w("2nd2", "length>0 -> intent not null");
startActivity(intent);
} else {
// ...
可以看出:
- (98)该应用使用
SharedPreferences
存储配置设置及一些运行记录相关的信息; - (108)该应用使用
500
毫秒以内调用次数来判断是否启动备用启动器,如果调用次数过多,连击次数会清零; - (118)该应用每次调用都会更新上次调用时间和连续调用次数。
为了实现依据上次调用的结果反过来调用另外一个启动器,我们需要修改此逻辑。
代码修改
引入一个布尔值 fallback
来判断是否需要进入备用桌面。同时,需要判断是否为第一次进入桌面,这里直接使用了原有的 splash_time
来进行判断。
在原有代码中,splash_time
的值会在第一次运行的时候从配置文件内读取,在设置好延时后,该值会被设置为 0
。因此可以利用该特性来判断是否为第一进入桌面。
之后,在每次进行桌面跳转调用的时候,我们都对这个 fallback
进行反转并将值更新存储到 SharedPreferences
中。这样只需要小小地修改几处代码,即可实现双桌面的来回切换:
// app/src/main/java/com/tumuyan/fixedplay/MainActivity.java
// ...
// Start from Line 89
public void go() {
SharedPreferences read = getSharedPreferences("setting", MODE_MULTI_PROCESS);
...
// Line 98
boolean apply2nd = read.getBoolean("apply2nd", false);
boolean fallback = read.getBoolean("fallback", false); // MOD
if (splash_time > 0) { // MOD
fallback = true; // MOD
} // MOD
final String app_2nd = read.getString("app_2nd", "");
final String class_2nd = read.getString("class_2nd", "");
Log.w("2nd", app_2nd + ", fallback=" + fallback); // MOD
fallback = !fallback; // MOD
{ // MOD
SharedPreferences.Editor editor = getSharedPreferences("setting", MODE_MULTI_PROCESS).edit(); // MOD
editor.putBoolean("fallback", fallback); // MOD
editor.commit(); // MOD
} // MOD
if (apply2nd) {
// Line 108
// Deleted Line 108-125
if (fallback) { // MOD
if (app_2nd.length() > 0) {
Intent intent = new Intent();
intent = packageManager.getLaunchIntentForPackage(app_2nd);
if (intent != null) {
intent.addCategory(Intent.CATEGORY_HOME);
Log.w("2nd2", "length>0 -> intent not null");
startActivity(intent);
} else {
// ...
打包与安装
在 build.gradle
内添加包签名信息:
android {
...
signingConfigs {
release {
keyAlias ***
keyPassword ***
storeFile file('***')
storePassword ***
}
}
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
...
}
使用 Ctrl
+F9
Build Project ,将 release
目录下的 AnyLauncher-*.**.apk
使用 ADB 安装到电视上。
【进阶】远程配置 AnyLauncher
Android 4.2 无法支持 scrcpy
,无法远程操控电视,因此我只得出此下策,供大家参考。
【注意】这里的部分命令需要系统支持 root ,即 adb shell
中可以运行 su
命令
前文提到,AnyLauncher 的配置使用的是 SharedPreferences
进行存储,该存储的物理位置为 /data/data/com.pkg.name/shared_prefs
,代码中指定了 SharedPreferences read = getSharedPreferences("setting", MODE_MULTI_PROCESS)
,我们在 AnyLauncher 的数据目录下可以找到对应的文件:
ADB Shell
shell@android:/ $ su
shell@android:/ # ls -la /data/data/com.tumuyan.fixedplay/shared_prefs
-rw-rw---- u0_a72 u0_a72 111 2024-10-05 21:49 setting.xml
shell@android:/ # cat /data/data/com.tumuyan.fixedplay/shared_prefs/setting.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="fallback" value="true" />
</map>
shell@android:/ #
可以看到,该目录下确实存在名为 settting.xml
的配置文件。
如果没有出现对应的配置文件,可能是安装之后没有运行该 APP 导致的,可以使用:
adb shell am start -n com.tumuyan.fixedplay/.SettingActivity
运行一次程序,之后即可在数据目录下找到该文件。
找到该文件后,使用 adb pull
命令将文件拉取到电脑上进行修改。注意,这里需要先将文件复制到普通用户可以读写的目录下,例如 /sdcard
或 /data/local/tmp/
。
ADB Shell & Linux Shell
shell@android:/ # cp /data/data/com.tumuyan.fixedplay/shared_prefs/setting.xml /sdcard/setting.xml
shell@android:/ # exit
shell@android:/ $ exit
user@ubuntu:~ $ adb pull /sdcard/setting.xml ./setting.xml
之后,使用文本编辑器将内容进行相应的更改:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="app">com.yowar.ywp</string>
<string name="label">Yowar Player</string>
<string name="class">com.yowar.ywp.activities.SplashActivity</string>
<string name="mode">r1</string>
<string name="app_2nd">com.tcl.cyberui</string>
<string name="label_2nd">TCL Desktop</string>
<string name="class_2nd">com.tcl.cyberui.MainActivity</string>
<boolean name="apply2nd" value="true" />
<boolean name="fallback" value="true" />
<int name="splash_time" value="10" />
</map>
其中:
类型 | 名称 | 值 | 含义 |
---|---|---|---|
string |
app |
com.yowar.ywp |
主要应用包名 |
string |
label |
Yowar Player |
主要应用显示名 |
string |
class |
com.yowar.ywp.activities.SplashActivity |
主要应用活动名 |
string |
app_2nd |
com.tcl.cyberui |
备用应用包名 |
string |
label_2nd |
TCL Desktop |
备用应用显示名 |
string |
class_2nd |
com.tcl.cyberui.MainActivity |
备用应用活动名 |
int |
splash_time |
10 |
延迟启动时间(ms) |
再将修改之后的文件重新上传回电视:
ADB Push
user@ubuntu:~ $ adb push ./setting.xml /sdcard/setting.xml
./setting.xml: 1 file pushed, 0 skipped. 0.6 MB/s (532 bytes in 0.001s)
之后,再将配置文件覆盖到原位置:
ADB Shell
shell@android:/ $ su
shell@android:/ # cd /data/data/com.tumuyan.fixedplay/shared_prefs
shell@android:/data/data/com.tumuyan.fixedplay/shared_prefs # cp /sdcard/setting.xml . && chown u0_a72:u0_a72 ./* && chmod 660 ./*
这里需要一起完成,因为程序会自动去写配置文件导致修改失败。
经测试,修改后的 AnyLauncher 可以实现类似双桌面的功能。即使系统对 Home 响应缓慢,也能实现主要桌面向备用桌面的切换。
结语
这一次远程为家里的电视添加功能,实践上完成了我第一对 Android 应用的修改。虽然比较简单,但还是在如何打包一个 Release
版本的 apk
上学到了一些东西;还对 Android 上的 SharedPreferences 有了一个基本的了解。
希望这次分享能够让更多人体验到开机即看电视的好处!