MT6572平台加入呼吸灯功能——编写Framework层接口

    在Android中,硬件服务一般运行在一个独立进程中为各种应用程序提供服务(也有特别的,如上一篇开头我们说的上层应用也可以单独写自己的JNI层代码,那样书写比较简单,但是只能为该应用提供服务),因此,APP与这些硬件服务之间的通信需要通过代理来实现。

一)添加AIDL接口文件

    进入frameworks/base/core/java/android/os/目录,新增IBreathLedsService.aidl文件:

package android.os;

/** @hide */
interface IBreathLedsService {
    void turnOnLeds();
    void turnOffLeds();
    void setLedsBrightness(int which, int level);
}
IBreathLedsService这里只提供了打开呼吸灯,关闭呼吸灯和调节呼吸灯亮度三个接口服务。IBreathLedsService.aidl文件不是必须放在该目录下,放在其他目录也可以,只要在相应Android.mk中加入编译路径就行。

    另外注意,上面的/** @hide */必须要加,否则new整个系统的时候会报错,会提示make update-api之类的。


二)在Android.mk中添加编译路径

    打开frameworks/base/Android.mk文件,在LOCAL_SRC_FILES变量中加入:

core/java/android/os/IBreathLedsService.aidl \
编译后,系统会自动生成对应的IBreathLedsService.Stub接口类。


三)新建java文件,编写Framework接口的具体实现

    进入frameworks/base/services/java/com/android/server/目录,新增BreathLedsService.java:

package com.android.server;

import android.os.IBreathLedsService;

public class BreathLedsService extends IBreathLedsService.Stub {

    //亮度等级(32级)
    private static final int[] BRIGHTNESS_LEVEL = {
            0,   1,   2,   4,   6,   10,  13,  18,
            22,  28,  33,  39,  46,  53,  61,  69,
            78,  86,  96,  106, 116, 126, 138, 149,
            161, 173, 186, 199, 212, 226, 240, 255,
    };

    BreathLedsService () {
        init_native();
    }

    public void turnOnLeds() {
        set_brightness_native(0x80);
    }

    public void turnOffLeds() {
        set_brightness_native(0x00);
    }

    public void setLedsBrightness(int which, int level) {
        if ((which > 12) || (which < 1))  return;
      
        level = level % 32;
        int data = ((0x80 | which) << 8) | BRIGHTNESS_LEVEL[level];
        set_brightness_native(data);
    }

    private native void init_native();
    private native void set_brightness_native(int data);
}


四)将新服务添加进系统服务中去

    打开上述同目录下的SystemServer.java文件,在ServerThread::run()方法中添加加载代码:

try {
     Slog.i(TAG, "BreathLeds Service");
     ServiceManager.addService("breath_leds", new BreathLedsService());
} catch (Throwable e) {
     Slog.e(TAG, "Failure starting BreathLeds Service", e);    
}

注意,要记住这个tag字符串"breath_leds",APP会通过该tag获取该服务。


五)编译

你可能感兴趣的:(MT6572平台加入呼吸灯功能——编写Framework层接口)