[随笔] 老谢与Google的一次正面"交锋"

[随笔] 老谢与Google的一次正面”交锋”

一、废话

话说智能电视,国内液晶电视厂商确实引领着时代潮流。而从全球来看,继几年前Google I/O大会之后,也渐渐掀起一股智能电视热潮。Google Android开放系统在智能电视中的应用也开始崭露头角。Google和MediaTek在智能电视方向的绑定式发展也必将再次将Android智能电视的发展推向另外一个高度。

[随笔] 老谢与Google的一次正面"交锋"_第1张图片

老谢有幸加入了Andriod大流,最近处理了一题,想和大家分享分享。与其说这次是老谢与Google的一次正面交锋,不如说这是一次学以致用的收获。

二、Google遇到死机

问题往往都是基于某个平台的。

Google Android开放智能电视已经基本开发成型。基于这个平台,Google想用usb dongle替换原本电视中的Front-end(tuner&demod)底层部分,即基于Android智能电视+usb dongle实现电视扫台看台功能。其开发的步骤大致可以分为:

  1. 第一步,基于原本电视上的tuner&demod作为底层硬件和driver驱动,开发上层apk应用程序;
  2. 第二步,基于第一步,待应用层开发成型后,使用usb dongle替换原本的底层硬件及driver。

而,正是在第一步的开发过程中,Google遇到一个问题,即扫完台后,切台宕机(hang-up)。

三、如何搭建平台

老谢真言:要解决问题,必须复制问题。

继前文提及,Google借Front-end的壳,玩自己的apk。现在出现问题,我们却逃不掉。按照老谢真言,首先必须要设法搭建同样的平台环境,并复制到同样的问题现象,此乃第一步骤。

老谢按照如下步骤,搭建开发环境。

  1. Google提供其Java app source code,code的具体内容不展开,也不能展开(你懂的)
    这里写图片描述
  2. 将Google提供的source code解压并放置于./device/google/archer/目录下
    [随笔] 老谢与Google的一次正面"交锋"_第2张图片
  3. 修改device.mk将Google提供的source code添加进build list
    [随笔] 老谢与Google的一次正面"交锋"_第3张图片
  4. 重新编译android body,这样新生成的system.img中便包含了Google apk
    [随笔] 老谢与Google的一次正面"交锋"_第4张图片
  5. 将system.img升级到TV platform
    但是,升级成功后,还不能使用Google apk应用程序,因为还少了jni(java native interface)。Google开发Java应用程序,如果想要调用C语言函数(Front-end driver是C语言),就不能少了jni。如此,我们还需要将jni库push到TV平台上。

  6. 将Google提供的libtunertvinput_jni.so库push到TV平台的/system/lib目录下,这是通过adb(android develop bridge)实现的。

  7. 如何push libtunertvinput_jni.so到/system/lib呢?
    a. 在windows环境下安装adb tool(自行baidu,百度最近也算是倒霉了,魏则西事件呢),不介绍。
    b. 连接TV usb adb port到windows PC usb port,此时在资源管理器中要看到如下:
    [随笔] 老谢与Google的一次正面"交锋"_第5张图片
    c. 在windows环境下启动cmd命令行,并使用如下命令push .so到TV platform
    adb root
    adb remount
    adb push libtunertvinput_jni.so /system/lib
    [随笔] 老谢与Google的一次正面"交锋"_第6张图片
  8. 重启TV platform后,即可启动Google apk。

至此,老谢终于将平台搭建起来,接下来便开始复现Google report的问题。

四、死机问题的分析

在debug过程中,老谢发现Google apk的扫台流程如下:

  1. TunerOpen() is called.
  2. TunerConnect() is called for each frequency, it means TunerConnect() is called many times.
  3. At last, TunerClose() is called. It is strange to call TunerClose() at this moment.

在第三步中呼叫了TunerClose(),这个行为有问题,因为在TunerClose()中会删除semaphore。删除后,然后直接调用TunerConnect()做切台动作时,出现死机现象,因为semaphore。

[随笔] 老谢与Google的一次正面"交锋"_第7张图片

老谢分享这篇文章,主要是想鼓励自己和在路上的朋友继续并深入地学习Android知识。
通过这个问题的处理,老谢自己也意识到,如果没有之前Android知识的累计,估计现在老谢还在想这个问题如何下手呢……

itxiebo
20160504

你可能感兴趣的:(android,谷歌,智能电视)