2968方案介绍
Tv菜单路径
2968_dtmb\kernel\android\KK\device\realtek\app\TSB_TV_merged1
工厂菜单路径
2968_dtmb\kernel\android\KK\device\realtek\app\EngineerMenu
本地播放路径
2968_dtmb\kernel\android\KK\device\realtek\app\MediaBrowser_2984
FactoryTool路径
2968_dtmb\kernel\android\KK\vendor\toptech\apps\FactoryTools
脚本存放路径
2968_dtmb\customer\buildsettings
room包路径
2968_dtmb\image_file_creator\RTK2968K.img
预制APK路径
2968_dtmb\kernel\android\KK\vendor\toptech\prebuilts
预制APK的方式
例如预制lebo.apk步骤
-
在prebuilts中创建leboTV文件夹
-
编写Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := leboTV //用来声明需要被生成的module名称 LOCAL_MODULE_TAGS := optional //将库编译到out\target\product\rtd298x\system\lib\ LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE).apk//编译生成后的目标文件 LOCAL_SRC_FILES := lebo.apk //需要编译的apk文件 LOCAL_CERTIFICATE := PRESIGNED //签名方式 LOCAL_MODULE_CLASS := APPS //将apk编译到prv-app路径下 LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) //安装路径 #for so libs LOCAL_PREBUILT_JNI_LIBS := $(shell [ ! -d $(LOCAL_PATH)/lib/armeabi-v7a ] || ls $(LOCAL_PATH)/lib/armeabi-v7a/*) //编译lib下的包 ifneq ($(LOCAL_PREBUILT_JNI_LIBS),) LOCAL_POST_INSTALL_CMD := $(hide) mkdir -p $(PRODUCT_OUT)/system/lib/; LOCAL_POST_INSTALL_CMD += cp -fn $(LOCAL_PREBUILT_JNI_LIBS) $(PRODUCT_OUT)/system/lib/; //将编译的lib包放入system/lib endif include $(BUILD_PREBUILT)
-
需要在脚本中加上 config_prebuild_modules=“leboTV”
编译APK
//在KK目录下使用 mmm -B 编译
2968_dtmb/kernel/android/KK$ mmm -B device/realtek/app/TSB_TV_merged1/ -j12
生成的APK路径:out/target/product/rtd298x/system/app/TSB_Tv1.apk
编译framework
mmm -B frameworks/base/services/java/ -j12
生成.jar路径:out/target/product/rtd298x/system/framework/services.jar
安装APK/jar
例如:编译完成后会生成out/target/product/rtd298x/system/app/TSB_Tv1.apk
jar包只能通过cp命令去替换
-
使用cp命令替换system/app/TSB_Tv1.apk, 然后要将TSB_Tv1.odex删除掉才能生效。
-
使用install命令安装进去,但是Tv重启后会清除掉安装apk;
编译tv_server
修改了2968_dtmb\system\project\TvServer目录下的代码
1. cd 到 2968_dtmb目录下
2. 通过make tv_server进行编译
3. make image 进行打包
4. 打包后重新烧入RTK2968K.img
编译bootcode
1 2968_dtmb$ make bootcode
2 2968_dtmb$ make iamge
编译android
1 2968_dtmb$ make android
2 2968_dtmb$ make iamge
编译ota包
2968_dtmb$ make ota
将软件打包为压缩包rar
2968_dtmb$ make rar
打包软件
2968_dtmb$ make image
编译OTA基准包
2968_dtmb$ source build.sh 脚本名 --ota
编译完成后基准包生成路径:2968_dtmb\kernel\android\OTA-standard\
编译全量包
-
在2968_dtmb$目录下输入 make ota命令 选择1是全量升级
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Stj0cqEE-1661048880185)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818141822700.png)]
-
然后输入编译好的基准包
-
编译完成后会生成全量包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jKzakVzK-1661048880186)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818150908489.png)]
编译增量包
-
在2968_dtmb$目录下输入 make ota命令 选择2是曾量升级
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IokshZJS-1661048880186)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165119548.png)]
-
选择2之后输入修改之前的基准包,然后在输入修改之后的基准包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlrQx5DC-1661048880186)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165341690.png)]
-
编译成功后会生成增量包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kU4WgPnU-1661048880187)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165516472.png)]
OTA上报流程
-
确定是需要增量升级还是全量升级;
-
填写表格 例如:
类型 RTK2968K 芯片名 RTK2968K 客户名 D043 机型 Fun_P50-378V30_512M_4G_420MA_1366X768 当前版本 eng.zhangliang.20220624.133413 新版本 eng.guobin.20220802.144823 全量升级 全量升级 升级方式 非强制升级 是否有效 无效 升级内容描述 更新最新软件;解决卡死等问题 OTA全量包路径 MAC 00:CB:B4:00:00:00 - 00:CB:B4:FF:FF:FF MD5 cc701adada7a5755170ac833f89a8a9b size 342334205 OTA增量包名称 OTA-RTK2968K-D043-Fun_P50-378V30_512M_4G_420MA_1366X768-Full-20220802_144823 有效期 3个月 申请人 郭彬 -
查看MD5命令:md5sum 增量包/全量包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gEKRERsN-1661048880187)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165701400.png)]
-
发送邮件给胡贵森;
-
将增量包或者全量包通过钉钉发送给胡桂森;
-
与胡桂森沟通内销软件就要上传到内销服务器,外销软件就上传到外销服务器即可;
-
将增量包或者全量包上传到服务器后,然后烧入当前版本的软件;
-
连续点击“机型名”:设置-》关于电视-》机型名; “会弹出OTA 测试模式开!”
-
进入设置-》升级-》检测新版本; 能弹出OTA升级框就表示推送成功;
-
OTA升级成功后,确定没有任何问题;然后联系胡桂森将OTA软件改为有效模式,推送客户升级;
无效模式:是我们自己测试的模式;
有效模式:是推送客户升级模式;
添加应用自启动白名单
start_app_whitelist.txt文件中写入应用自启动的包名即可
kernel\android\KK\vendor\toptech\prebuilts\common\start_app_whitelist.txt
添加防止应用被kill
在app_whitelist[]中写入包名即可
//kernel/linux/linux-3.7.2/drivers/staging/android/lowmemorykiller.c
static char *app_whitelist[] = {
"com.toptech.factorytools",
"com.toptech.systemupdate",
"com.dangbei.mimir.lightos.home",
"com.bestv.voiceAssist",
"com.aispeech.tvui",
"tv.fun.sdkmanager"
};
代码大致调用逻辑
例如获取屏参名字的调用逻辑;其它的方法调用都是类似的
-
TvManager mTvManager = (TvManager) context.getSystemService(Context.TV_SERVICE); mTvManager.getPanelName();
-
frameworks/base/core/java/android/app/TvManager.java public String getPanelName(){ try{ return mService.getPanelName(); }catch(RemoteException ex){ } return null; }
-
frameworks/base/services/java/com/android/server/tv/TvManagerService.java public String getPanelName(){ boolean result; Slog.v(TAG, "GetPanelName"); result = invoke("GetPanelName"); if (result == true) { return getString(); } return new String(""); }
-
2968_dtmb/system/project/TvServer/executor/RemoteAPI/EngineerFactoryApi.cpp const char* GetPanelName() { PANEL_CONFIG_PARAMETER* pPanelParam = Panel_GetPanelConfigParameter(); if (pPanelParam) { printf("[%s] panel : %s\n", __FUNCTION__, pPanelParam->sPanelName); return pPanelParam->sPanelName; } else { printf("[%s] pPanelParam is null : %s\n", __FUNCTION__, PANEL_NAME); return PANEL_NAME; } }
语音遥控器相关配置
获取语音APK是和该方案语音厂商提供
预制语音遥控器APK路径;
2968_dtmb\kernel\android\KK\vendor\toptech\prebuilts\funshion\apps\AiSpeech\
2968_dtmb\kernel\android\KK\vendor\toptech\prebuilts\funshion\apps\VoiceAssist\
目前2968方案支持金桔语音遥控器和方糖遥控器;但是由于develop/master_Funshion分支添加了金桔dongle协议;协议是由config_jinju_protocol_enable属性控制;在脚本中添加了这个属性就导致除金桔遥控器其它语音遥控器无法控制Tv;
主要涉及的类和重点方法:
kernel/android/KK/frameworks/base/policy/rtd298x/src/com/android/internal/policy/impl/UsbDeviceManager.java
这个类主要的作用:
1 获取设备id
2 检测遥控器是否支持协议;
3 获取金桔遥控器mac地址
3 重要方法:isKeyEventAvailable 检测输入语音遥控器是否支持协议
----------------------------------------------------------------------------------------------------------------------
kernel/android/KK/frameworks/base/policy/rtd298x/src/com/android/internal/policy/impl/PhoneWindowManager.java
//按键拦截的方法
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
//以上代码省略......
//获取是否打开dongle协议属性
boolean isEnableProtocol = SystemProperties.getBoolean("persist.sys.jinju_protocol",false);
if (isEnableProtocol) {
//判断改遥控器是否通过协议检测
if (!mUsbDeviceManager.isKeyEventAvailable(event)) {
Log.d(TAG, "Invalid device key event: " + event);
return -1;
}
}
//以下代码省略......
}
----------------------------------------------------------------------------------------------------------------------
//通过UsbDeviceManager.java中获取金桔遥控器mac地址,然后通过JinJuManager进行UI显示
2968_dtmb\kernel\android\KK\device\realtek\app\EngineerMenu\src\com\rtk\engmenu\JinJuManager.java
响应语音按键代码:
kernel/android/KK/frameworks/base/policy/rtd298x/src/com/android/internal/policy/impl/PhoneWindowManager.java
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
//以上代码省略......
//按下按键后,发送广播去启动风行的语音功能;代码如下
if(keyCode == KeyEvent.KEYCODE_VOICE_SEARCH){
if (down) {
if(isVoice == 0) {
Log.d(TAG, "sound recording start");
Intent startIntent = new Intent(FUN_ACTION_AUDIO_START);
startIntent.setPackage("com.bestv.voiceAssist");
mContext.sendBroadcast(startIntent);
isVoice = 1;
SystemProperties.set("mstar.audio_start", "1");
}
return -1;
} else {
Intent stopIntent = new Intent(FUN_ACTION_AUDIO_STOP);
stopIntent.setPackage("com.bestv.voiceAssist");
mContext.sendBroadcast(stopIntent);
isVoice = 0;
Log.d(TAG, "sound recording stop");
return -1;
}
//以下代码省略......
}
VoiceControl
主要作用:实现语音功能的地方;
与风行沟通,风行发送特定广播,我们接收到广播后自己做处理
例如:实现 音量加; 音量减;打开无线网络…等等
2968_dtmb\kernel\android\KK\vendor\toptech\apps\VoiceControl\src\com\toptech\voicecontrol\
主要是在CommandControlReceiver.java中进行逻辑处理
SystemUpdate
主要作用:进行OTA升级
2968_dtmb\kernel\android\KK\vendor\toptech\apps\SystemUpdate
FactoryTools
主要作用:老化模式;二代测试;
2968_dtmb\kernel\android\KK\vendor\toptech\apps\FactoryTools
ClearData
主要作用:当内存不足时候,会自动启动ClearData应用,来进行清除缓存,查看内存占用情况;工厂复位;卸载应用等;
2968_dtmb\kernel\android\KK\vendor\toptech\apps\ClearData
添加按键板
添加按键板请查看commit
git show db3039dfef949d53416ca1b3165730c7b66a38ba
遥控器添加
主要是把遥控器.h文件放入一下目录
customer/common/ir/
添加遥控器按键
例如:添加KEYCODE_FACTORY_VOLUME_80按键流程
- kernel/android/KK/device/realtek/rtd298x/venus_IR_input.kl
key 0x23E FACTORY_VOLUME_80
- kernel/linux/linux-3.7.2/include/uapi/linux/input.h
define KEY_FACTORY_VOLUME_80 0x23E
- kernel/android/KK/frameworks/native/include/input/KeycodeLabels.h
{ "FACTORY_VOLUME_80", 297 },
- kernel/android/KK/frameworks/native/include/android/keycodes.h
AKEYCODE_FACTORY_VOLUME_80 = 297,
- kernel/android/KK/frameworks/base/rtd298x/core/java/android/view/KeyEvent.java
public static final int KEYCODE_FACTORY_VOLUME_80 = 297;
private static final int LAST_KEYCODE = KEYCODE_FACTORY_VOLUME_80;
names.append(KEYCODE_FACTORY_VOLUME_80, "KEYCODE_FACTORY_VOLUME_80");
- kernel/android/KK/frameworks/base/core/res/res/values/attrs.xml
<enum name="KEYCODE_FACTORY_VOLUME_80" value="297" />
android/keycodes.h
AKEYCODE_FACTORY_VOLUME_80 = 297,
- kernel/android/KK/frameworks/base/rtd298x/core/java/android/view/KeyEvent.java
public static final int KEYCODE_FACTORY_VOLUME_80 = 297;
private static final int LAST_KEYCODE = KEYCODE_FACTORY_VOLUME_80;
names.append(KEYCODE_FACTORY_VOLUME_80, "KEYCODE_FACTORY_VOLUME_80");
- kernel/android/KK/frameworks/base/core/res/res/values/attrs.xml
<enum name="KEYCODE_FACTORY_VOLUME_80" value="297" />