开发Android硬件访问服务

Android 进入休眠分析 在 Android 的上层是使用 goToSleep() 这个函数让系统进入休眠的。但是这个命令为什么会让 Android 进入 Suspend Mode。   以前在做其他系统的时候, 一般都要自己手工去控制 apm_bios 这个设备的,比如使用 ioctl() 调用 apm_bios。所有的系统其原理都是差不多的。只是 Android 加入了一个封装, 使程序员可以更简单的操作, 可以不 阅读详情

在http://blog.youkuaiyun.com/getnextwindow/article/details/47731597中,为Android系统添加了HAL模块,开发好一个硬件抽象层以后,我们通常还需要在应用程序框架中实现一个硬件访问服务。硬件访问服务通过硬件抽象层(HAL)模块来为应用程序提供读写操作。由于硬件抽象层使用c++开发,而应用程序框架中的硬件访问服务是Java语言开发的,因此,硬件访问服务必须通过JNI来调用抽象层模块的接口。

Android系统的硬件访问服务通常运行在系统进程System中,而使用这些硬件访问服务的应用程序运行在另外的进程,所以需要Binder机制实现进程通信。

接下来要开发一个硬件访问服务FregService,它实现了硬件访问服务接口IFregService。首先介绍硬件访问服务接口IFregService的定义,然后介绍硬件访问服务FregService的实现,包括它的内部实现以及调用HAL模块的JNI实现,最后介绍如何在系统进程System中启动硬件访问服务FregService。

1.硬件访问服务接口定义
Android系统使用AIDL定义跨进程访问能力的服务接口,接口文件后缀是aidl,编译系统会将AIDL文件转换成一个Java文件,然后在对他进行编译。本小节将使用AIDL定义IFregService。
在Android4.0+系统中,硬件访问服务接口定义在下面目录中:

 frameworks/base/core/java/android/os/IFregService.aidl

IFregService.aidl定义如下:

1 package android.os;
2
3 interface IFregService {
4 void setVal(int val);
5 int getVal();
6 }

由于服务接口IFregService是使用AIDL语言描述的,因此,我们需要将其添加到编译脚本文件中,这样编译系统才能将其转换成Java文件,然后再对它进行编译。修改的Android.mk文件位于frameworks/base目录下面,对其中的LOCAL_SRC_FILES变量添加如下值:

services/instaboot/java/com/droidlogic/instaboot/IInstabootManager.aidl
LOCAL_SRC_FILES+=\
    services/instaboot/java/com/droidlogic/instaboot/IInstabootManager.aidl \
    ....

修改完编译脚本之后,我们就可以对服务接口IFregService进行编译了,命令如下:

mmm ./frameworks/base/

编译结果如下:

target Dex: framework
Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.dex
target Jar: framework (out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/javalib.jar)
Install: out/target/product/MagicBox_M13/system/framework/framework.jar

我们看到最终编译出framework.jar文件,这个JAR包中就包含IFregService接口,它继承了android.os.IInterface接口。在IFregService内部定义了一个Binder本地对象Stub,实现了IFregService接口,并且继承了android.os.Binder类。此外,在IFregService.Stub类内部,还定义了一个Binder代理对象proxy,同样实现了IFregService接口。如何确定framework.jar内部是否包含IFregService接口?很简单,android的framework.jar通过反编译工具可以清楚的看到源码,反编译的具体过程在文章http://blog.youkuaiyun.com/GetNextWindow/article/details/47748493介绍了。
反编译结果如下:
这里写图片描述

2.实现硬件访问服务
FregService从IFregService.Stub类继承下来,并且实现IFregService接口的成员函数setVal和getVal。
硬件访问服务通常实现在如下目录:

 base/services/java/com/android/server/FregService.java

编译方式:
mmm ./frameworks/base/service/

结果:生成的services.jar文件就包含FregService类。

3.实现硬件访问服务的JNI方法
在Android系统中,硬件访问服务的JNI方法实现在如下目录中:

frameworks/base/services/core/jni/com_android_server_FregService.cpp

完成JNI代码编写以后,我们需要修改:

frameworks/base/services/core/jni/onload.cpp

在里面增加register_android_FregService的声明和调用,onload.cpp文件实现在libandroid_servers模块中,当系统加载libandroid_servers模块的时候,就会调用onload.cpp文件中的JNI_OnLoad函数,这样就将JNI方法注册到了虚拟机当中。

最后还需要修改:

frameworks/base/services/core/jni/Android.mk

修改变量LOCAL_SRC_FILES的值,增加com_android_server_FregService.app。
编译方式:
mmm ./frameworks/base/services
结果:生成的libandroid_servers.so文件中包含了JNI方法

4:启动硬件服务
将硬件服务运行在系统进程System中,需要修改如下文件:

frameworks/base/services/java/com/android/server/SystemServe                   r.java

在其中添加如下代码:

            try {
                        Slog.i(TAG, "Freg Service");
                        ServiceManager.addService("freg", new FregService());
                } catch (Throwable e) {
                        Slog.e(TAG, "Failure starting Freg Service", e);
                }

编译方式:
mmm ./frameworks/base/services
结果:生成了services.jar文件就包含硬件访问服务FregService,并且在系统启动时,将它运行在系统进程System中。

Android TV通过inputs默认打开live tv Android TV项目由于会默认预装GMS包里面的所有apk,其中有个live channels的信源播放apk也是采用标准TIF架构的,由于该应用是Google为网络流媒体专门准备的,所以无法完美兼容本地的信源通道(比如ATV/DTV,HDMI,AV)。所以各大厂商都会基于AOSP上的live tv开发一个单独的通道播放apk,所以平台中可能存在2个支持TIF的channel apk。 而之前GTVS认证要求可以通过launcher上的inpu微件进行通道切换,当点击任意信源通道时是通过intent消 阅读详情

相关推荐

android通过硬件访问服务访问硬件LED

android通过硬件访问服务访问硬件LED,包括硬件访问服务访问LED的所有文件。aidl,led服务,onload.cpp文件,SystemServer.java,JNI文件等代码

S905系列的uboot分析

Ubuntu18.04通过PL2303HX连接TTL 接线的连接 PL2303的3.3V悬空, TX接盒子RX, RX接盒子TX, GND接盒子GND 终端选择 系统自带pl2303的驱动, 可以通过dmesg看到对应的设备, 例如 /dev/ttyUSB0, 留意一下设备的用户组, 例如我这个是dialout, 需要把自己这个用户加入这个用户组, 然后通过id检查是否生效, 不生效的话试试退出...

IOsetting的专栏 3597

APK通过硬件访问服务(HAL)实现驱动LED的dem.pdf

学习韦东山老师的4412开发板视频,做了点笔记,发出来跟大家分享一下这个学习的过程

q7固件 数码视讯_数码视讯Q7的刷机

Q7的硬件配置CPU: S905LRAM: MIRA P3P4GF4DMF/P3P4GF4BLF DDR3 512MB * 2 = 1GBROM: 镁光29F64G08CBABB(NAND) * 1 = 8GBor SanDisk SDINBDG4-8G(eMMC) * 1 = 8GBWIFI: RTL8189FTVAMP: SGM8905Interface: USB2.0 * 2, AV * ...

weixin_42498003的博客 6720

海康AI开放平台实战:从数据集标注到摄像头部署的全流程避坑指南

本文是一份基于实战经验的海康AI开放平台全流程避坑指南。文章详细拆解了从数据集标注、模型训练优化到边缘摄像头部署的关键步骤,重点剖析了数据准备、参数调优、模型测试及SDK集成中的常见陷阱与解决方案,旨在帮助开发者高效、稳定地将AI算法落地于实际监控场景。

weixin_29103191的博客 697

Gemma 4 12B QAT+MTP小显存部署实战指南

大语言模型本地部署的核心瓶颈在于显存与推理效率的平衡。量化感知训练(QAT)通过在训练阶段模拟低精度计算,显著提升模型对INT4量化的鲁棒性;多令牌预测(MTP)则通过并行解码优化KV Cache复用,降低GPU kernel调用频次。二者协同可在8GB显存设备上稳定运行12B级模型,兼顾精度、速度与上下文长度。该方案适用于开发者本地AI助手、技术文档生成、SQL翻译等轻量但高交互需求场景,是当前Windows环境中小显存高效落地Gemma系列模型的工程最优解。

weixin_30934229的博客 377

Android 字符驱动#2#开发Android硬件访问服务和JNI

开发Android硬件访问服务 定义硬件访问服务接口 首先,在android的源码framework目录,创建aidl文件,为其他应用提供上层调用接口 xuzhike@ubuntu:~/mtk_6737_6.x_wtwd_8_qiku_LE_PLUS/android/qiku/frameworks/base/core/java/com/jdf/android/hal$ ls IHelloServi...

星空点点 131

Unity3D实战:用EasyAR4.0稀疏空间地图打造AR导航应用(附完整代码)

本文详细介绍了如何使用Unity3D和EasyAR4.0的SparseSpatialMap功能构建AR导航应用。通过稀疏空间地图技术,开发者可以创建室内导航系统,解决传统GPS在室内环境中的局限性。文章包含完整代码示例,涵盖环境配置、地图构建、导航实现及性能优化等关键步骤,助力开发者快速掌握AR导航开发技巧。

t8u9v0的博客 1197

安卓进阶四:硬件抽象层HAL之 开发硬件访问服务及测试

注意这个硬件访问服务是在framework层开发的,通过它就搭起硬件抽象层和应用层之间沟通的桥梁。这里有两个技术难题: framework和硬件抽象层之间:framework层用java,硬件抽象层用c++,相当于两个语言不同的人,那他们怎么交流?需要翻译软件(JNI) ...

我的安卓之路 634

多臂老虎机——入门强化学习

多臂老虎机(Multi-Armed Bandit,MAB)问题是强化学习的经典入门例子,也是理解探索与利用(exploration-exploitation)平衡的重要案例。

qq_56683019的博客 2462

YOLOv8优化:特征融合 | 金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块 | 25年7月最新成果

将 PST 嵌入当前最先进的实时检测模型(YOLOv11-N/S/M)后,在 MS COCO 上的 mAP 分别提升 0.9%、0.5%、0.4%,而延迟增加极小。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 613

HAL(4) -- 开发android源码硬件访问服务和应用测试程序

通常情况下,开发好硬件抽象层模块后,通常需要在应用程序宽假层中实现一个硬件访问服务! 硬件访问服务通过硬件抽象层模块来为应用程序提供硬件读写操作。 由于硬件抽象层模块式使用C/C++语言来开发,应用程序框架层中的硬件访问服务是使用java语言来开发, 因此,硬件访问服务需要通过java接口(JNI)来调用硬件抽象层模块!     (1):定义硬件访问接口 (以下内容涉及aidl,有兴趣

zheng_he_xiang鸟哥的专栏 1103

[QMT量化交易小白入门]-二十四、年化收益47%的全球核心资产轮动策略(含代码解析)

m_days = 25 #动量参考天数period=200m_days被设置为25,表示动量参考的天数为25天;period被设置为200,用于指定获取市场数据的周期长度。

木头大左的博客 2973

安卓驱动开发之-(二)硬件服务访问LED

学完安卓驱动硬件访问流程之后,我们使用安卓的硬件访问服务来访问LED,所以本文是基于LED初体验编写的。 一、从上节硬件访问服务框架我们知道,安卓系统提供并实现ILedService.java函数供APP调用,所以我们就可以利用iLedService来实现对LED的控制。在代码中原来我们直接利用JNI的部分就可以省略掉,包括:打开、关闭、控制,进而替换为服务的注册,服务函数的调用等。 代码:

昇威技术 520

FOC高频注入量产级C语言实现方案

高频注入技术是无传感器FOC实现零速和低速控制的关键方法,解决了传统反电动势观测器在低速失效的问题。该技术通过向电机注入高频电压信号,利用永磁同步电机凸极性特性,从高频电流响应中解调出转子位置信息。文章详细介绍了三种主流高频注入方法(旋转电压注入、脉振电压注入和脉振电流注入)的原理及实现流程,重点分析了脉振电压注入的信号处理步骤和位置观测器设计。同时提供了完整的C语言实现代码,包括硬件抽象层、核心算法模块(坐标变换、电流环、SVPWM等)和系统集成方案,并给出量产优化建议和安全保护机制。这套方案适用于要求高

汽车软件开发 795

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

嵌入式Android底层开发(三)硬件访问服务框架

一、简单的Android应用程序调用硬件流程图(通过JNI接口直接访问) 但这样存在一个很大的问题:访问仅限与单一程序进行访问,如果多个APP同时访问一个硬件资源(多个APP都需要在LCD进行显示、多个APP想要播放音乐) 如何解决?添加一层SystemServer,SystemServer作为APP的选择器,提供仲裁 二、Android的硬件访问服务框架 上面提出了SystemServer,而在Android中SystemServer是使用JAVA编写,这就意味着SystemServer执行完成后依然

阿——波罗的博客 974

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

安卓驱动开发之-(二)硬件访问服务_框架

安卓驱动中怎么实现硬件访问服务? 一、先从安卓源码中分析一下振动器服务的的流程。 (1)、打开SystemServer.java (\frameworks\base\services\java\com\android\server) 该函数主要注册了一个JNI的本地方法。 (2)、打开Onload.cpp (\frameworks\base\services\core\jni)

昇威技术 678

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

安卓驱动开发之-(二)硬件访问服务_编写系统代码

一、首先介绍下AIDL文件 1、AIDL (Android Interface Definition Language ) 2、AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 Messenger ,如果不需要IPC 可以使用Binder 3、AIDL语法:基础数据类型都可以适用,List Map等有限适用。static field 不适

昇威技术 676

Android 系统源码情景分析读书笔记(1)----开发Android 硬件访问服务

1.硬件访问服务接口的路径  (用AIDL定义)   1. 代码存放路径如下:MocorDroid4.4_TShark28_MP_W14.47.2\frameworks\base\core\java\android\os  2. Android.mk  编译服务接口         MocorDroid4.4_TShark28_MP_W14.47.2\frameworks\base ...

程序员Android 1102

Android HAL 层框架分析以及代码示例

本文参考 《Android系统源代码情景分析》 一 硬件抽象层概述 二 开发Android硬件驱动程序 三 开发Android硬件抽象层模块 3.1 硬件抽象层模块文件 命名规范 3.2 硬件抽象层模块结构体 以及 硬件抽象层设备结构体 定义规范 3.3 编写硬件抽象层模块接口 四 开发Android硬件访问服务 4.1 定义硬件访问服务接口 4.2 实现硬件访问服务 4.3 实现硬...

奶牛养殖场小马 1万+

在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务

在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件。因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的。硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序;而驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功

老罗的Android之旅 10万+

Android的硬件访问服务添加

【版权申明】转载请附上出处链接 Android的硬件访问服务添加 todo 在frameworks\base\core\java\android\os文件夹下添加自己的aidl AIDL(Android Interface Definition Language), 即Android接口定义语言. package android.os; /** {@hide} */ interface ILedService { int ledCtrl(int which, int status); } 修

手中沙的博客 442

略谈android体系结构---------硬件抽象层

学习老罗的《android系统源代码情景分析》 出身自linux的android系统,在对硬件的支持,以及上层对硬件的访问方式,做出了较大的改变。如下是android的体系结构,它的实现和使用依次涉及android系统的硬件驱动模型、硬件抽象层、外部库和运行时库、应用程序框架层和应用程序层。 android的硬件抽象层(HAL)运行在用户空间,详细屏蔽硬件驱动模块的实现细节,向上提供硬

1316
上一篇: Java反编译工具(以反编译android的framework.jar举例)
下一篇: Linux内核的进程切换(上)
OS技术解密
博客等级 码龄16年 3761粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值