何为定制Android系统?就是在特定的硬件上,移植上Android操作系统,并修改原生Android系统以提供给定制的APP操作定制硬件的方法。

所以,定制Android的主要工作有以下三部分:

  1. 适配硬件;
  2. 制作接口;
  3. 定制APP;

一般而言,定制的硬件会采用方案商提供的稳定方案,例如全至的a20方案、a31s方案、r16方案、飞思卡尔的i.MX6方案等等。这些方案拿过来,是一个类似于平板的开发板,在其上Android系统是能够跑起来的。然后就要根据自身的需求,把一些外围硬件适配上去,例如你要做一个音箱类的产品,你可能需要适配上牛掰的DSP,PA等等,如果你要做一个车机类的产品,你可能要适配上一个MCU,适配上倒车摄像头,如果是要做一个电视盒子,红外或者2.4g是必须的。这就是适配硬件所要做的工作。

定制的硬件产品一般都会应用于一些特殊的场景下,那么肯定会需要定制一个APP来和用户进行交互,完成用户所需要的功能。因为硬件是定制的,很多功能原生的Android系统并没有提供接口来操作,这就需要开发人员对Android进行修改,把操作硬件的方法暴露给APP。这就是我所做的工作。这部分的工作处于应用开发和驱动开发之间,我姑且称之为Android中间件的开发。

开发驱动的同事一般会提供给我一些设备节点,通过读写这些设备节点就可以操作外设。一般来说,操作设备节点的操作会用C/C++来实现。但是对于制作APP的同事,他们会习惯于使用Java这类高级语言,所以对于Android中间件的开发者,就要借助于JNI这一工具,构建连接C/C++和Java的桥梁。

在我的开发过程中,我使用过以下几种方法来提供操作硬件的接口:

  1. 提供JNI源代码;

提供JNI源代码是最裸的一种方式。一般在调试一个硬件功能的时候,我会编写一个简单的Demo APP。调试成功之后,我曾直接把Demo APP的源代码提供给APP开发者。这样,我的工作是最少的,只要调试完,就算是大功告成了。但是对于开发APP的同事来说,这种提供接口的方式需要他们具备一定的JNI开发知识,这就无形中增加了他们的工作量。在我看来,APP开发应该讲经历集中于与用户的交互上,而不是具体的功能的实现细节上。所以这种方法并不好。

另外一方面,因为接口的源代码文件肯定不止一个,那么源代码的版本控制也是一个问题。

  1. 提供JNI编译的库文件;

具体来说,提供库文件有两种方式。一种是给APP提供JNI编译之后的库文件,由他们集成到APP中。这种方式只是简化了版本控制的问题(因为只有一个库文件),对APP开发者的要求没有减少。另一种是把JNI在源代码的环境中编译,编译完之后库文件就在/system/lib/下面了。APP只需运行在特定固件中就行了。这种方式的版本控制问题更严重。因为采用这种方式,在库函数载入的时候会检查APP中声明的接口函数是否和当前库中的函数一一对应,不对应会直接崩掉。所以,如果在某个版本之后,APP新增了一个接口,那么这个新的APP就不能运行在老的固件中了。

  1. 编写后台运行的服务;

为了解决上面的问题,可以编写一个Service。由这个Service来和APP进行交互。因为Service是内置在固件内部的,所以这个Service和JNI不会有版本匹配的问题。而且交互的过程全部都是通过Java实现的(APP开发者最开心了)。APP和Service是运行与不同进程中的,Android的IPC一般有两种方式,一种是通过系统广播,一种是通过AIDL。前者的优点是使用简单,调用不同的接口只需发送不同的广播就行了,返回值则通过接收广播来获取。它的缺点通过广播调接口的实时性不能保证。后者则编写难度较大。各位可以找一下远程服务的代码看看,为了调一个接口,需要编写很多行的代码,这个也是APP的开发人员不想看到的。

其实IPC还有另外一种方式,就是通过socket。这种方式我没有用过,因为其代码编写的量也不少。

  1. 增加系统服务;

这种方式在我目前看来,是最好的方法。为什么好呢?下次再说。已经快一点了,明天还要上班。

定制Android系统开发之一——提供接口的方式相关推荐

  1. 定制Android系统开发之二——系统服务

    转自:http://blog.csdn.net/wtianok/article/details/49175581 何为系统服务 做Android APP开发的过程中,会经常需要调用类似于下面这样的函数 ...

  2. Android系统开发 默认壁纸的定制 主题风格的开发及定制 DDMS 常用adb 命令 抓取Log

    Android系统开发             Android系统本身的功能在增加和完善过程中.在系统开发中如果涉及系统API的改动,则一定要慎重,系统的API的改动可能涉及Android应用程序的不 ...

  3. Android 系统开发做什么?

    题外话 18 年我从 Android 应用开发转 Framework 层开发了,从此开启了 996 幸福生活,博客技术文更新基本停滞了,被工作占据了过多的精力,实在没时间像以前一样拟稿.写作,实践.反 ...

  4. 《Android系统开发》笔记

    <Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包括安全性,内 ...

  5. 浅谈Android系统开发中LOG的使用【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以 ...

  6. 浅谈Android系统开发中LOG的使用

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...

  7. Android系统开发 ----- 系统服务开发

    系列文章目录 Android系统启动 ---- 主要流程类_MrDarly的博客-CSDN博客Android系统启动Zygote关系主要的类https://blog.csdn.net/weixin_6 ...

  8. Android系统开发(移植)和应用开发

    Android是个开源的操作系统,所以可以选择的开发方式主要有两种: Android系统开发(移植): Android应用开发 1.Android系统开发(移植) Android系统开发(移植)属于底 ...

  9. Android菜鸟如何学习Android系统开发?

    如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...

最新文章

  1. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )
  2. typora将html转为格式,Typora 修改配置文件实现自定义标签样式(常用)
  3. 深入Java虚拟机读书笔记第五章Java虚拟机
  4. 菜鸟、普通、老鸟程序猿如何写奇数判断?--位操作符妙用
  5. for...in和for...of以及for( :)的区别
  6. C++ vector类详解
  7. 高质量JAVA代码编写规范
  8. EXCEL同列多个重复数值去重保留一个
  9. Android7.1开机启动wifi adb
  10. cad2010多个文件并排显示_win10系统下CAD打不开多个窗口、文件如何解决
  11. java基础:网络编程(三)UDP编程
  12. php拍照功能,Javascript+PHP兑现在线拍照功能
  13. Macbook PS快捷键
  14. 产品设计(1):开源产品设计工具pencil
  15. 百度排名批量查询_企业网站建设,核心关键词排名丢失,怎么办?
  16. 计算机音乐出山,《出山》音乐
  17. 山西省大同市谷歌高清卫星地图下载
  18. 判断浏览器是否为ie8调样式
  19. Access-Control-Allow-Headers是什么?有什么作用?
  20. top命令的原理是什么

热门文章

  1. PDF怎么转Word?安利下面这三款软件给你
  2. 盐城北大青鸟:学生缺乏什么?目标!
  3. Elasricsearch搜索速度优化
  4. 大型商贸系统(进货管理)技术解析(三)自营进仓冲红单
  5. 字符串比较的到底是什么?“abc“==“abc“?
  6. 记账类APP竞品分析-挖财与随手记
  7. 全站仪如何操作点到直线的测量?
  8. G003-186-08
  9. 基于easyExccel解析excel
  10. 微信小程序开发--分类页面实现