Android 12 S 自定义native服务访问java服务

系列文章

Android 12 S ServiceManager原理

Android 12 S Native Service的创建流程

Android 12 S Binder原理之BpBinder,BnBinder以及IInterface介绍

Android 12 S HIDL Service创建流程

Android 12 S 自定义Hal服务selinux权限添加

Android 12 S 自定义Native服务selinux权限添加

Android 12 S java服务调用native服务

Android 12 S 自定义native服务访问java服务


由于C++无法引入java头文件,所以C++服务访问java服务有些麻烦。

native服务作为Client端,其代码位于如下目录:

android/frameworks/native/services/customizemanagerservice

WMS作为Server端,其代码路径如下:

android/frameworks/base/services/core/java/com/android/server/wm

1. 在frameworks/base/core/java/android/view/IWindowManager.aidl中添加自定义接口

+    /**
+     * set customize.
+    */
+    int setcustomize();

2. 在frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java中添加相应实现

+
+    @Override
+    public int setcustomize() {
+        Slog.d(TAG, "setcustomize");
+        return 1;
+    }

3. 在rameworks/native/services/customizemanagerservice下创建如下文件

IWindowManager.cpp*

WindowManager.cpp*

include_windowmanager/IWindowManager.h

include_windowmanager/WindowManager.h

include_windowmanager/IWindowManager.h
#ifndef ANDROID_IWINDOW_MANAGER_H
#define ANDROID_IWINDOW_MANAGER_H

#ifndef __ANDROID_VNDK__

#include <binder/IInterface.h>

namespace android {

// ------------------------------------------------------------------------------------

class IWindowManager : public IInterface
{
//这个public一定一定不要忘记加上
public:
    DECLARE_META_INTERFACE(WindowManager)

    virtual int setcustomize() = 0;

    enum {
        //这个说明这个函数是WindowManager的第一个方法,如果是在后面的方法,
        //可以采用IBinder::FIRST_CALL_TRANSACTION + number(看你函数名排在第几位)
        SET_CUSTOMIZE = IBinder::FIRST_CALL_TRANSACTION,
    };
};

// ------------------------------------------------------------------------------------

} // namespace android

#else // __ANDROID_VNDK__
#error "This header is not visible to vendors"
#endif // __ANDROID_VNDK__

#endif // ANDROID_IWINDOW_MANAGER_H
IBinder::FIRST_CALL_TRANSACTION + number,如果不知道number是几的话,就会aidl文件里数一数
IWindowManager.cpp*

#include <WindowManager.h>
#include <IWindowManager.h>
#include <binder/Parcel.h>
#include <utils/Errors.h>

namespace android {

// ------------------------------------------------------------------------------------

class BpWindowManager : public BpInterface<IWindowManager>
{
public:
    explicit BpWindowManager(const sp<IBinder>& impl)
        : BpInterface<IWindowManager>(impl)
    {
    }

    virtual int setcustomize()
    {
        Parcel data, reply;
        data.writeInterfaceToken(IWindowManager::getInterfaceDescriptor());
        status_t ret = remote()->transact(SET_CUSTOMIZE, data, & reply);
        if (ret == NO_ERROR) {
            return reply.readInt32();
        }
        return -1;
    }
};

// ------------------------------------------------------------------------------------

IMPLEMENT_META_INTERFACE(WindowManager, "android.view.IWindowManager")

} // namespace android
include_windowmanager/WindowManager.h
#pragma once

#ifndef __ANDROID_VNDK__

#include <IWindowManager.h>

#include <utils/threads.h>

// ---------------------------------------------------------------------------
namespace android {

class WindowManager
{
public:
    int setcustomize();
private:
    Mutex mLock;
    sp<IWindowManager> mService;
    sp<IWindowManager> getService();
};


} // namespace android
// ---------------------------------------------------------------------------
#else // __ANDROID_VNDK__
#error "This header is not visible to vendors"
#endif // __ANDROID_VNDK__

WindowManager.cpp*
#include <mutex>
#include <unistd.h>

#include <WindowManager.h>
#include <binder/Binder.h>
#include <binder/IServiceManager.h>

#include <utils/SystemClock.h>

namespace android {

sp<IWindowManager> WindowManager::getService()
{
    std::lock_guard<Mutex> scoped_lock(mLock);
    int64_t startTime = 0;
    sp<IWindowManager> service = mService;
    while (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) {
        sp<IBinder> binder = defaultServiceManager()->checkService(String16("window"));
        if (binder == nullptr) {
            // Wait for the window service to come back...
            if (startTime == 0) {
                startTime = uptimeMillis();
                ALOGI("Waiting for window service");
            } else if ((uptimeMillis() - startTime) > 1000000) {
                ALOGW("Waiting too long for window service, giving up");
                service = nullptr;
                break;
            }
            usleep(25000);
        } else {
            service = interface_cast<IWindowManager>(binder);
            mService = service;
        }
    }
    return service;
}

int WindowManager::setcustomize()
{
    sp<IWindowManager> service = getService();
    return service != nullptr ? service->setcustomize() : -1;
}
} // namespace android

4. 在native service中调用java服务

frameworks/native/libs/binder/include/binder/IInterface.h

在kManualInterfaces中添加android.view.IWindowManager

5. 在native service中调用java服务

CustomizeManagerService.cpp
#include "WindowManager.h"
int CustomizeManagerService::setcustomize(){
    WindowManager wm;
    return wm.setcustomize();
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持常见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
要新增自定义的framework框架层,可以按照以下步骤进行: 1. 创建自定义framework层的代码 在AOSP源码的framework目录下创建自定义模块的代码目录,例如创建一个名为myframework的模块,可以在framework目录下执行以下命令: ``` mkdir myframework ``` 在myframework目录下创建自定义Java代码和native代码。 2. 添加Android.mk文件 在myframework目录下创建Android.mk文件,指定要编译的Javanative代码。例如,Android.mk文件可以包含以下内容: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := myframework LOCAL_SRC_FILES := \ MyJavaClass.java \ MyCFile.c LOCAL_STATIC_LIBRARIES := libcutils liblog include $(BUILD_STATIC_JAVA_LIBRARY) include $(BUILD_SHARED_LIBRARY) ``` 其中,LOCAL_MODULE指定了模块的名称,LOCAL_SRC_FILES指定了要编译的Javanative代码文件,LOCAL_STATIC_LIBRARIES指定了需要链接的静态库。 3. 修改build/core/main.mk 在AOSP源码的build/core/main.mk文件中添加以下内容: ``` # Add myframework to the build ifeq ($(TARGET_BUILD_APPS),) $(error TARGET_BUILD_APPS must be set) endif ifeq ($(filter myframework,$(TARGET_BUILD_APPS)),myframework) $(call add-subdir-if-exists,frameworks/myframework) endif ``` 这样,编译系统就会将myframework模块添加到编译列表中。 4. 编译自定义framework 执行以下命令编译自定义framework: ``` make myframework ``` 编译完成后,会在out/target/common/obj/JAVA_LIBRARIES和out/target/product/<product>/system/framework目录下生成myframework.jar和service.jar文件,以及myframework.so和service.so库文件。 以上就是新增自定义framework框架层的步骤。需要注意的是,在修改AOSP源码时,应该遵循AOSP的开发规范,并在保证代码正确性的前提下进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值