Freescale IMX6 Android (6): 向SystemServer中添加Service

简述 前面的博客中,我们直接添加C lib到APK中,然后使用LoadLibrary加载这个库,同时添加一个class来作为中间层,直接使用这个C库中的native函数来控制硬件,这种做法将硬件与APK牢牢绑定,如果有多个APP来访问同一个硬件就会出现问题,代码也会有很多的重复,在Android中,我们使用Android的SystemServer向ServiceManager来将硬件的功能添加为一个服务,这样当一个APP需要使用硬件的时候就向SystemServer发出请求service服务,然后由ServiceMnager统一提供服务,提供统一的接口与硬件控制,即相当于多添加了一层,从而实现解耦。 详细原理 先看下图(图片来源于韦东山的Android视频资料)中的③②①,按照顺序: SystemServer会加载Cpp lib 在JNI_OnLoad中注册各个Service,SystemServer向ServiceManager添加服务 这些service就包括像串口/LED等硬件相关的服务 而使用的时候,就是7~5步骤: AddService:SystemServer向ServiceManager添加服务addServeice getservice:通过getservice来从SystemServer注册了的service中获取服务所具有的功能,例如ledctrl 使用Service的方法:APP使用一个Interface(即以i开头的对象)来使用service提供的功能,将服务请求到SystemServer去 APP/SystemServer/ServiceManager三者都是通过Bindler来通讯。 添加Service与使用Service的步骤 添加serviceAIDL文件,生成Interface java文件 因为系统中其他都aidl文件都放在frameworks/base/core/java/android/os下,所有我们也参考其他的文件添加一个ILedService.aidl:

可以看到这个interface前面有个@hide的修饰,表明是个hide

Continue reading »

Freescale IMX6 Android: APP通过JNI控制LED

本篇博客接上一篇的:Freescale IMX6 Android: 基于TQIMX6 给Toolbox添加LED控制程序,上一篇是直接将控制程序放到了Toolbox,本篇则是通过JNI调用C库来完成LED的控制,即APP–> C –> HW。 APK的编写(源码见末尾) 编写主要需要注意下面个事项与步骤 1. 更改xml在layout中添加控件 2. Checkbox与Button的添加及其click与checked事件的handler 3. Toast的使用 4. API版本问题 5. 文档的查询

Continue reading »

Freescale IMX6 Android: 基于TQIMX6 给Toolbox添加LED控制程序

本篇博文是为了后面的Android HAL层使用LED而做的准备,板子基于TQIMX6Q,Android 4.3,Android已经编译完成了,如果还没有可以参考前面我的博文:Freescale IMX6 Android: 使用HDMI作为Android显示输出的配置,以及TQ提供的开发者手册。 LED的硬件连接 LED4~6是给用户使用的,如下: 可以看到是GPIO3_21~23。而且是GPIO给高电平的时候接通。 LED软件方面的配置 直接导出使用 看到前面的原理图,在用户态直接将gpio导出来操作(gpiolib)是最容易的了,但是要在/sys/class/gpio中导出来需要知道各组gpio的base number,直接使用cat查看,结果如下:

  可以知道gpio3是从64开始的,gpio3-21为64+21=85,于是直接操作:

但是发现不成功,因为gpio已经被使用了,无法导出来,尽管操作的时候没有出现问题log提示。 使用Gpio-led 内核使用的是3.0.35版本的内核,尽管也有dts,但是Freescale在最开始的Linuxkernel中并没有使用,因此都是hard

Continue reading »

Freescale IMX6 Android: 手动制作Android启动用SD卡 省去MFGTOOLS烧写

Freescale IMX6的烧写方式在Windows下面一般使用MFGTools,但是TQ提供的MFGTools在Windows 10下面无法工作,USB的驱动不正常。于是想到Linux下面的烧写方式,结果一样出现问题,且因为TQ没有提供一些烧写程序的源码,因此无法更改与调试。因此TQ提供的两种烧写Android的方式都无法使用了,加之前面博文中,我也尝试使用NFS来启动,也没有达到需要的效果,因此这篇文章说一下自己原创的直接制作SD卡来启动Android。 LinuxSD卡烧写Android的尝试 因为这个方案是TQ给出的,所以我尝试的去使用了一下,结果无法使用,因此也写下来,希望其他人不用会去浪费时间,或者帮忙指出我的操作哪里不对。 按照官方的说法制作好了烧写用的SD卡,并且从SD卡启动之后,rcS中会自动去mount SD卡,然后解析EmbedSky.ini配置文件,但是解析的结果似乎不正确,以下是启动之后看到了rcS内容:

步骤非常直接,配置好各种需要的材料之后,直接调用一个可执行的ELF程序autoDownload,然后就没有反应了,使用ps命令也无法看到有此进程在工作。 分区mount 前面的博客(Freescale IMX6 Android NFS启动问题汇总)中提到了Android的启动过程,其中有一个步骤是mount各个分区,这个分区的mount list有一个和Linux 发行版类似的配置文件,IMX6的这个文件是fstab.freescale,其内容如下:

其中各个分区的信息可以参考这篇文章:安卓系统分区介绍,下面是我给出自己的理解,不保证准确: /system是system.img对应的partition /boot存放的应该是boot.img文件

Continue reading »

Freescale IMX6 Android NFS启动问题汇总

前面的一篇博文中,提到了要使用自己编译出来的Android来启动,且使用NFS的方式来启动Android,但是在今天的尝试中却遇到了问题。且最终没有解决,但是找到了替换方案,替换方案见下一篇博文。遇到的问题汇总如下,希望可以帮助遇到同样问题的人。板子用的还是TQIMX6Q(见以前的博文)。 Android NFS启动的rootfs制作与启动 要制作Android NFS rootfs,需要对Android的启动有一个基本的了解,推荐参考相关书籍。简单而已,Android的启动过程如下: uboot –> kernel –> Android Init in ramdisk(boot.img) –> Init 解析 init.rc –> Init 解析

Continue reading »

Freesacle IMX6 使用HDMI作为Android显示输出的配置

环境准备与编译 个人使用的是Ubuntu 12.04 X64,针对环境的配置,百度即可。板子使用的是TQIMX6Q。 lunch目标 但是,编译的时候使用的是TQ提供的脚本build_sh,根据这个脚本,可以看到lunch的目标是sabresd_6dq:

  即,TQIMX6的Android lunch目标其实使用的是sabred板子的目标,并没有自己添加lunch target,编译完成后,也没有userdata.img:

  同时也编译了uboot与uImage。 编译可能出现的问题 Android编译使用的是自带的ToolChain,自然不需要再自己配置。但是Host PC中的GCC也需要注意版本,否则会出现问题:

看log输出,还以为是Host GCC的Bug,换了多个版本的GCC之后,问题依旧,后来发现make时指定submake过多,将make

Continue reading »