摘要:本节主要来讲解Android10.0 JAVA层的HIDL服务创建和JAVA层的Client验证

阅读本文大约需要花费15分钟。

文章首发微信公众号:IngresGe

专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢!

欢迎关注我的公众号!

[Android取经之路] 的源码都基于Android-Q(10.0) 进行分析

[Android取经之路] 系列文章:

《系统启动篇》

  1. Android系统架构
  2. Android是怎么启动的
  3. Android 10.0系统启动之init进程
  4. Android10.0系统启动之Zygote进程
  5. Android 10.0 系统启动之SystemServer进程
  6. Android 10.0 系统服务之ActivityMnagerService
  7. Android10.0系统启动之Launcher(桌面)启动流程
  8. Android10.0应用进程创建过程以及Zygote的fork流程
  9. Android 10.0 PackageManagerService(一)工作原理及启动流程
  10. Android 10.0 PackageManagerService(二)权限扫描
  11. Android 10.0 PackageManagerService(三)APK扫描
  12. Android 10.0 PackageManagerService(四)APK安装流程

《日志系统篇》

  1. Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性
  2. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化
  3. Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析
  4. Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现​

《Binder通信原理》

  1. Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
  2. Android10.0 Binder通信原理(二)-Binder入门篇
  3. Android10.0 Binder通信原理(三)-ServiceManager篇
  4. Android10.0 Binder通信原理(四)-Native-C\C++实例分析
  5. Android10.0 Binder通信原理(五)-Binder驱动分析
  6. Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
  7. Android10.0 Binder通信原理(七)-Framework binder示例
  8. Android10.0 Binder通信原理(八)-Framework层分析
  9. Android10.0 Binder通信原理(九)-AIDL Binder示例
  10. Android10.0 Binder通信原理(十)-AIDL原理分析-Proxy-Stub设计模式
  11. Android10.0 Binder通信原理(十一)-Binder总结

  《HwBinder通信原理》

  1. HwBinder入门篇-Android10.0 HwBinder通信原理(一)
  2. HIDL详解-Android10.0 HwBinder通信原理(二)
  3. HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
  4. HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
  5. HwServiceManager篇-Android10.0 HwBinder通信原理(五)
  6. Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)
  7. Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)
  8. JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
  9. JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)
  10. HwBinder驱动篇-Android10.0 HwBinder通信原理(十)
  11. HwBinder原理总结-Android10.0 HwBinder通信原理(十一)

《编译原理》

  1. 编译系统入门篇-Android10.0编译系统(一)
  2. 编译环境初始化-Android10.0编译系统(二)
  3. make编译过程-Android10.0编译系统(三)
  4. Image打包流程-Android10.0编译系统(四)
  5. Kati详解-Android10.0编译系统(五)

1. 概述

上一节,我们写了Native层的HIDL服务和客户端进程验证,这一节我们准备写一个JAVA层的HIDL服务和客户端进行验证。

本节会直接写一个APP用来与HIDL服务进行通信。

1.1 JAVA层的HwBinder架构

1.2 HwBinder通信原理

2. 示例说明

Server进程目录结构:

Server:

hal_demo

java

├─src

│  └─com

│       └─android

│               └─demo

│                   └─Server.java

├─Android.bp

└─hidldemo_service_test

Client进程目录结构:

Client:

hidl_demo\app\src\main

├─java

│  └─com

│       └─android

│               └─hidldemo

│                   └─MainActivity.java

├─res

├─Android.bp

└─AndroidManifest.xml

3.Java的HIDL服务

3.1  创建一个HIDL java服务的目录,并实现服务代码

命令:

vim vendor/ingres/hal_demo/java/src/com/android/demo/Server.java

code:

package com.android.demo;
import android.os.HwBinder;
import android.os.IBinder;
import android.os.IHwBinder;
import android.os.RemoteException;
import android.util.Log;
import vendor.ingres.demo.V1_0.IDemo;class Demo extends IDemo.Stub {public String getHelloString(String name) throws android.os.RemoteException {String result = "Hello, " + name;return result;}
}public class Server {static final String TAG = "HIDLDemoService";public static void main(String args[]){Log.d(TAG, "start");//1.启动HwBinder线程池HwBinder.configureRpcThreadpool(1, true);Demo demo = new Demo();try {//2.注册HIDL服务demo.registerAsService("default");Log.d(TAG, "success to register demo service");} catch (RemoteException ex) {Log.e(TAG, "exception, fail to register demo service");}//3.把当前的进程加入HwBinder的线程池进行循环HwBinder.joinRpcThreadpool();}
}

2.2 配置Android.bp

命令:

vim vendor/ingres/hal_demo/java/Android.bp

Code:

java_test {name: "hidldemo_service",srcs: ["**/*.java"],static_libs: ["vendor.ingres.demo-V1.0-java"],
}

2.3 编译

命令:

mmm vendor/ingres/hal_demo/java/

生成文件:

\out\target\product\kona\testcases\hidldemo_service\arm64\hidldemo_service.jar

2.4 服务启动 可执行程序

命令:

vim  vendor/ingres/hal_demo/java/hidldemo_service_test

code:

base=/data
export CLASSPATH=$base/framework/hidldemo_service.jar
exec app_process $base/framework com.android.demo.Server "$@"

3. 通过AS写一个简单的Activity Demo

activity_main.xml

code:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/getHelloBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Button"tools:layout_editor_absoluteX="97dp"tools:layout_editor_absoluteY="179dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

3.1.把AS的工程移植到Android工程中

1)mkdir -p vendor/ingres/hidl_demo

2)拷贝AS的工程到hidl_demo的目录中

3.2.工程实现:

   1)创建Android.bp

vim vendor/ingres/hidl_demo/app/src/main/Android.bp

code:


android_app {name: "hidldemo",srcs: ["**/*.java"],platform_apis: true,certificate: "platform",resource_dirs: ["res"],manifest: "AndroidManifest.xml",static_libs: ["androidx-constraintlayout_constraintlayout","androidx-constraintlayout_constraintlayout-solver","androidx.appcompat_appcompat","vendor.ingres.demo-V1.0-java"],optimize: {enabled: false,},dex_preopt: {enabled: false,},
}

2)实现hal服务的调用

修改以下文件:

vendor/ingres/hidl_demo/app/src/main/java/com/android/hidldemo/MainActivity.java

code:


package com.android.hidldemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import vendor.ingres.demo.V1_0.IDemo;public class MainActivity extends AppCompatActivity implements View.OnClickListener{static final String TAG = "HIDLDemoClient";private static final String SERVICE_NAME = "demo";private IDemo mHidlService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {Button getHelloBtn = (Button) findViewById(R.id.getHelloBtn);getHelloBtn.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.getHelloBtn:Log.d(TAG, "start to click");try {//1.获取demo的HIDL服务,不会等待HIDL服务是否起来mHidlService = IDemo.getService(true);   if (mHidlService == null) {Log.e(TAG, "fail to get demo service");} else {Log.d(TAG, "success to get demo service");//2.调用hidl的接口String result =  mHidlService.getHelloString("IngresGe");  Log.d(TAG, "HIDL return:" + result);}} catch (RemoteException ex) {Log.e(TAG, "exception, fail to get demo service");}break;}}
}

遇到的编译问题:

vendor/ingres/hidl_demo/app/src/main/java/com/android/hidldemo/MainActivity.java:36: error: cannot access IHwInterfacemHidlService = IDemo.getService(true);^class file for android.os.IHwInterface not found

原因:

 Android.bp里添加 sdk_version: "current", 后不能使用 @hide API

解决办法:

 从Android.bp中去除 sdk_version: "current"

4. 测试

结合上一节Native层的HIDL服务,我这里准备进行两种验证:

1) JAVA层HIDL服务 + JAVA层Client

2) Native层HIDL 服务 + JAVA层Client

4.1  JAVA 层HIDL服务+ JAVA层client

1).安装编译好的hidldemo.apk到手机中

2).把 hidldemo_service.jar push到 /data/framework中

adb push xxx/hidldemo_service.jar  /data/framework

3).把 hidldemo_service_test push 到 /data/nativetest64 中

adb push xxx/hidldemo_service_test  /data/nativetest64

4).启动服务

./data/nativetest64/hidldemo_service_test

5).打开hidldemo app,点击button

log展示:

服务启动:

07-13 10:07:25.963 11209 11209 D HIDLDemoService: start
07-13 10:07:25.967 11209 11209 D HIDLDemoService: success to register demo service

Client接口调用成功:

07-13 10:52:16.371 14214 14214 D HIDLDemoClient: start to click
07-13 10:52:16.375 14214 14214 D HIDLDemoClient: success to get demo service
07-13 10:52:16.375 14214 14214 D HIDLDemoClient: HIDL return:Hello, IngresGe

4.2  C++ 层HIDL服务+ JAVA层client:

接上一节的C++ HIDL服务

1.安装编译好的hidldemo.apk到手机中

2.启动Native层的hal服务:

./vendor/bin/hw/./vendor.ingres.demo@1.0-service

3.打开hidldemo app,点击button

log展示:

Client接口调用成功:

07-13 11:12:26.902  9060  9060 D HIDLDemoClient: start to click
07-13 11:12:26.902  9060  9060 D HIDLDemoClient: success to get demo service
07-13 11:12:26.902  9060  9060 D HIDLDemoClient: HIDL return:Hello, IngresGe

注:

我在使用时是关闭了selinux进行的验证,真正使用时,还需要配置Selinux

我的微信公众号:IngresGe

HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)相关推荐

  1. HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)

    摘要:本节主要来讲解Android10.0 Native层的HIDL服务创建和Native层的Client验证 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Androi ...

  2. JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)

    摘要:本节主要来讲解Android10.0 JAVA层HIDL服务的获取原理 阅读本文大约需要花费19分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的 ...

  3. JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)

    摘要:本节主要来讲解Android10.0 JAVA层HIDL服务的注册原理 阅读本文大约需要花费22分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的 ...

  4. Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)

    摘要:本节主要来讲解Android10.0 Native层HIDL服务的获取原理 阅读本文大约需要花费23分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Androi ...

  5. Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)

    摘要:本节主要来讲解Android10.0 Native层HIDL服务的注册原理 阅读本文大约需要花费23分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Androi ...

  6. nacis服务注册原理_HwServiceManager篇Android10.0 HwBinder通信原理(五)

    阅读本文大约需要花费34分钟. 原创不易,如果您觉得有点用,希望可以随手转发或者点击右下角的 "在看".""分享"",拜谢! <And ...

  7. HwBinder原理总结-Android10.0 HwBinder通信原理(十一)

    摘要:本节主要来进行Android10.0 HwBinder的原理总结 阅读本文大约需要花费14分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设 ...

  8. HwBinder驱动篇-Android10.0 HwBinder通信原理(十)

    摘要:本节主要来讲解Android10.0 HwBinder驱动的流程 阅读本文大约需要花费24分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设 ...

  9. HwServiceManager篇-Android10.0 HwBinder通信原理(五)

    摘要:本节主要来讲解Android10.0 HwServiceManager的通信原理 阅读本文大约需要花费34分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,And ...

最新文章

  1. Android Layer List 使用实现实例
  2. linux链接curl库,Linux利用curl库快速开发http应用
  3. 优秀技术人的管理陷阱
  4. .net api reference中文_在macOS上使用.NET SDK编译 .NET 通用中间语言
  5. 《恋上数据结构第1季》二叉堆实现优先级队列
  6. ASP.NET页面生命周期概述
  7. Delphi中常用字符串处理函数
  8. SVN和Maven及Jenkins(转)
  9. 个人地理数据库与文件地理数据库的区别
  10. SQLite学习笔记(二)--VC调用环境搭建
  11. 不明白如何将批量图片格式转换?2招教你们快速搞定
  12. 创业成功第一步:写好商业计划书 第二章习题答案
  13. Cortex-A 架构
  14. php 三色排序,三色旗排序问题 | 学步园
  15. 电子类研究生的STM32小白入门 一个定时器 四个channel复用映射 实现超声波四路测距
  16. ubuntu 20.04 ROS 环境下 使用 velodyne
  17. igrp和eigrp详解
  18. 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(十六)
  19. 高精度地图-使用ArcMap标注高精度地图
  20. 如何开发一款前端工具

热门文章

  1. java 自定义注解_两步实现Java自定义注解
  2. 浏览器ERR_PROXY_CONNECTION_FAILED解决方法
  3. 测试掌握的Linux解压,轻松掌握Linux压缩/解压文件的方法
  4. 半监督学习下的高维图构建
  5. tensorflow 1.0 学习:十图详解tensorflow数据读取机制
  6. 自动化部署必备技能—定制化RPM包[转载]
  7. puppet 类、模块
  8. css中overflow:hidden的属性 可能会导致js下拉菜单无法显示
  9. 架构——大师言语汇总
  10. EntityFramework用法探索(二)CodeFirst