阅读本文大约需要花费19分钟。
原创不易,如果您觉得有点用,希望可以随手转发或者点击右下角的 “在看”、“”分享“”,拜谢!
《Android取经之路》系列文章:
《系统启动篇》
Android取经之路——启动篇
Android系统架构
Android是怎么启动的
Android系统启动之init进程(一)
Android系统启动之init进程(二)
Android 10.0系统启动之init进程(三)
Android 10.0系统启动之init进程(四)
Android 10.0系统启动之Zygote进程(一)
Android 10.0系统启动之Zygote进程(二)
Android 10.0系统启动之Zygote进程(三)
Android 10.0系统启动之Zygote进程(四)
Android 10.0系统启动之SystemServer进程(一)
Android 10.0系统启动之SystemServer进程(二)
Android 10.0系统服务之AMS启动流程
Android 10.0系统启动之Launcher(桌面)启动流程
Android 10.0应用进程创建过程以及Zygote的fork流程
Android 10.0 PackageManagerService(一)工作原理及启动流程
Android 10.0 PackageManagerService(二)权限扫描
Android 10.0 PackageManagerService(三)APK扫描
Android 10.0 PackageManagerService(四)APK安装流程
《日志系统》
Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性
Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化
Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析
Android10.0 日志系统分析(四)-selinux、kernel日志在logd中的实现
《Binder系列》
Android10.0 Binder通信原理(一)Binder、HwBinder、VndBinder概要
Android10.0 Binder通信原理(二)-Binder入门篇
Android10.0 Binder通信原理(三)-ServiceManager篇
Android10.0 Binder通信原理(四)-Native-C\C++实例分析
Android10.0 Binder通信原理(五)-Binder驱动分析
Android10.0 Binder通信原理(六)-Binder数据如何完成定向打击
Android10.0 Binder通信原理(七)-Framework binder示例
Android10.0 Binder通信原理(八)-Framework层分析
Android10.0 Binder通信原理(九)-AIDL Binder示例
Android10.0 Binder通信原理(十一)-Binder总结
《HwBinder系列》
HwBinder入门篇-Android10.0 HwBinder通信原理(一)
HIDL详解-Android10.0 HwBinder通信原理(二)
HIDL示例-C++服务创建Client验证-Android10.0 HwBinder通信原理(三)
HIDL示例-JAVA服务创建-Client验证-Android10.0 HwBinder通信原理(四)
HwServiceManager篇-Android10.0 HwBinder通信原理(五)
Native层HIDL服务的注册原理-Android10.0 HwBinder通信原理(六)
Native层HIDL服务的获取原理-Android10.0 HwBinder通信原理(七)
JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)
上一节,我们学习了JAVA层 HIDL服务的注册获取原理,这一节我们来看看JAVA层HIDL服务的获取原理。
5. 获取服务
JAVA层HIDL服务获取如下图所示:
5.1 获取服务调用栈
5.2 onClick()
[/vendor/ingres/hidl_demo/app/src/main/java/com/android/hidldemo/MainActivity.java] private IDemo mHidlService; public void onClick(View v) {
switch (v.getId()) {
case R.id.getHelloBtn: Log.d(TAG, "start to click"); try {
//1.获取IDemo的hidl服务 mHidlService = IDemo.getService(); 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; } }
5.3 getService()
[/frameworks/base/core/java/android/os/HwBinder.java]public static native final IHwBinder getService( String iface, String serviceName, boolean retry) throws RemoteException, NoSuchElementException;
这是一个JNI接口,参考上一节《JAVA层HIDL服务的注册原理》中的JNI的转换,在JNI层,进入JHwBinder_native_getService()
5.4 JHwBinder_native_getService
[/frameworks/base/core/jni/android_os_HwBinder.cpp]static jobject JHwBinder_native_getService( JNIEnv *env, jclass /* clazzObj */, jstring ifaceNameObj, jstring serviceNameObj, jboolean retry) {
using ::android::hidl::base::V1_0::IBase; using ::android::hardware::details::getRawServiceInternal; std::string ifaceName; {
ScopedUtfChars str(env, ifaceNameObj); if (str.c_str() == nullptr) {
return nullptr; // NPE will be pending. } ifaceName = str.c_str(); } std::string serviceName; {
ScopedUtfChars s