首页 > 其他分享 >Android添加系统服务

Android添加系统服务

时间:2022-09-06 14:45:57浏览次数:72  
标签:java vibratorId SERVICE int 添加 服务 Android public android

基于android 12

添加服务

frameworks/base/services/java/com/android/server/SystemServer.java

在这两个函数中都可以添加:

startCoreServices()
startOtherServices()

比如说:

t.traceBegin("StartPowerStatsService");
// Tracks rail data to be used for power statistics.
mSystemServiceManager.startService(PowerStatsService.class);
t.traceEnd();
获取服务

frameworks/base/core/java/android/os/ServiceManager.java

比如说:

PackageManagerService pm = (PackageManagerService)ServiceManager.getService("package");
例子:

下面通过VibratorManagerService看一个完整的例子:

  1. 首先aidl定义接口:
frameworks/base/core/java/android/os/IVibratorManagerService.aidl

/** {@hide} */
interface IVibratorManagerService {
    int[] getVibratorIds();
    VibratorInfo getVibratorInfo(int vibratorId);
    boolean isVibrating(int vibratorId);
    boolean registerVibratorStateListener(int vibratorId, in IVibratorStateListener listener);
    boolean unregisterVibratorStateListener(int vibratorId, in IVibratorStateListener listener);
    boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
            in CombinedVibration vibration, in VibrationAttributes attributes);
    void vibrate(int uid, String opPkg, in CombinedVibration vibration,
            in VibrationAttributes attributes, String reason, IBinder token);
    void cancelVibrate(int usageFilter, IBinder token);
}
  1. VibratorManagerService 继承 IVibratorManagerService.Stub 实现aidl接口
frameworks/base/services/core/java/com/android/server/vibrator/VibratorManagerService.java

public class VibratorManagerService extends IVibratorManagerService.Stub {
    ...
    @Override // Binder call
    public int[] getVibratorIds() {
        return Arrays.copyOf(mVibratorIds, mVibratorIds.length);
    }

    @Override // Binder call
    @Nullable
    public VibratorInfo getVibratorInfo(int vibratorId) {
        VibratorController controller = mVibrators.get(vibratorId);
        return controller == null ? null : controller.getVibratorInfo();
    }

    @Override // Binder call
    public boolean isVibrating(int vibratorId) {
        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.ACCESS_VIBRATOR_STATE,
                "isVibrating");
        VibratorController controller = mVibrators.get(vibratorId);
        return controller != null && controller.isVibrating();
    }
    ...
}
  1. 客户端代理,App通过SystemVibratorManager调用, mService就是VibratorManagerService在客户端的实例
frameworks/base/core/java/android/os/SystemVibratorManager.java

public class SystemVibratorManager extends VibratorManager {
    
    public SystemVibratorManager(Context context) {
        super(context);
        mContext = context;
        mService = IVibratorManagerService.Stub.asInterface( // 通过aidl获取远程binder服务
                ServiceManager.getService(Context.VIBRATOR_MANAGER_SERVICE));
    }
	
    @NonNull
    @Override
    public int[] getVibratorIds() {
        synchronized (mLock) {
            if (mVibratorIds != null) {
                return mVibratorIds;
            }
            try {
                if (mService == null) {
                    Log.w(TAG, "Failed to retrieve vibrator ids; no vibrator manager service.");
                } else {
                    return mVibratorIds = mService.getVibratorIds();
                }
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
            return new int[0];
        }
    }

    ...

}

getSystemService流程:

context.getSystemService()  -> contextImpl.getSystemService -> SystemServiceRegistry.getSystemService

从SYSTEM_SERVICE_FETCHERS获取的,put在registerService函数中.

registerService又封装了registerContextAwareService, registerStaticService,用于注册服务

frameworks/base/core/java/android/app/SystemServiceRegistry.java

    public static Object getSystemService(ContextImpl ctx, String name) {
        ...
        final ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);

        final Object ret = fetcher.getService(ctx);
        ...
    }

    private static <T> void registerService(@NonNull String serviceName,
            @NonNull Class<T> serviceClass, @NonNull ServiceFetcher<T> serviceFetcher) {
        SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
        SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher);
        SYSTEM_SERVICE_CLASS_NAMES.put(serviceName, serviceClass.getSimpleName());
    }
    // 在静态代码块中通过registerService注册服务
    static {
        // 注册VIBRATOR_MANAGER_SERVICE,实际new的SystemVibratorManager,
        // VibratorManager是个抽象类, 实现的是 SystemVibratorManager
        registerService(Context.VIBRATOR_MANAGER_SERVICE, VibratorManager.class,
                new CachedServiceFetcher<VibratorManager>() {
                    @Override
                    public VibratorManager createService(ContextImpl ctx) {
                        return new SystemVibratorManager(ctx); //
                    }});
       ...

    }
    

回到VibratorManagerService上,再看看VibratorManagerService如何通过jni到hal实现控制硬件zhendong


标签:java,vibratorId,SERVICE,int,添加,服务,Android,public,android
From: https://www.cnblogs.com/tangshunhui/p/16660564.html

相关文章

  • idea自动生成实体类,自动添加注释,自定义实体类
    之前写过一篇博客记录了idea编译器怎么快速生成实体类,但是发现没有自动添加注释,如果字段比较多的话,看着很不友好:https://www.cnblogs.com/lyd447113735/p/14924011.html所......
  • 服务端挂了,客户端的 TCP 连接还在吗?
    作者:小林coding计算机八股文网站:https://xiaolincoding.com大家好,我是小林。如果「服务端挂掉」指的是「服务端进程崩溃」,服务端的进程在发生崩溃的时候,内核会发送FI......
  • 单体架构和微服务的优缺点简要说明
    单体架构(适用于短平快小项目)优点+开发简单粗暴+没有其他开销+人力成本低缺点+开发效率低+团队协作困难+部署不够灵活+稳定性不够+扩展性不够微服务(适用于大......
  • Android获取Permission
    在AndroidManifest中加入需要获取的权限<uses-permissionandroid:name="android.permission.INTERNET"/><!--检查网络可用性--><uses-permissionandroid:name="an......
  • 微服务治理热门技术揭秘:动态读写分离
    作者:十眠我们从应用的视角出发整理抽象了我们在访问、使用数据库时场景的一些稳定性治理、性能优化、提效等方面的实战经验,对于每一个后端应用来说,数据库无疑是重中之重,我......
  • Android技术分享| Activity 过渡动画 — 让切换更加炫酷
    介绍在android5.0以上版本中,google为我们提供了几种activity切换的过渡动画,目的是为了让activity切换转场更加美观,而在android5.0之前的activity切换显得生硬......
  • Android系统属性-Settings.system和SystemProperties
    Android系统属性-Settings.system和SystemPropertiesJava代码--应用层方法:SystemProperties.get或者SystemProperties.set如果属性名称以“ro.”开头,那么这个属性被视......
  • 模块化结构与微服务
    模块化结构与微服务在这篇文章中,什么是模块化结构?我们将重点介绍模块化结构与单体结构以及模块化结构与微服务架构之间的关系。在创建应用程序时,我们希望不仅在最终用户......
  • vue3+ts 为原型上添加属性声明
    背景比如在vue2的情况下我们有的时候需要为Vue的原型对象上添加属性或方法,vue3的情况下需要为app挂载全局属性配置,但是结合了ts后,在vue文件中会报警告,但是程序可以正常被......
  • CH579M以太网控制板-多台控制板使用网线串联连接并作为TCP客户端和TCP服务器通信(连接
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/CH579_DTU_PBX"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>说明这......