酷走Android行车记录仪研究
还是之前用的酷走 Android 行车记录仪,最近放在车上使用倒挺顺畅,不过也有一些明显的问题(例如 SIM 卡未联网时系统时间不正确等),因此想着最好能找到调试这款 Android 行车记录仪的途径。
ADB 调试
最开始想到这款行车记录仪既然是用的 Android 系统,应该是支持 ADB 调试功能的,将行车记录仪的 USB 接口直接用数据线接到我的笔记本电脑上,却没有找到 ADB 设备。以为记录仪内部是不是有一个专用的调试串口之类的,为此找到硬件同事把记录仪拆解了一番:
不过并没有找到除 USB 之外其它的调试接口,这时无意将记录仪通过 USB 接到另一台主机上,却认到 ADB 设备了。无奈地认识到自己犯蠢没有用别的机器验证是否和 USB 接口有关系,毕竟把记录仪拆解了上面的样子也基本不可能装回去咯 -_-#。初步估计我的老笔记本 USB 接口供电有问题,记录仪通过 USB 插到 PC 机之后没有独立供电也只能从 PC 机 USB 接口取电。
比较好的消息是我日常使用的 Chromebook 接记录仪也能认到 ADB 设备,这样就能直接通过 Vysor 这个 Chrome 应用来访问行车记录仪了,Vysor 官网上也有 Windows、Mac、Linux 系统下的桌面版本。另外为了方便通过 ADB 访问行车记录仪的 shell 以及上传下载文件之类的,我还在 Chromebook 的 crouton 环境中安装了 adb 支持。
启动 Vysor Chrome 应用,授权允许访问 ADB 设备之后,应该就能看到记录仪设备了:
上图中的 Full AOSP on Sofia
就是行车记录仪设备,点击 Vysor 上的 View
按钮会自动通过 ADB 在设备上安装 Vysor 受控端 App,稍等片刻就可以看到记录仪的 Android 系统主界面咯:
注意
由于通过 USB 数据线将行车记录仪连接到电脑时功率一般达不到要求的 5V / 2A,记录仪自带的 250 mAh 电池续航时间也有限,因此 ADB 调试操作前最好先使用标准 5V / 2A 充电器将记录仪充满电。
系统和硬件信息
解锁进入系统之后,可以先看看我这台行车记录仪的系统版本信息,看起来比较明显用的是 Android 5.1.1 AOSP 版本,内核版本为 3.14.0,版本号为 2.1.5:
值得一提的是另外一台同样型号的酷走行车记录仪,通过 Vysor Chrome 应用能找到 ADB 设备,但是自动安装 Vysor App 之后无法正确显示 Android 系统主界面,这样只能通过 ADB Shell 来获取系统版本信息了:
(xenial)zzm@localhost:~$ adb shell getprop | grep 'ro/.build/.' [ro.build.characteristics]: [tablet] [ro.build.date.utc]: [1473825617] [ro.build.date]: [Wed Sep 14 12:00:17 CST 2016] [ro.build.description]: [Sf3gr_mrd6_p2_720-userdebug 5.1.1 LMY47V eng.softteam.20160914.115752 release-keys] [ro.build.display.id]: [2.2.3] [ro.build.fingerprint]: [Intel/Sf3gr_mrd6_p2_720/5.1.1/LMY47V/softteam09141159:userdebug/release-keys] [ro.build.flavor]: [Sf3gr_mrd6_p2_720-userdebug] [ro.build.host]: [pdd-build] [ro.build.id]: [LMY47V] [ro.build.product]: [Sf3gr_mrd6_p2_720] [ro.build.tags]: [release-keys] [ro.build.type]: [userdebug] [ro.build.user]: [softteam] [ro.build.version.all_codenames]: [REL] [ro.build.version.base_os]: [] [ro.build.version.codename]: [REL] [ro.build.version.incremental]: [eng.softteam.20160914.115752] [ro.build.version.release]: [5.1.1] [ro.build.version.sdk]: [22] [ro.build.version.security_patch]: [2015-11-01]
可以看到这台记录仪的版本号是新一点的 2.2.3,进入 Shell 查看内核版本:
shell@Sf3gr_mrd6_p2_720:/ $ uname -a Linux localhost 3.14.0 #1 SMP PREEMPT Wed Sep 14 12:14:50 CST 2016 i686 GNU/Linux
记录仪使用的是 Intel SOFIA Atom x3 超低功耗 x86 处理器,下面的 /proc/cpuinfo
输出只列出了 4 个核中第一个核的信息,从核数和缓存大小来看具体处理器型号估计是最大频率 1.1 GHz 的 x3-C3230RK。
shell@Sf3gr_mrd6_p2_720:/ $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 93 model name : Genuine Intel(R) CPU @ 728 stepping : 1 microcode : 0x102 cpu MHz : 416.000 cache size : 512 KB physical id : 0 siblings : 4 core id : 1 cpu cores : 4 apicid : 2 initial apicid : 2 fdiv_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 11 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush mmx fxsr sse sse2 ss ht nx rdtscp lm constant_tsc arch_perfmon xtopology pni pclmulqdq monitor ssse3 cx16 xtpr pdcm sse4_1 sse4_2 movbe popcnt aes lahf_lm 3dnowprefetch tsc_adjust smep erms bogomips : 892.92 clflush size : 64 cache_alignment : 64 address sizes : 32 bits physical, 48 bits virtual power management:
x3-C3230RK 处理器集成了 A-GOLD 620 射频收发器,支持 3G、Wi-Fi(802.11 B/G/N)、蓝牙 4.0、GPS 以及 FM 功能,这几项功能记录仪基本都用上了。GPU 则是 600 MHz 的 Mali-450 MP4。处理器最大支持 2 GB 内存,不过这款行车记录仪上只带了 1 GB 内存:
shell@Sf3gr_mrd6_p2_720:/ $ cat /proc/meminfo MemTotal: 948616 kB MemFree: 26592 kB MemAvailable: 498968 kB Buffers: 3696 kB Cached: 498580 kB
我们也可以使用 dumpsys
命令查询记录仪电池信息:
shell@Sf3gr_mrd6_p2_720:/ $ dumpsys battery Current Battery Service state: AC powered: false USB powered: true Wireless powered: false status: 2 health: 2 present: true level: 0 scale: 100 voltage: 3289 temperature: 240 technology: Li-ion
系统 App
上面的 Android 主界面里可以看到 Tong-server 和 VideoRecorderService 这两个服务在运行,分别对应记录仪的整体管理功能和录像功能,使用老版本系统的记录仪上可以打开 VideoServer 录像的系统 App 界面:
对于 Vysor 不能打开图形界面的新系统可以用命令列举系统 App 列表(下面只列出了关键的几个):
shell@Sf3gr_mrd6_p2_720:/ $ pm list packages -f package:/system/app/KuzoInstaller/KuzoInstaller.apk=com.hpyl.kuzo.installer package:/system/app/ArcCamera/ArcCamera.apk=com.arcsoft.camera2 package:/system/app/KuzoLauncher/KuzoLauncher.apk=com.hpyl.kuzolauncher package:/system/app/TongTermManager/TongTermManager.apk=com.kh.tong.termmanager package:/system/app/VideoServer/VideoServer.apk=com.kh.videoserver
然后使用 dumpsys
命令查看相应 App 的信息:
shell@Sf3gr_mrd6_p2_720:/ $ dumpsys package com.kh.tong.termmanager Package [com.kh.tong.termmanager] (24d3573f): userId=10016 gids=[3003, 1028, 1015, 1023, 3002, 3001] pkg=Package{c4b880c com.kh.tong.termmanager} codePath=/system/app/TongTermManager resourcePath=/system/app/TongTermManager legacyNativeLibraryDir=/system/app/TongTermManager/lib primaryCpuAbi=armeabi-v7a secondaryCpuAbi=null versionCode=1000027 targetSdk=23 versionName=1.0.27 shell@Sf3gr_mrd6_p2_720:/ $ dumpsys package com.kh.videoserver Package [com.kh.videoserver] (31228436): userId=10018 gids=[3003, 1028, 1015, 1023] pkg=Package{27beef37 com.kh.videoserver} codePath=/system/app/VideoServer resourcePath=/system/app/VideoServer legacyNativeLibraryDir=/system/app/VideoServer/lib primaryCpuAbi=null secondaryCpuAbi=null versionCode=1000027 targetSdk=22 versionName=1.0.27
可以看到新版本系统下 Tong-server
和 VideoServer
App 都是 1.0.27 版本,如果把系统 App 的 apk 文件拷贝出来了也能用 aapt
命令查看:
(xenial)zzm@localhost:~$ aapt dump badging TongTermManager.apk | grep "VersionName" package: name='com.kh.tong.termmanager' versionCode='1000027' versionName='1.0.27' platformBuildVersionName='5.1.1-1819727' (xenial)zzm@localhost:~$ aapt dump badging VideoServer.apk | grep "VersionName" package: name='com.kh.videoserver' versionCode='1000027' versionName='1.0.27' platformBuildVersionName='5.1.1-1819727'
老版本系统下这两个 App 也是低一些的 1.0.23 版本:
shell@Sf3gr_mrd6_p2_720:/ $ dumpsys package com.kh.tong.termmanager Package [com.kh.tong.termmanager] (2d37c5ca): userId=10017 gids=[3003, 1028, 1015, 1023, 3002, 3001] pkg=Package{33ef33b com.kh.tong.termmanager} codePath=/system/app/TongTermManager resourcePath=/system/app/TongTermManager legacyNativeLibraryDir=/system/app/TongTermManager/lib primaryCpuAbi=x86 secondaryCpuAbi=null versionCode=1000023 targetSdk=22 versionName=1.0.23
修改系统
记录仪 Android AOSP 系统自带了 root 权限,如果需要修改系统,可以先关闭系统分区保护:
(xenial)zzm@localhost:~$ adb disable-verity Verity disabled on /system Now reboot your device for settings to take effect
运行 adb reboot
命令重启记录仪之后,就可以直接 su
切换为 root 用户,重新挂载修改系统分区了:
shell@Sf3gr_mrd6_p2_720:/ # mount -o remount,rw /dev/block/platform/soc0/e0000000.noc/by-name/ImcPartID068 /system
尝试升级系统 App
经过测试我发现 2.1.5 老版本系统相比新的 2.2.3 版本存在以下问题:
- 音乐播放的暂停状态无法保存,记录仪重新开机时始终恢复播放上次的歌曲,这个时候只能使用蓝牙按键或者手机酷走 App 暂停播放;
- 记录仪录的视频画面中没有当前车速和时间 OSD 显示。
因此我想着将 2.1.5 版本系统里的 Tong-server
和 VideoServer
App 升级为 2.2.3 里自带的新版本,是不是就能解决这些问题。
不过由于这两个系统 App 的 apk 文件是不完整的,apk 中不包含 classes.dex
并且有单独的 odex 文件,这样的 apk 文件也无法直接安装,最好能先将 odex 反编译出来。
我先试了常用的 smali/baksmali 来反编译 VideoServer
的 odex,注意 baksmali
更新之后命令的使用方式和网上很多文章不太一样了:
(xenial)zzm@localhost:~$ java -jar baksmali-2.2.7.jar x VideoServer/x86/VideoServer.odex Exception in thread "main" org.jf.dexlib2.DexFileFactory$UnsupportedOatVersionException: Unsupported oat version: 48 at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:120) at org.jf.baksmali.DexInputCommand.loadDexFile(DexInputCommand.java:149) at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:162) at org.jf.baksmali.Main.main(Main.java:102)
额,原来 baksmali
并不支持比较老的 Android 5.1 版本。
看起来我只能使出 oat2dex 工具来反编译试试了,oat2dex
使用上比 baksmali
复杂一些:
(xenial)zzm@localhost:~/Downloads/tmp$ java -jar oat2dex.jar Easy oat2dex 0.90 Usage: java -jar oat2dex.jar [options] <action> [options] Api level: -a <integer> Output folder: -o <folder path> Print detail : -v <action> Get dex of boot(.oat) : boot <boot.oat/boot-folder> Get dex (de-optimize) : <oat/odex file> <boot-class-folder> <vdex file> Get raw odex : odex <oat/odex/vdex file> Get raw odex smali : smali <oat/odex/vdex file> Deodex framework (exp): devfw [empty or path of /system/framework/]
首先需要将新系统上的 boot.oat
文件拷贝出来:
(xenial)zzm@localhost:~$ adb pull /data/dalvik-cache/x86/system@[email protected] . 2063 KB/s (57823168 bytes in 27.362s)
使用 oat2dex
将 boot.oat
反优化为 dex 文件,默认会输出到当前目录下的 boot.oat-dex
子目录:
(xenial)zzm@localhost:~/Downloads/tmp$ java -jar oat2dex.jar boot boot.oat 06-28 22:07:36:757 Art version=48 (boot.oat) 06-28 22:07:36:890 De-optimizing /system/framework/core-libart.jar 06-28 22:07:48:650 Output to /home/zzm/boot.oat-dex/core-libart.dex 06-28 22:07:48:651 De-optimizing /system/framework/conscrypt.jar 06-28 22:07:50:095 Output to /home/zzm/boot.oat-dex/conscrypt.dex 06-28 22:07:50:096 De-optimizing /system/framework/okhttp.jar 06-28 22:07:50:750 Output to /home/zzm/boot.oat-dex/okhttp.dex 06-28 22:07:50:751 De-optimizing /system/framework/core-junit.jar 06-28 22:07:50:801 Output to /home/zzm/boot.oat-dex/core-junit.dex 06-28 22:07:50:802 De-optimizing /system/framework/bouncycastle.jar 06-28 22:07:53:226 Output to /home/zzm/boot.oat-dex/bouncycastle.dex 06-28 22:07:53:228 De-optimizing /system/framework/ext.jar 06-28 22:07:55:777 Output to /home/zzm/boot.oat-dex/ext.dex 06-28 22:07:55:777 De-optimizing /system/framework/framework.jar 06-28 22:08:13:350 Output to /home/zzm/boot.oat-dex/framework.dex 06-28 22:08:13:351 De-optimizing /system/framework/framework.jar:classes2.dex 06-28 22:08:15:468 Analysis error in class=Landroid/widget/NumberPicker; method=<init> Method: Landroid/widget/NumberPicker;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V Near line: 604 (address 75) Instructions: [36] const/4 regA=15 [37] move-object/from16 regA=0 regB=19 [38] iput-boolean-quick regA=15 regB=0 <----- [39] const/16 regA=15 [40] const/16 regA=16 06-28 22:08:15:470 org.jf.dexlib2.analysis.AnalysisException: Could not resolve the field in class (Reference,Landroid/content/Context;) at offset 778 in <init> at org.jf.dexlib2.analysis.MethodAnalyzer.analyzeIputIgetQuick(MethodAnalyzer.java:2422) at org.jf.dexlib2.analysis.MethodAnalyzer.analyzeInstruction(MethodAnalyzer.java:1269) at org.jf.dexlib2.analysis.MethodAnalyzer.analyze(MethodAnalyzer.java:259) at org.jf.dexlib2.analysis.MethodAnalyzer.<init>(MethodAnalyzer.java:190) at org.rh.smaliex.deopt.OdexRewriter$OdexRewriterModule$1$1.getInstructions(OdexRewriter.java:232) ...(Skip 24 traces) at org.rh.smaliex.OatUtil.convertToDex(OatUtil.java:271) at org.rh.smaliex.OatUtil.convertDexFromBootOat(OatUtil.java:192) at org.rh.smaliex.OatUtil.bootOat2Dex(OatUtil.java:75) at org.rh.smaliex.Main.mainImpl(Main.java:106) at org.rh.smaliex.Main.main(Main.java:43) 06-28 22:08:15:471 Failed to re-construct dex java.lang.ClassCastException: org.jf.dexlib2.analysis.UnresolvedOdexInstruction (in module: Unnamed Module) cannot be cast to org.jf.dexlib2.iface.instruction.formats.Instruction22cs (in module: Unnamed Module) 06-28 22:08:15:471 convertToDex: skip /system/framework/framework.jar:classes2.dex 06-28 22:08:15:472 De-optimizing /system/framework/telephony-common.jar 06-28 22:08:18:110 Output to /home/zzm/boot.oat-dex/telephony-common.dex 06-28 22:08:18:111 De-optimizing /system/framework/voip-common.jar 06-28 22:08:18:313 Output to /home/zzm/boot.oat-dex/voip-common.dex 06-28 22:08:18:314 De-optimizing /system/framework/ims-common.jar 06-28 22:08:18:503 Output to /home/zzm/boot.oat-dex/ims-common.dex 06-28 22:08:18:519 De-optimizing /system/framework/mms-common.jar 06-28 22:08:18:579 Output to /home/zzm/boot.oat-dex/mms-common.dex 06-28 22:08:18:599 De-optimizing /system/framework/android.policy.jar 06-28 22:08:19:007 Output to /home/zzm/boot.oat-dex/android.policy.dex 06-28 22:08:19:008 De-optimizing /system/framework/apache-xml.jar 06-28 22:08:20:770 Output to /home/zzm/boot.oat-dex/apache-xml.dex
处理 boot.oat
文件有些报错我们先忽略,接着我们可以用 oat2dex
反优化系统 App 的 odex 文件,这里用到了刚才 boot.oat
反优化出来的 dex 文件,类似的会输出到当前目录的子目录:
(xenial)zzm@localhost:~$ java -jar oat2dex.jar VideoServer.odex boot.oat-dex/ 06-28 22:13:09:212 Art version=48 (VideoServer.odex) 06-28 22:13:09:250 De-optimizing /system/app/VideoServer/VideoServer.apk 06-28 22:13:27:979 Output to /home/zzm/VideoServer.odex-dex/VideoServer.dex
反编译得到的 dex 文件,并重新编译成 classes.dex
:
(xenial)zzm@localhost:~$ java -jar baksmali-2.2.7.jar disassemble VideoServer.odex-dex/VideoServer.dex -o video (xenial)zzm@localhost:~$ java -jar smali-2.2.7.jar assemble video -o classes.dex
然后将 classes.dex
打包添加到原来的 apk 文件中:
(xenial)zzm@localhost:~$ aapt add VideoServer.apk classes.dex
安装新的 apk 文件存在报错:
W/PackageManager( 584): Package com.kh.videoserver signatures do not match the previously installed version; ignoring!
原来是没有签名,这里我使用 Uber Apk Signer 工具对 apk 进行重新签名:
(xenial)zzm@localhost:~$ java -jar uber-apk-signer-1.0.0.jar -a VideoServer.apk
初步测试新编译出来的 VideoServer
apk 可以正常安装启动,不过 oat2dex
处理 Tong-server
新版本 App 的时候就有问题了:
(xenial)zzm@localhost:~$ java -jar oat2dex.jar TongTermManager.odex boot.oat-dex/ 06-29 23:02:32:138 Art version=48 (TongTermManager.odex) 06-29 23:02:32:203 De-optimizing /system/app/TongTermManager/TongTermManager.apk 06-29 23:02:58:217 Output to /home/zzm/TongTermManager.odex-dex/TongTermManager.dex 06-29 23:02:58:217 De-optimizing /system/app/TongTermManager/TongTermManager.apk:classes2.dex 06-29 23:03:04:420 Analysis error in class=Lorg/jsoup/parser/Tag; method=<clinit> Method: Lorg/jsoup/parser/Tag;-><clinit>()V Near line: 295 (address 1223) Instructions: [624] check-cast regA=0 [625] invoke-static regC=0 [626] iput-boolean-quick regA=7 regB=0 <----- [627] add-int/lit8 regA=3 regB=3 [628] goto 06-29 23:03:04:433 org.jf.dexlib2.analysis.AnalysisException: Could not resolve the field in class (Reference,Lorg/jsoup/parser/Tag;) at offset 15 in <clinit> at org.jf.dexlib2.analysis.MethodAnalyzer.analyzeIputIgetQuick(MethodAnalyzer.java:2422) at org.jf.dexlib2.analysis.MethodAnalyzer.analyzeInstruction(MethodAnalyzer.java:1269) at org.jf.dexlib2.analysis.MethodAnalyzer.analyze(MethodAnalyzer.java:259) at org.jf.dexlib2.analysis.MethodAnalyzer.<init>(MethodAnalyzer.java:190) at org.rh.smaliex.deopt.OdexRewriter$OdexRewriterModule$1$1.getInstructions(OdexRewriter.java:232) ...(Skip 24 traces) at org.rh.smaliex.OatUtil.convertToDex(OatUtil.java:271) at org.rh.smaliex.OatUtil.convertDexFromBootOat(OatUtil.java:192) at org.rh.smaliex.OatUtil.oat2dex(OatUtil.java:81) at org.rh.smaliex.Main.mainImpl(Main.java:127) at org.rh.smaliex.Main.main(Main.java:43) 06-29 23:03:04:437 Failed to re-construct dex java.lang.ClassCastException: org.jf.dexlib2.analysis.UnresolvedOdexInstruction (in module: Unnamed Module) cannot be cast to org.jf.dexlib2.iface.instruction.formats.Instruction22cs (in module: Unnamed Module) 06-29 23:03:04:437 convertToDex: skip /system/app/TongTermManager/TongTermManager.apk:classes2.dex
这个问题目前还没有找到好的解决方法,由于担心整个系统升级也会碰到 Vysor 主界面无法显示的问题,而且酷走记录仪的生产厂家也不提供支持没有单独的升级包,老版本系统的管理和录像 App 也就继续使用了。
修改系统 App 配置
Tong-server
前面说的 2.1.5 版本系统音乐播放的暂停状态问题,可以看看 Tong-server
系统 App 的配置文件 /data/data/com.kh.tong.termmanager/shared_prefs/KUZOConfig.xml
,例如我的记录仪配置:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="LOCAL_SAVE_MUSIC_INFO_KEY2F06A8D7CA314388B58DC46719702844">{"des":null,"id":0,"md5":"bdb368fe-b568-4157-9b17-818104295f57","seekProgress":5418,"title":null,"url":"/storage/sdcard1/Kuzo/Music/2F06A8D7CA314388B58DC46719702844/15/15/bdb368fe-b568-4157-9b17-818104295f57.mp3"}</string> <string name="USER_TERM_MUSIC_LIST_KEY">[{"fileSize":4008624,"id":0,"length":0,"md5":"bdb368fe-b568-4157-9b17-818104295f57","name":"?? ?? - ?????","path":"/storage/sdcard1/Kuzo/Music/2F06A8D7CA314388B58DC46719702844/0/0/bdb368fe-b568-4157-9b17-818104295f57.mp3","singer":null,"userUuid":"2F06A8D7CA314388B58DC46719702844","uuid":"bdb368fe-b568-4157-9b17-818104295f57"},{"fileSize":6749379,"id":0,"length":0,"md5":"b49b55b0-ae7c-47d5-9cb4-6cf03249efdc","name":"????? - ???","path":"/storage/sdcard1/Kuzo/Music/2F06A8D7CA314388B58DC46719702844/1/0/b49b55b0-ae7c-47d5-9cb4-6cf03249efdc.mp3","singer":null,"userUuid":"2F06A8D7CA314388B58DC46719702844","uuid":"b49b55b0-ae7c-47d5-9cb4-6cf03249efdc"}]</string> <string name="userUUID">2F06A8D7CA314388B58DC46719702844</string> <string name="LOCAL_SAVE_RADIO_INFO_KEY2F06A8D7CA314388B58DC46719702844">{"coverUrlLarge":null,"coverUrlSmall":null,"id":-1,"isCollected":false,"kind":null,"programName":null,"radioDesc":null,"radioName":"","radioPlayCount":null,"rate24AacUrl":"http://live.xmcdn.com/live/536/24.m3u8","rate24TsUrl":"http://live.xmcdn.com/live/536/24.m3u8","rate64AacUrl":"http://live.xmcdn.com/live/536/24.m3u8","rate64TsUrl":"http://live.xmcdn.com/live/536/24.m3u8","scheduleID":null,"supportBitRates":null,"updatedAt":null}</string> <boolean name="LOCAL_SAVE_MUSIC_IS_PAUSE_KEY" value="false" /> <string name="USER_TERM_TONG_SESSION_LIST_KEY">[]</string> <int name="com.kh.tong.term.statemachine.TermMenuSM.LAST_SAVED_MENU_KEY" value="0" /> <int name="com.kh.tong.term.statemachine.TermAudioVolumeSM.PrefKeyVolumn" value="7" /> <boolean name="LOCAL_SAVE_RADIO_IS_PAUSE_KEY" value="false" /> <string name="Password">8888</string> </map>
主要配置项如下:
userUUID
应该是酷走 App 的用户 ID;USER_TERM_MUSIC_LIST_KEY
是通过酷走 App 收藏上传的歌曲列表;LOCAL_SAVE_MUSIC_INFO_KEYxxx
是当前用户的歌曲播放信息;LOCAL_SAVE_RADIO_INFO_KEYxxx
是通过酷走 App 收藏添加的在线电台列表;LOCAL_SAVE_MUSIC_IS_PAUSE_KEY
表示保存的音乐播放暂停状态;LOCAL_SAVE_RADIO_IS_PAUSE_KEY
表示保存的电台播放暂停状态;com.kh.tong.term.statemachine.TermMenuSM.LAST_SAVED_MENU_KEY
表示保存的菜单键状态(0:音乐,1:点播,2:电台);com.kh.tong.term.statemachine.TermAudioVolumeSM.PrefKeyVolumn
为系统音量值;Password
为记录仪的管理密码。
对于老版本系统音乐播放的暂停状态得不到保存的问题,可以修改系统脚本强制设为暂停状态,需要播放音乐时通过蓝牙按键启动,我是在 /system/bin/load_iwlwifi.sh
文件后附加操作命令的:
shell@Sf3gr_mrd6_p2_720:/ # cat >> /system/bin/load_iwlwifi.sh KUZO_CFG="/data/data/com.kh.tong.termmanager/shared_prefs/KUZOConfig.xml" busybox sed -i '/LOCAL_SAVE_MUSIC_IS_PAUSE_KEY/s/value=".*"/value="true"/' $KUZO_CFG busybox sed -i '/LOCAL_SAVE_RADIO_IS_PAUSE_KEY/s/value=".*"/value="true"/' $KUZO_CFG
VideoServer
录像 App 的配置文件 /data/data/com.kh.videoserver/shared_prefs/com.kh.videoserver_preferences.xml
比较简单:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="rtsp_port">8886</string> </map>
可以通过 rtsp_port
参数修改视频服务器的 RTSP 端口号。
共有 0 条评论