Android4.4添加系统服务(aidl接口服务)

10 篇文章 1 订阅
1 篇文章 0 订阅

一、 准备

  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");
            }   
    
            @Override
            public 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 service
            registerService(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 service
            try{
                ServiceManager.addService(Context.CPU_INFO_SERVICE, new CpuInfoManagerService(context));
            } catch(Throwable e){
                Slog.e("CPUINFO","Failed to start CpuInfoManagerService " + e);
            }
    
  8. 更新api接口并且编译源码

           make  update-api
           make -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层

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值