android平台上经常谈到三种service

1.四大组件中提到的service,此service属于应用层的service

2.framework层的java service, 例如WindowManagerService, WifiService, PowerManagerService等

3.framework层的native service,例如SurfaceFlinger,MediaPlayerService等


本文主要讲如何写一个framework层的native service, 原理不深入讲。



上图是一个写过的根据系统所处场景(video, camera, music等)调节系统频率电压的服务。

写一个native service主要分主要分4步:

1.定义接口:

class ICpuFreqService: public IInterface
{
public:
DECLARE_META_INTERFACE(CpuFreqService);
static inline sp<ICpuFreqService> connect();
virtual bool addScence(int) = 0;
virtual bool leaveScence(int) = 0;

};

2.实现传输层。

client调用BpCpuFreqService,BpCpuFreqService把参数打包成Parcel传到BnCpuFreqService,BnCpuFreqService

解析Parcel得到参数调用CpuFreqService的具体实现,执行完BnCpuFreqService将CpuFreqService的返回值打包成

Parcel再传回BpCpuFreqService,这就是一次跨进程调用

3.实现接口

CpuFreqService得到系统场景信息后会根据配置文件调整驱动相关参数。

4.把服务注册进ServiceManager

首先写个main.c:

int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();

CpuFreqService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}

CpuFreqService::instantiate();的实现如下,就是把服务注册进ServiceManager:

static void instantiate() {
defaultServiceManager()->addService(
String16("cpufreqservice"), new CpuFreqService());
}


编译成myservice可执行文件后添加进init.rc,作为开机即启动的服务:

service actionsserver /system/bin/myservice
user system


client如何调用服务:

sp<ICpuFreqService> cpufreqService = ICpuFreqService::connect();

cpufreqService.addScence(ICpuFreqService::VIDEO);


ICpuFreqService::connect()实现如下:

static inline sp<ICpuFreqService> connect()
{
sp<ICpuFreqService> cpufreqService;
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder;

do {
binder = sm->getService(String16("cpufreqservice"));
if (binder != 0) {
break;
}
LOGW("cpufreqservice not published, waiting...");
usleep(500000); // 0.5 s
} while(true);


cpufreqService = interface_cast<ICpuFreqService>(binder);
LOGE_IF(cpufreqService == 0, "no cpufreqService!?");
return cpufreqService;
}

获得的ICpuFreqService接口其实是一个BpCpuFreqService对象,

调用过程是BpCpuFreqService------>BnCpuFreqService->CpuFreqService



更多相关文章

  1. A20平台增加camera
  2. android 属性系统使用的小问题
  3. Android在标准linux基础上对休眠唤醒的实现(一)
  4. android 监听edittext addTextChangedListene
  5. android应用程序跳转到系统的各个设置页面和通过Intent action
  6. Android(安卓)AIDL基本步骤
  7. [Android]判断是否是华为EMUI系统
  8. android系统移植学习笔记一
  9. Android(安卓)WebView 通过post形式访问

随机推荐

  1. Android客户端和Java服务器端集成支付宝
  2. Android小项目之--前台界面与用户交互的
  3. Android(安卓)仪表进度条 自定义View
  4. Android必知必会-Android(安卓)Studio修
  5. Android阻塞式确认Dialog-Loop实现方式
  6. Android(安卓)开发者 for Flutter (2)如何
  7. Android应用程序权限机制的源代码分析(1)
  8. Nokia同意放人 移交125名Qt核心成员给Dig
  9. android单向无限循环的轮播图效果。
  10. Google 或强制 OEM 预装 20 款应用,给你一