2968方案介绍

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步骤
  1. 在prebuilts中创建leboTV文件夹

  2. 编写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)
    
  3. 需要在脚本中加上 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命令去替换

  1. 使用cp命令替换system/app/TSB_Tv1.apk, 然后要将TSB_Tv1.odex删除掉才能生效。

  2. 使用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\
编译全量包
  1. 在2968_dtmb$目录下输入 make ota命令 选择1是全量升级

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Stj0cqEE-1661048880185)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818141822700.png)]

  2. 然后输入编译好的基准包

    image-20220818150514024
  3. 编译完成后会生成全量包

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jKzakVzK-1661048880186)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818150908489.png)]

编译增量包
  1. 在2968_dtmb$目录下输入 make ota命令 选择2是曾量升级

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IokshZJS-1661048880186)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165119548.png)]

  2. 选择2之后输入修改之前的基准包,然后在输入修改之后的基准包

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlrQx5DC-1661048880186)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165341690.png)]

  3. 编译成功后会生成增量包

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kU4WgPnU-1661048880187)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165516472.png)]

OTA上报流程
  1. 确定是需要增量升级还是全量升级;

  2. 填写表格 例如:

    类型RTK2968K
    芯片名RTK2968K
    客户名D043
    机型Fun_P50-378V30_512M_4G_420MA_1366X768
    当前版本eng.zhangliang.20220624.133413
    新版本eng.guobin.20220802.144823
    全量升级全量升级
    升级方式非强制升级
    是否有效无效
    升级内容描述更新最新软件;解决卡死等问题
    OTA全量包路径
    MAC00:CB:B4:00:00:00 - 00:CB:B4:FF:FF:FF
    MD5cc701adada7a5755170ac833f89a8a9b
    size342334205
    OTA增量包名称OTA-RTK2968K-D043-Fun_P50-378V30_512M_4G_420MA_1366X768-Full-20220802_144823
    有效期3个月
    申请人郭彬
  3. 查看MD5命令:md5sum 增量包/全量包

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gEKRERsN-1661048880187)(C:/Users/Admin/AppData/Roaming/Typora/typora-user-images/image-20220818165701400.png)]

  4. 发送邮件给胡贵森;

  5. 将增量包或者全量包通过钉钉发送给胡桂森;

  6. 与胡桂森沟通内销软件就要上传到内销服务器,外销软件就上传到外销服务器即可;

  7. 将增量包或者全量包上传到服务器后,然后烧入当前版本的软件;

  8. 连续点击“机型名”:设置-》关于电视-》机型名; “会弹出OTA 测试模式开!”

  9. 进入设置-》升级-》检测新版本; 能弹出OTA升级框就表示推送成功;

  10. 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"
};
代码大致调用逻辑

​ 例如获取屏参名字的调用逻辑;其它的方法调用都是类似的

  1. TvManager mTvManager = (TvManager) context.getSystemService(Context.TV_SERVICE);
    mTvManager.getPanelName();
    
  2. 	frameworks/base/core/java/android/app/TvManager.java
    	public String getPanelName(){
    		try{
    			return	mService.getPanelName();
    		}catch(RemoteException ex){
    		}
    		return null;
    	}
    
  3. 	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("");
    	}
    
  4. 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按键流程

  1. kernel/android/KK/device/realtek/rtd298x/venus_IR_input.kl
key 0x23E       FACTORY_VOLUME_80
  1. kernel/linux/linux-3.7.2/include/uapi/linux/input.h
define KEY_FACTORY_VOLUME_80           0x23E
  1. kernel/android/KK/frameworks/native/include/input/KeycodeLabels.h
{ "FACTORY_VOLUME_80", 297 },
  1. kernel/android/KK/frameworks/native/include/android/keycodes.h
AKEYCODE_FACTORY_VOLUME_80       = 297,
  1. 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");
  1. 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,
  1. 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");
  1. kernel/android/KK/frameworks/base/core/res/res/values/attrs.xml
<enum name="KEYCODE_FACTORY_VOLUME_80" value="297" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值