如何从Android应用程序调用自定义aosp服务

时间:2017-07-28 13:14:51

标签: android java-native-interface android-source android-5.1.1-lollipop

我正在研究一个在aosp上运行的项目。我向aosp添加了一个系统服务。我使用adb shell" service call"运行此服务。命令成功。在创建服务时,我应用了以下方法。

  1. 添加了援助文件
  2. 添加了一个源自aidl的.java文件
  3. 添加了jni文件。
  4. 创建服务后,我写了一个基本的Android应用程序。我想从这个Android应用程序调用此服务。我如何从Android应用程序调用此服务。

2 个答案:

答案 0 :(得分:4)

在.aidl接口定义旁边的frameworks/base/core/java/android/os/MySerManager.java中创建一个服务管理器。

frameworks/base/core/java/android/content/Context.java 搜索像VIBRATOR_SERVICE这样的简单服务,并为每次出现添加MYSER_SERIVCE。

特别添加:public static final String MYSER_SERVICE = "myser";

frameworks/base/core/java/android/app/SystemServiceRegistry.java中执行相同操作 确保添加:

import android.os.MySerManager;

registerService(Context.MYSER_SERVICE, MySerManager.class,
        new CachedServiceFetcher<MySerManager>() {
    @Override
    public MySerManager createService(ContextImpl ctx) {
        return new MySerManager();
    }});

通过构建sdk,可以在AOSP之外使用此服务管理器:https://android.googlesource.com/platform/sdk/+/master/docs/howto_build_SDK.txt

通过从Context获取系统服务,在AOSP中:

MySerManager mySerManager = (MySerManager)getSystemService(Context.MYSER_SERVICE);

答案 1 :(得分:1)

我设法解决了如何从Android应用程序调用系统服务。在编译aosp之后,framework_intermediates文件中的classes.jar被创建为out / target / common / obj / JAVA_LIBRARIES。我将classes.jar添加到我的Android应用程序中,并使用了以下代码。

IBinder binder = ServiceManager.getService("my_service");
IMyService myService = IMyService.Stub.asInterface(binder);
int result = myService.myFunction();