在Android中,應用訪問service提供的接口都是通過AIDL(Android Interface Definition Language),可以理解為一種規范,甚至可以粗陋的理解為C語言裡面的.h文件,如果你曾經是一名C語言開發者,而且只是使用的話。下面的例子是想增加獲取cpu 頻率的service及其對應的AIDL,其中並沒有實際的讀取頻率和設置governor的操作,僅僅用於演示如何在framework中增加一個service和AIDL。
1) 增加AIDL接口文件
文件:frameworks/base/core/java/android/os/ICpuFreqService.aidl
package android.os;
import android.os.WorkSource;
/** @hide */
interface ICpuFreqService
{
int getCurGovernor();
int getCurFrequency();
}
2) 在Android.mk中增加ICpuFreqService.aidl接口文件的編譯選項
文件:frameworks/base/Android.mk
LOCAL_SRC_FILES += \
……….
core/java/android/os/ICpuFreqService.aidl\
……..
3) 實現CpuFreqService.java
文件:frameworks/base/services/java/com/android/server$ ls CpuFreqService.java
package com.android.server;
import android.os.ICpuFreqService;
class CpuFreqService extendsICpuFreqService.Stub{
static int EnterTimes=0;
public int getCurGovernor()
{
return0x11233;
}
public int getCurFrequency()
{
EnterTimes++;
return (EnterTimes*50);
}
}
4) 在SystemService中注冊service
文件:frameworks/base/services/java/com/android/server/SystemServer.java
CpuFreqService cpufreq=null;
………………
Slog.i(TAG, "CpuFreq Manager");
cpufreq = new CpuFreqService();
ServiceManager.addService("cpufreq",cpufreq);
5) 在APP中調用AIDL接口
…………….
import android.os.ServiceManager;
import android.os.ICpuFreqService;
……………...
try {
ICpuFreqService cpuFreq=
ICpuFreqService.Stub.asInterface( ServiceManager.getService("cpufreq"));
setSummaryText("baseband_version",Integer.toString(cpuFreq.getCurGovernor()));
Log.e("Status","Governor=" + Integer.toString(cpuFreq.getCurGovernor()));
Log.e("Status","Freq ="+ Integer.toString(cpuFreq.getCurFrequency()));
} catch (Exception e)
{
}