一、 准备

  1. 编译好的Android4.4源码
    用于添加系统服务,用于获取CPU的Core数量。
  2. AndroidStudio工具
    用于编写apk调用系统接口

二、 添加系统服务

  1. 添加aidl接口
    frameworks/base/core/java/android/app/ICpuInfoManager.aidl

    package android.app;interface ICpuInfoManager
    {int getCpuCore();
    }
    
  2. 添加系统服务,实现aidl文件的接口
    frameworks/base/services/java/com/android/server/CpuInfoManagerService.java

    package com.android.server;
    import android.app.ICpuInfoManager;
    import android.content.Context;
    import android.util.Slog;public class CpuInfoManagerService extends ICpuInfoManager.Stub {private Context mContext;public CpuInfoManagerService(Context context){mContext = context;Slog.d("CPUINFO","Construct");}   @Overridepublic int getCpuCore(){return 4;}
    }
    
  3. 添加系统服务的Manager
    frameworks/base/core/java/android/app/CpuInfoManager.java

    package android.app;                                                                                                              import android.content.Context;
    import android.os.RemoteException;
    import android.util.Slog;public class CpuInfoManager {Context mContext;ICpuInfoManager mService;public CpuInfoManager(Context context,ICpuInfoManager service){mContext = context;mService = service;}   public int getCpuCore(){if(mService != null){try{return mService.getCpuCore();}catch(RemoteException e){Slog.e("CPUINFO","RemoteException " + e);}   }   return -1;}
    }
    
  4. 将aidl文件添加至Android.mk参与编译
    frameworks/base/Android.mk

    LOCAL_SRC_FILES += \core/java/android/app/ICpuInfoManager.aidl \
    
  5. 添加Context中的Service常量
    frameworks/base/core/java/android/content/Context.java

        /***  用于Service的注册、SystemServer中的开机启动以及上层应用的使用*/public static final String CPU_INFO_SERVICE = "cpuinfo";
    
  6. 将实现的服务注册到系统中去
    frameworks/base/core/java/android/app/ContextImpl.java

            registerService(CONSUMER_IR_SERVICE, new ServiceFetcher() {public Object createService(ContextImpl ctx) {return new ConsumerIrManager(ctx);}});// add register cpuinfo serviceregisterService(CPU_INFO_SERVICE, new ServiceFetcher() {public Object createService(ContextImpl ctx) {IBinder iBinder = ServiceManager.getService(Context.CPU_INFO_SERVICE);return new CpuInfoManager(ctx, ICpuInfoManager.Stub.asInterface(iBinder));}});
    
  7. 将注册的服务设置成开机启动
    frameworks/base/services/java/com/android/server/SystemServer.java

            try {display.systemReady(safeMode, onlyCore);} catch (Throwable e) {reportWtf("making Display Manager Service ready", e);}// add cpuinfo servicetry{ServiceManager.addService(Context.CPU_INFO_SERVICE, new CpuInfoManagerService(context));} catch(Throwable e){Slog.e("CPUINFO","Failed to start CpuInfoManagerService " + e);}
    
  8. 更新api接口并且编译源码

           make  update-apimake -j32
    

    之后更新系统。

三、编写app调用

  1. AndroidStudio中引入AOSP的jar包
    此处导入out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar即可。

  2. 编写app测试
    调用部分代码:

           CpuInfoManager cm = (CpuInfoManager) getSystemService("cpuinfo"); // cpuinfo即Context.CPU_INFO_SERVICE, 不知道为什么,AndroidStudio引入frameworkjar包后,调不到。Log.d("CPUINFO", "getcpuinfo: " + cm.getCpuCore());
    

四、调试

  1. 查看服务是否启动
    串口下输入

    service list | grep cpuinfo
    

    出现以下信息即为添加系统调用服务成功:

    53      cpuinfo: [android.app.ICpuInfoManager]
    
  2. logcat查看app是否调用成功
    串口下输入

    logcat -vthreadtime -s CPUINFO
    

    出现以下打印(cpu core is 4)即为app调用成功:

    --------- beginning of /dev/log/system
    --------- beginning of /dev/log/main
    01-01 08:00:04.433  1930  1930 D CPUINFO : Construct
    05-18 15:03:26.770  4993  4993 D CPUINFO : cpu core is 4
    

五、参考

Android AOSP 添加系统服务【aidl接口服务】Java层

Android4.4添加系统服务(aidl接口服务)相关推荐

  1. 安卓添加系统服务接口以及测试用例

    首先在frameworks/base/下创建如下目录mcserial/java/com/mc/serial然后在此目录下添加如下三个文件IMcSerialNumService.aidl McSeria ...

  2. 设置添加开机自启服务 及系统服务systemd

    一.添加开机自启服务 CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,/usr/lib/systemd/system目录下每一个服务以.service结尾,一般 ...

  3. android7.0如何自定义添加系统服务

    由于项目需要,我这边需要在framework层增加一个语音唤醒服务来实现拉通hal层以及android应用层,实现语音黑屏唤醒以及亮屏唤醒的功能,这里我们只看在android7.0和9.0上是怎么增加 ...

  4. java 模块分离部署_GitHub - yangjiu/Mis: 模块接口服务,如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块?...

    MIS 模块接口服务(Module Interface Service) MIS主要解决的问题是如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块. Us ...

  5. 实现AIDL接口的Binder连接池

    Binder作为AIDL通信的核心, 在使用中经常需要重复利用, 动态管理AIDL接口. Binder连接池的主要作用是把Binder请求统一发送至Service执行, 即动态管理Binder操作, ...

  6. 将Apache添加为Linux的服务 实现自启动

    将Apache添加为Linux的服务 实现自启动 在Linux下用源代码方式编译安装完Apache后,启动关闭Apache可以通过如下命令实现: /app/apache2.2.14/bin/apach ...

  7. 调用远程service aidl接口定义

    Android studio 查看aidl定义的文件:当你进入你的AIDL文件并编写好了之后,点击AS上方菜单栏中的Build->Make Project,之后便可以在当前工程的app/buil ...

  8. dotnet core 开发无缝兼容Http和Websocket协议的接口服务

    在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket和http这两种协议来说就有些不同,从实现上来看Websocket可以说是Http的升级子协议, 两者在协议处理上基本一致 ...

  9. 使用Python实现一个简单的接口服务

    使用Python实现一个简单的接口服务,可以通过get.post方法请求该接口,拿到响应数据.创建一个api_server.py文件,添加代码如下: import flask, json from f ...

  10. SmartSql使用教程(1)——初探,建立一个简单的CURD接口服务

    一.引言 最近SmartSql被正式引入到了NCC,借着这个契机写一个使用教程系列 二.SmartSql简介[摘自官方文档] 1. SmartSql是什么? SmartSql = MyBatis + ...

最新文章

  1. chrome 扩展开发注意事项
  2. 跨平台C++开发环境搭建——GNU+STL+Boost+wxWidget+OpenSceneGraph
  3. Linux之ping命令使用详解—网络故障定位(六)
  4. 服务器意外重启导致storm报错的问题处理
  5. ​【Python基础】告别枯燥,60 秒学会一个 Python 小例子(文末下载)
  6. oracle 容器切换,oracle12c 多租户管理四(容器连接切换)
  7. docker安装nginx容器小记
  8. iis架设aspx_在IIS6中配置html文件以ASPX方式工作
  9. 19 条法则,教你写出火爆 GitHub 的烂代码!
  10. OpenCV4每日一练day11:单目位姿估计
  11. String、StringBuffer与StringBuilder的区别
  12. 经典排序算法(十三)--奇偶排序Odd-even Sort
  13. 在html中做表格以及给表格设置高宽字体居中和表格线的粗细
  14. 【bzoj1520】[POI2006]Szk-Schools 费用流
  15. sap未分摊差异怎么处理_MM采购中形成的差异
  16. matlab灰色关联分析,灰色关联度分析(为什么不显示图像)大佬们帮我看看
  17. Python 实现Tracert追踪TTL值
  18. 为什么证券投资是世界上最难成功的行业
  19. java实现即时通讯软件
  20. Express 路由

热门文章

  1. java graphics 模糊_使用Graphics2D模糊Java背景
  2. 解决“不是有效的win32应用程序”
  3. c++随笔-删除文件
  4. linux下通过inode删除文件
  5. 【Uipath杂谈】用Datatable处理数据(二)
  6. 项目实训(十三)安装pun,pun的基础使用和概念
  7. 计算机群星闪耀时-记计算机界的大牛们
  8. C语言基础and进阶——猜拳游戏(6个版本)
  9. Aptana 安装与配置
  10. 智齿科技宣布C轮获用友领投2.1亿战略投资