IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android4.4添加系统服务(aidl接口服务) -> 正文阅读

[移动开发]Android4.4添加系统服务(aidl接口服务)

一、 准备

  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();
}
  1. 添加系统服务,实现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;
        }   
}
  1. 添加系统服务的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;
        }   
}
  1. 将aidl文件添加至Android.mk参与编译
    frameworks/base/Android.mk
LOCAL_SRC_FILES += \
    core/java/android/app/ICpuInfoManager.aidl \
  1. .添加Context中的Service常量
    frameworks/base/core/java/android/content/Context.java
    /**
    *  用于Service的注册、SystemServer中的开机启动以及上层应用的使用
    */
    public static final String CPU_INFO_SERVICE = "cpuinfo";
  1. 将实现的服务注册到系统中去
    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));
            }});
  1. 将注册的服务设置成开机启动
    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);
        }
  1. 更新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]
  1. 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层

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 19:06:35  更:2022-05-21 19:07:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 1:47:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码