[随笔] 老谢与Google的一次正面”交锋”
一、废话
话说智能电视,国内液晶电视厂商确实引领着时代潮流。而从全球来看,继几年前Google I/O大会之后,也渐渐掀起一股智能电视热潮。Google Android开放系统在智能电视中的应用也开始崭露头角。Google和MediaTek在智能电视方向的绑定式发展也必将再次将Android智能电视的发展推向另外一个高度。
老谢有幸加入了Andriod大流,最近处理了一题,想和大家分享分享。与其说这次是老谢与Google的一次正面交锋,不如说这是一次学以致用的收获。
二、Google遇到死机
问题往往都是基于某个平台的。
Google Android开放智能电视已经基本开发成型。基于这个平台,Google想用usb dongle替换原本电视中的Front-end(tuner&demod)底层部分,即基于Android智能电视+usb dongle实现电视扫台看台功能。其开发的步骤大致可以分为:
- 第一步,基于原本电视上的tuner&demod作为底层硬件和driver驱动,开发上层apk应用程序;
- 第二步,基于第一步,待应用层开发成型后,使用usb dongle替换原本的底层硬件及driver。
而,正是在第一步的开发过程中,Google遇到一个问题,即扫完台后,切台宕机(hang-up)。
三、如何搭建平台
老谢真言:要解决问题,必须复制问题。
继前文提及,Google借Front-end的壳,玩自己的apk。现在出现问题,我们却逃不掉。按照老谢真言,首先必须要设法搭建同样的平台环境,并复制到同样的问题现象,此乃第一步骤。
老谢按照如下步骤,搭建开发环境。
- Google提供其Java app source code,code的具体内容不展开,也不能展开(你懂的)
- 将Google提供的source code解压并放置于./device/google/archer/目录下
- 修改device.mk将Google提供的source code添加进build list
- 重新编译android body,这样新生成的system.img中便包含了Google apk
- 将system.img升级到TV platform
但是,升级成功后,还不能使用Google apk应用程序,因为还少了jni(java native interface)。Google开发Java应用程序,如果想要调用C语言函数(Front-end driver是C语言),就不能少了jni。如此,我们还需要将jni库push到TV平台上。
- 将Google提供的libtunertvinput_jni.so库push到TV平台的/system/lib目录下,这是通过adb(android develop bridge)实现的。
- 如何push libtunertvinput_jni.so到/system/lib呢?
a. 在windows环境下安装adb tool(自行baidu,百度最近也算是倒霉了,魏则西事件呢),不介绍。
b. 连接TV usb adb port到windows PC usb port,此时在资源管理器中要看到如下:
c. 在windows环境下启动cmd命令行,并使用如下命令push .so到TV platform
adb root
adb remount
adb push libtunertvinput_jni.so /system/lib
- 重启TV platform后,即可启动Google apk。
至此,老谢终于将平台搭建起来,接下来便开始复现Google report的问题。
四、死机问题的分析
在debug过程中,老谢发现Google apk的扫台流程如下:
- TunerOpen() is called.
- TunerConnect() is called for each frequency, it means TunerConnect() is called many times.
- At last, TunerClose() is called. It is strange to call TunerClose() at this moment.
在第三步中呼叫了TunerClose(),这个行为有问题,因为在TunerClose()中会删除semaphore。删除后,然后直接调用TunerConnect()做切台动作时,出现死机现象,因为semaphore。
老谢分享这篇文章,主要是想鼓励自己和在路上的朋友继续并深入地学习Android知识。
通过这个问题的处理,老谢自己也意识到,如果没有之前Android知识的累计,估计现在老谢还在想这个问题如何下手呢……
itxiebo
20160504