日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

發布時間:2025/3/15 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有一天在群里聊天的時候,有人提出一個問題,怎樣才能做到HAL層訪問JAVA層的接口?剛好我不會,所以做了一點研究。

之前的文章末尾部分說過了service call 可以用來調試系統的binder服務。 傳送門:?Android native進程間通信實例-binder篇之——簡單的單工通信

這次可以用到這個命令了!

1. 隨機選取一個java層的服務。

adb shell 中輸入命令 service list,選取一個服務來做研究,這次看中的是?textservices, 注意第一個服務?bysysui 后面的 "[ ]" 里面沒有內容,不能選取這樣的服務來做這次的研究,具體為什么不能看到后面應該能明白。

2. 搜尋這個服務相關的源碼。

frameworks/base/services/core/java/com/android/server/TextServicesManagerService.java

frameworks/base/core/java/com/android/internal/textservice/ITextServicesManager.aidl

out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/textservice/ITextServicesManager.java

3. 選擇一個接口用于被 HAL 層的代碼訪問

可以知道TextServicesManagerService.java 中 有一行?public class TextServicesManagerService extends ITextServicesManager.Stub,

所以我從?ITextServicesManager.aidl 來選擇要訪問的接口, 這次選的就是?boolean isSpellCheckerEnabled(); 這個函數應該就是返回一個bool變量而已,越簡單越好。

4. 搜尋 binder 中 transact 需要輸入的 code

因為吧啦吧啦的原因(可以自行去別的博文搜索原理,本系列博文側重實際操作),所以在out目錄下可以獲取到每個服務中各個接口訪問鎖需要傳入的code。

在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/textservice/ITextServicesManager.java中可以發現熟悉的onTransact接口,

同時發現調用 sSpellCheckerEnabled 的code為TRANSACTION_isSpellCheckerEnabled,

它的定義是:static final int TRANSACTION_isSpellCheckerEnabled = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7);

因為android.os.IBinder.FIRST_CALL_TRANSACTION的值是1, 所以可知code為 8

5. 使用service call 來撩一下 isSpellCheckerEnabled

可以看到Parcel有兩個值,第一個是00000000,第二個是00000001.

再看看ITextServicesManager.java中TRANSACTION_isSpellCheckerEnabled這個code的處理,果然write了兩次,而第二次writeInt的值就是我們需要獲取的bool值了!

ITextServicesManager.java

case TRANSACTION_isSpellCheckerEnabled:

{

data.enforceInterface(DESCRIPTOR);

boolean _result = this.isSpellCheckerEnabled();

reply.writeNoException();

reply.writeInt(((_result)?(1):(0)));

return true;

}

1. 首先data.enforceInterface 傳進去了一個組字符串?private static final java.lang.String DESCRIPTOR = "com.android.internal.textservice.ITextServicesManager";

感覺這組字符串是和校驗有關了,查看了Parcel.cpp 源碼, 發現enforceInterface果然是對比字符串用的,在這個接口的上面有個接口名字叫做?writeInterfaceToken,

所以到時候要用 writeInterfaceToken?來寫這組字符串用于比對校驗。

2. writeNoException 和 writeInt 最終調用的是 Parcel.cpp 里面writeInt32,所以reply部分要 readInt32 兩次。

6. HAL層代碼怎么寫

就直接在之前寫的mybinderclient.cpp 上面貼源碼吧transct 前寫校驗字符串,然后傳入code 值為8,最后readInt32 兩次,第二次就是要讀取的JAVA 層服務isSpellCheckerEnabled? 的值啦!

#include

#include

#include

#include

#include

#define LOG_TAG "binderclient"

using namespace android;

int main(int argc, char** argv)

{

static int TRANSACTION_isSpellCheckerEnabled = (/*android.os.IBinder.FIRST_CALL_TRANSACTION*/1 + 7);

sp ITextServicesBinder = defaultServiceManager()->getService(String16("textservices"));

Parcel ITextServicesData, ITextServicesReply;

ITextServicesData.writeInterfaceToken(String16("com.android.internal.textservice.ITextServicesManager"));

ITextServicesBinder->transact(TRANSACTION_isSpellCheckerEnabled, ITextServicesData, &ITextServicesReply);

int ret = ITextServicesReply.readInt32();

int ret2 = ITextServicesReply.readInt32();

printf("ret = %d, isSpellCheckerEnabled = %d\n", ret, ret2);

return 0;

}

執行結果:

這次在HAL層通過binder 訪問 JAVA 層服務的簡單例子就講解到這里,希望大家看完以后能夠觸類旁通,在這個例子上面得到啟發。

希望大家多多吐槽,大家一起共同進步!!

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。