Android 6.0中添加硬件访问服务

1. 添加硬件访问服务接口

在目录frameworks/base/core/java/android/os中添加IFregService.aidl接口文件

IFregService.aidl文件如下

package android.os;

/**
 * {@hide}
 */
interface IFregService{
    void setVal(int val);
    int getVal();
}

注: 注释中需要添加{@hide},不然会出现编译问题


同时,修改frameworks/base目录下的Android.mk文件,在LOCAL_SRC_FILES变量添加IFregService.aidl值,如下:

LOCAL_SRC_FILES += \
       ......
       core/java/android/os/IFregService.aidl \
       ......


2. 实现硬件访问服务

在frameworks/base/services/core/java/com/android/server目录中添加FregService.java文件

FregService.java文件
package com.android.server;

import android.content.Context;
import android.os.IFregService;
import android.util.Slog;

/**
 * @hide
 */
public class FregService extends IFregService.Stub{
    private static final String TAG = "FregService";

    private int mPtr = 0;

    FregService(){
        mPtr = freg_init_native();

        if (0 == mPtr)
        {
            Slog.e(TAG, "Failed to initialize freg service.");
        }
    }

    public void setVal(int val){
        if (0 == mPtr){
            Slog.e(TAG, "Freg service is not initialized.");
            return;
        }
        setVal_native(mPtr, val);
    }

    public int getVal(){
        if (0 == mPtr){
            Slog.e(TAG, "Freg service is not initialized.");
            return 0;
        }

        return getVal_native(mPtr);
    }

    private static native int freg_init_native();
    private static native void setVal_native(int ptr, int val);
    private static native int getVal_native(int ptr);
};
注: 注释中需要添加{@hide},不然会出现编译问题

3. 实现硬件访问服务的JNI接口

在frameworks/base/services/core/jni目录下添加com_android_server_FregService.cpp文件
com_android_server_FregService.cpp源文件
/*************************************************************************
* 文件: com_android_server_FregService.cpp
* 作者: fantasy
* 邮箱: fantasy@gmail.com 
* 创建时间: 2016年07月23日 星期六 08时32分51秒
*************************************************************************/
#define LOG_TAG "FregServiceJNI"

#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"

#include <utils/misc.h>

#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/freg.h>

#include <stdio.h>

namespace android
{
    /**
     * 设置虚拟硬件设备freg的寄存器的值 
     */
    static void freg_setVal(JNIEnv *env, jobject clazz, jint ptr, jint value)
    {
        /**
         * 将参数ptr转换为freg_device_t的结构体变量 
         */
        freg_device_t *device = (freg_device_t*)ptr;
        if (!device)
        {
            ALOGE("Device freg is not open.");
            return;
        }

        int val = value;
        ALOGI("Set value %d to device freg.", val);

        device->set_val(device, val);
    }

    /**
     * 读取虚拟硬件设备freg的寄存器值
     */
    static jint freg_getVal(JNIEnv *env, jobject clazz, jint ptr)
    {
        /**
         * 将参数ptr转换为freg_device_t的结构体变量 
         */
        freg_device_t *device = (freg_device_t*)ptr;
        if (!device)
        {
            ALOGE("Device freg is not open.");
            return 0;
        }

        int val = 0;
        device->get_val(device, &val);

        ALOGI("Get value %d from device freg.", val);

        return val;
    }

    /**
     * 打开虚拟硬件设备freg
     */
    static inline int freg_device_open(const hw_module_t *module, struct freg_device_t **device)
    {
        return module->methods->open(module, FREG_HARDWARE_DEVICE_ID, (struct hw_device_t**)device);
    }

    /**
     * 初始化虚拟硬件设备freg
     */
    static jint freg_init(JNIEnv *env, jclass clazz)
    {
        hw_module_t *module;
        freg_device_t *device;

        ALOGI("Initializing HAL stub freg......");

        /**
         * 加载硬件抽象层模块freg
         */
        int err = hw_get_module(FREG_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module);
        
        if (err)
        {
            ALOGE("Couldn't load %s module (%s)", FREG_HARDWARE_MODULE_ID, strerror(-err));
        } else {
            ALOGI("Device freg found.");

            /**
             *  打开虚拟硬件设备freg
             */
            if (freg_device_open(module, &device) == 0)
            {
                ALOGI("Device freg is open.");

                /**
                 * 将freg_device_t接口转换为整型值返回
                 */
                return (jint)device;
            }

            ALOGE("Failed to open device freg.");
            return 0;
        }

        ALOGE("Failed to get HAL stub freg.");

        return 0;
    }
    
    /**
     * Java本地接口方法表
     */
    static const JNINativeMethod method_table[] = {
        {"freg_init_native", "()I", (void*)freg_init},
        {"setVal_native", "(II)V", (void*)freg_setVal},
        {"getVal_native", "(I)I", (void*)freg_getVal},
    };

    /**
     * 注册Java本地接口方法
     */
    int register_android_server_FregService(JNIEnv *env)
    {
        return jniRegisterNativeMethods(env, "com/android/server/FregService", method_table, NELEM(method_table));
    }
}

同时,在目录frameworks/base/services/core/jni的onload.cpp文件中添加如下代码
#include "JNIHelp.h"
#include "jni.h"
#include "utils/Log.h"
#include "utils/misc.h"

namespace android {
......
int register_android_server_FregService(JNIEnv* env);
};

using namespace android;

4. 启动硬件访问服务

在frameworks/base/services/java/com/android/server目录下的SystemServer.java中,添加如下内容
private void startOtherServices() {
    ......
    if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
        ......
        try{
                Slog.i(TAG, "Freg Service");
                ServiceManager.addService("freg", new FregService());
            } catch (Throwable e) {
                Slog.e(TAG, "Failure staring Freg Service", e);
            }
    ....
    }
}

5. 相关权限配置

对/system/sepolicy目录下的如下文件进行相应修改
device.te
domain.te
file_contexts
service.te
service_contexts
system_app.te
system_server.te
untrusted_app.te

修改如下:

在device.te文件中添加

type freg_device, dev_type;
在domain.te文件中添加
allow domain freg_device:chr_file rw_file_perms;
在file_contexts文件中添加
/dev/freg           u:object_r:freg_device:s0
在service.te中文件中添加
type freg_service, system_api_service, system_server_service, service_manager_type;
在service_contexts文件中添加
freg                                      u:object_r:freg_service:s0
在system_server.te文件中添加
allow system_server freg_device:chr_file rw_file_perms;
在untrusted_app.te文件中添加
allow untrusted_app freg_service:service_manager find;
在system_app.te文件中添加
allow system_app freg_service:service_manager find;

不然APP中调用该freg_service服务时会出现问题,见: http://blog.csdn.net/fantasy_wxe/article/details/52013922

参考

《Android系统源代码情景分析》第2.4节

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在VB6.0,我们可以通过以下步骤来添加工具栏代码: 1. 首先,在VB6.0打开你的项目。 2. 在项目窗口,展开你的表单(Form),找到工具栏控件(Toolbar Control)。 3. 将工具栏控件拖动到表单上,放置在你想要显示工具栏的位置。 4. 右键点击工具栏控件,选择“属性”(Properties)。 5. 在属性窗口,找到“Buttons”属性,并点击其右边的“...”按钮。 6. 在工具栏按钮编辑器,可以设置工具栏上的按钮。点击“添加”按钮,添加一个新的按钮。 7. 在按钮属性窗口,可以设置按钮的图标、文本、提示信息等。根据你的需求进行设置。 8. 添加需要的按钮后,点击“确定”按钮保存设置。 9. 在代码编辑器,找到表单的代码窗口。 10. 在表单的代码窗口,找到表单的加载事件(Load Event)。可以通过选择表单的名称和加载事件来找到对应的代码。 11. 在加载事件的代码添加以下代码: Toolbar1.Buttons(1).Enabled = True Toolbar1.Buttons(1).Visible = True '根据按钮在工具栏的位置,将(1)改为对应的按钮索引值。 12. 修改代码的按钮索引值,根据你添加的按钮在工具栏的位置进行调整。 13. 保存并编译项目,然后运行程序。 通过以上步骤,你就可以在VB6.0成功添加工具栏代码,并在加载事件控制工具栏按钮的可见性和可用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值