管控963和920差异.md 15 KB

一、管控APP功能分析

1、包含的服务

1.1、BackService

系统启动成功之后,如果打开酒店模式或者网络变化,就会打开TclIntentService,之后每半小时启动一次service。

1.2、TclIntentService

  • 接受action为connect_server

    • 接受index_order
    • - REQUEST_CHECK_APK

​ 自升级和更新

  • - - SYSTEM_MODE_CHANGED

禁用APP,启用默认APP

  • - - REQUEST_CHECK_OTA

​ 检测OTA升级

  • 接受action为com.android.systemservice.MANAGEMENT_APP

​ 禁用APP,启用默认APP

1.3、TvOnlineService

  • /api/tvlogs/tv_turn_on 上报数据

1.4、AppOnlineService

  • /api/tvlogs/tv_app_turn_on 上报数据

1.5、GrantService

  • action 为 com.tcl.grant.AUTH 或者 action 为com.android.systemservice.auth.CHANGED

​ 延迟20s之后,如果酒店模式打开了,调用 /api/terminal2 接口 进行注册。

注册成之后调用 /api/heartbeat2 获取在线授权信息。然后按照接口返回的心跳时间进行下一次操作。

  • 应用自升级(应用平台)

2、包含的广播

2.1、ManagementReceiver

  • 启动成功或者收到TCL 的P0广播

    • 启动 TclIntentService ,action 为 ACTION_MANAGEMENT_APP, 禁用APP,启用默认APP
    • 如果开启酒店模式,发送com.tcl.grant.AUTH,启动GrantService
    • 检查授权信息
  • 启动成功

    • 启动 TvOnlineService ,调用 /api/tvlogs/tv_turn_on
    • 启动 AppOnlineService,调用 /api/tvlogs/tv_app_turn_on
    • 如果开启酒店模式,发送com.tcl.grant.AUTH,启动GrantService
    • 检查APP更新,检查OTA更新
  • 收到TCL P0广播

    • 注册网络变化广播
    • 启动TclIntentService,action为 connect_server,index_order 为 SYSTEM_MODE_CHANGED,禁用APP,启用默认APP
  • 网络变化或者酒店模式改变

    • 启动TclIntentService,action为 connect_server,index_order 为 SYSTEM_MODE_CHANGED,禁用APP,启用默认APP
    • 如果开启酒店模式,发送com.tcl.grant.AUTH,启动GrantService
  • 检测USB挂载

检查U盘更目录下的 /installation/installation文件的installation字段,如果是true就打开GrantActivity

2.2、TclBroadcastReceiver

  • 启动成功

    • 启动 BackService -> 启动TclIntentService

​ action 为 connect_server,index_order 为 REQUEST_CHECK_ALIVE 空实现

  • 网络变化或者action为ACTION_OTA_TEST(com.android.systemservice.OTA_TEST)

    • 启动 BackService -> 启动TclIntentService

​ action 为 connect_server,index_order 为 REQUEST_CHECK_ALIVE 空实现

    • 启动TclIntentService,action为 connect_server ,附带参数 index_order 分别为 REQUEST_CHECK_APK,REQUEST_REGISTER,REQUEST_CHECK_OTA
    • - REQUEST_CHECK_APK

调用 api/upgrade 接口下载和更新apk

  • - - REQUEST_REGISTER

​ 空实现

  • - - REQUEST_CHECK_OTA

​ ota升级逻辑

  • 检测USB端口挂载

本地离线授权

  • 检测外设摄像头插拔

​ 插:展示摄像头信息,拔:关闭摄像头

3、主要功能汇总

3.1、自更新和升级,包括应用平台

3.2、APK管理,包括禁用和启用

3.3、检测OTA升级(管控后台)

3.4、向/api/tvlogs/tv_turn_on 上报数据(可以考虑去掉)

3.5、向/api/tvlogs/tv_app_turn_on 上报数据(可以考虑去掉)

3.6、酒店注册 /api/terminal2

3.7、获取在线授权信息 /api/heartbeat2

3.8、本地离线授权和在线授权结合

3.9、检测外设摄像头挂载(暂时没有用到,)

二、963和920差异对比

1、TclIntentService

com.android.systemservice.server.TclIntentService

//920上的实现
private List<String> getDisableList(AppInfo info, String softVersion) {
        //这里不一致
        if (info == null || softVersion == null || softVersion.trim().length() == 0) {
            return null;
        }
        String ver = softVersion.substring(0, 7);
        Log.i(TAG, "ver:" + ver);
        switch (ver) {
            case Constants.SOFT_VERSION_A260:
                return info.getDisableA26X();
            case Constants.SOFT_VERSION_A360:
                return info.getDisableA36X();
            case Constants.SOFT_VERSION_G5X://这里不一致
                return info.getDisableG5X();//这里不一致
            default:
                return info.getDisable();
        }
    }
//963上的实现
private List<String> getDisableList(AppInfo info, String softVersion) {
              //这里不一致
        if (info == null || softVersion == null || softVersion.trim().length() < 7) {
            return null;
        }
        String ver = softVersion.substring(0, 7);
        Log.i(TAG, "ver:" + ver);
        switch (ver) {
            case Constants.SOFT_VERSION_A260:
                return info.getDisableA26X();
            case Constants.SOFT_VERSION_A360:
                return info.getDisableA36X();
            case Constants.SOFT_VERSION_T972://这里不一致
                return info.getDisableA26X(); //这里不一致
            default:
                return info.getDisable();
        }
    }

2、Constants

com.android.systemservice.utils.Constants

  //920
  public static final String SOFT_VERSION_A260 = "V8-S38P";
  public static final String SOFT_VERSION_A360 = "V8-A962";
  public static final String SOFT_VERSION_G5X = "V8-A920";


  //963
  public static final String SOFT_VERSION_A260 = "V8-S38P";
  public static final String SOFT_VERSION_A360 = "V8-A962";
  public static final String SOFT_VERSION_T972 = "V8-A972";
    public static final String ANDROID = "android";

3、AppInfo

com.tcl.app.AppInfo

//920
public List<String> getDisableG5X(){
    return DisableAppG5X.list;
}


AwesomeHotelDisable@add
public void add() {
  awsomeHotelDisable.add(AWSOME_HOTEL2);
  awsomeHotelDisable.add(APP_MANAGER);
  awsomeHotelDisable.add(UPDATE);
}


DisableAppA26X#list
public List<String> list = Arrays.asList("com.android.tcl.messagebox", "com.tcl.c2dm.client",
                "com.tcl.appmarket2", "tv.huan.tvhelper", "com.tcl.MultiScreenInteraction_TV", "com.droidlogic.miracast",
                "com.hpplay.allcast", "com.huan.edu.lexue.frontend", "com.tcl.browser", "com.audiocn.kalaok.tv",
                "com.android.keychain", "com.tcl.SmartTVHelp", "com.tcl.bootadservice", "com.tcl.tv.jtq",
                "com.tcl.esticker", "com.tcl.appmarket2", "cn.wps.moffice_i18n_TV", "com.tcl.tshop",
                "com.tcl.weixin", "com.tcl.screensaver", "com.tcl.common.weather", "com.tcl.usagestats",
                "com.tcl.usercenter", "com.tcl.vod", "com.tcl.wholenetsearch", "com.tcl.gamecenter",
                "com.golive.cinema", "com.tcl.tvweishi");


DisableAppA36X#list
public final List<String> list = Arrays.asList("com.android.tcl.messagebox", "com.tcl.c2dm.client",
                "com.tcl.appmarket2", "tv.huan.tvhelper", "com.tcl.MultiScreenInteraction_TV", "com.droidlogic.miracast",
                "com.hpplay.allcast", "com.tcl.tshop", "com.golive.cinema", "com.audiocn.kalaok.tv",
                "com.tcl.weixin", "com.tcl.vod", "com.tcl.tvhealthcheck", "cn.wps.moffice_i18n_TV",
                "com.tcl.browser", "com.tcl.bootadservice", "com.tcl.screensaver", "com.tcl.usagestats",
                "com.tcl.tv.jtq", "com.tcl.gamecenter", "com.tcl.triava", "com.tcl.common.weather",
                "com.tcl.wholenetsearch", "com.tcl.SmartTVHelp", "com.huan.edu.lexue.frontend", "com.tcl.voicemanager",
                "com.tcl.usercenter", "com.tcl.tvweishi");


DisableAppG5X#list
public static final List<String> list = Arrays.asList("com.pptv.tvsports.preinstall","com.tcl.wholenetsearch",
                "com.tcl.initsetup","com.tcl.common.weather","com.golive.cinema","com.tcl.browser",
                "com.tcl.appmarket2","com.tcl.tshop","com.android.tcl.messagebox",
                "com.tcl.vod","com.tcl.weixin","com.tcl.SmartTVHelp","com.tcl.gamecenter",
                "com.tcl.usercenter","com.tcl.tvweishi","com.tcl.ffeducation","com.tcl.c2dm.client",
                "com.tcl.usagestats");


//963
AwesomeHotelDisable@add
public void add() {
  awsomeHotelDisable.add(AWSOME_HOTEL);
  awsomeHotelDisable.add(AWSOME_HOTEL2);
  awsomeHotelDisable.add(APP_MANAGER);
}


DisableAppA26X#list
public List<String> list = Arrays.asList("com.android.tcl.messagebox", "com.tcl.c2dm.client",
                "com.tcl.appmarket2", "tv.huan.tvhelper", "com.tcl.MultiScreenInteraction_TV", "com.droidlogic.miracast",
                "com.hpplay.allcast", "com.tcl.tvweishi", "com.huan.edu.lexue.frontend", "com.tcl.browser",
                "com.audiocn.kalaok.tv", "com.android.keychain", "com.tcl.SmartTVHelp", "com.tcl.bootadservice",
                "com.tcl.tv.jtq", "com.tcl.esticker", "com.tcl.appmarket2", "cn.wps.moffice_i18n_TV", "com.tcl.tshop",
                "com.tcl.weixin", "com.tcl.screensaver", "com.tcl.common.weather", "com.tcl.usagestats", "com.tcl.usercenter",
                "com.tcl.vod", "com.tcl.wholenetsearch", "com.tcl.gamecenter", "com.golive.cinema");


DisableAppA36X#list
public final List<String> list = Arrays.asList("com.android.tcl.messagebox", "com.tcl.c2dm.client",
                "com.tcl.appmarket2", "tv.huan.tvhelper", "com.tcl.MultiScreenInteraction_TV", "com.droidlogic.miracast",
                "com.hpplay.allcast", "com.tcl.tvweishi", "com.tcl.tshop", "com.golive.cinema",
                "com.audiocn.kalaok.tv", "com.tcl.weixin", "com.tcl.vod", "com.tcl.tvhealthcheck", "cn.wps.moffice_i18n_TV",
                "com.tcl.browser", "com.tcl.bootadservice", "com.tcl.screensaver", "com.tcl.usagestats",
                "com.tcl.tv.jtq", "com.tcl.gamecenter", "com.tcl.triava", "com.tcl.common.weather", "com.tcl.wholenetsearch",
                "com.tcl.SmartTVHelp", "com.huan.edu.lexue.frontend", "com.tcl.voicemanager", "com.tcl.usercenter");

4、ManagementReceiver

com.tcl.broadcast.ManagementReceiver

//963比920多了
//在ACTION_BOOT_COMPLETED之后
应用自升级检测
ota升级检测

5、GrantActivity

com.tcl.grant.GrantActivity 以963方式为主

//920
private void initGrantInfo(){
        mMac = TVUtils.getEthMacAddress();
        mGrantInfo = new DeviceInfo();
        mGrantInfo.setMac(mMac==null?mMac:mMac.replace(":",""))
                .setMachineType(TVUtils.getModelName(getApplicationContext()))
                .setVersion(HotelUtils.getAgencyVersion(getApplicationContext()))
                .setVer(TVUtils.getSoftwareVersion()) //这里
                .setLauncher(mLauncher);
    }
//963
private String getSoftwareVersion() {
        if (mCustomerApiHandler.getCustomerApi() != null) {
            try {
                return mCustomerApiHandler.getCustomerApi().getSoftwareVersion();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return TVUtils.getSoftwareVersion();
    }

6、HotelUtils

com.tcl.hoteltv.factory.HotelUtils (此方法使用920的方式,但是要改动)

//920
public static String getDefaultAgencyVersion(Context context){
        StringBuilder builder = new StringBuilder();
        builder.append("TCL-")
                .append(TVUtils.getModelName(context))
//                .append("G60")
                .append("-20200325-V000");
        return builder.toString();
    }
//963
public static String getDefaultAgencyVersion(Context context) {
        StringBuilder builder = new StringBuilder();
        builder.append("TCL-")
                //.append(TVUtils.getModelName(context))
                .append("G60")
                .append("-20200325-V000");
        return builder.toString();
    }

7、TVUtils

com.tcl.hoteltv.factory.TVUtils (用920的方式,需要验证)

//920
 public static String getModelName(Context context) {
        String versionName = getSoftwareVersion();
        if (versionName.contains(Constants.SOFT_VERSION_G5X)) {
            return FactoryManager.getInstance(context).doGetProjectName();
        } else {
            return TDeviceInfo.getInstance().getModelName(getProjectIDValue(context));
        }
    }


//963
public static String getModelName(Context context) {
        return TDeviceInfo.getInstance().getModelName(getProjectIDValue(context));
    }

8、Files

com.tcl.utils.Files

//920
public static void changePermission(String path){
        FileUtils.setPermissions(path, FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IRWXO, -1, -1) ;
    }
//963
public static void changePermission(String path){
        MyFileUtils.setPermissions(path);
        //FileUtils.setPermissions(path, FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IRWXO, -1, -1) ;
    }

9、jar包整理

两个机型都有的jar包:

ah-extension-1.0.1.aar

920文件md5:0794a887e3b80205854a3e3a4edc346d

  • 963文件md5:0794a887e3b80205854a3e3a4edc346d

appassistsdk-2.0.11.aar

920文件md5:a53bb0b822fb8245855bdcdf3add9783

  • 963文件md5:a53bb0b822fb8245855bdcdf3add9783

com.tcl.customerapi.jar

920文件md5:75802fa86e077513cf058db99cf4359f

  • 963文件md5:469bca8de85ca2c19c6ba9557e850425

com.tcl.tvos.addon.jar

920文件md5:2621d0f692fc8c4c83e8750efe5b5bfc

  • 963文件md5:2621d0f692fc8c4c83e8750efe5b5bfc

factory.jar

920文件md5:3a3895919fb0a80e93eae9ea8402536f

  • 963文件md5:3a3895919fb0a80e93eae9ea8402536f

fastjson-1.1.51.android.jar

920文件md5:24295b91c61c7a64dcba6b5518915867

  • 963文件md5:24295b91c61c7a64dcba6b5518915867

framework.jar

920文件md5:4146ff34d7040bc93470e6adddf9439a

  • 963文件md5:4146ff34d7040bc93470e6adddf9439a

services.jar

920文件md5:327debb1084d31350e4b721adea601b8

  • 963文件md5:327debb1084d31350e4b721adea601b8

snack-1.0.2.aar

920文件md5:cc2f1a12750505b0777e0e93d6be8a07

  • 963文件md5:cc2f1a12750505b0777e0e93d6be8a07

tornado-0.1.4.jar

920文件md5:01817d2b50ad9f5bfd1871095c208ee5

  • 963文件md5:01817d2b50ad9f5bfd1871095c208ee5

tvapi.jar

920文件md5:45949462ec4ec42ac6eb5d84ffe7da72

  • 963文件md5:45949462ec4ec42ac6eb5d84ffe7da72

zxing-core-3.3.3.jar

920文件md5:3ee2c714be5d25ac6c9b941f666bfea6

  • 963文件md5:3ee2c714be5d25ac6c9b941f666bfea6

仅963有的jar包

  • rainbow-0.1.jar
  • virtualApi-0.1.jar

三、合并方案

1、合并方式

有三种合并方式。

一种是不动代码结构,仅根据两者差异在差异点进行不同机型的适配,根据两个项目中源码对比的结果来看,此方法是可行的。此方法优点在于改动量小,而且基本能保证之前的功能。

第二种是大改代码结构,将整个项目进行重构,根据功能进行模块划分和重组。此方法的优点是可以趁机统一下代码风格,缺点是周期长,改动大,而且可能会丢失之前已经存在的功能。

第三种是前两者的结合,首先使用第一种方式完成不同机型的兼容。对项目内的部分功能点进行抽离和整理。

我个人建议采用第三种方式。

2、建议抽离的功能点

2.1、更新功能

包括应用自升级和ota升级的逻辑可以抽离到一起,提供统一入口

2.2、数据上报相关

提供统一的入口,定时进行数据上报。包括注册和心跳

2.3、授权相关

离线授权和在线授权的整合