资讯专栏INFORMATION COLUMN

[Android][Framework] 添加系统服务

everfight / 2501人阅读

摘要:下面就是新建一个系统服务的基本步骤。添加接口添加服务,实现文件定义的接口添加对应的添加到添加常量注册系统服务开机启动服务编译源码,因为添加了接口,所以需要更新接口。添加权限重新编译代码,使用下面测试代码验证最终打印出,服务添加完成。

新博客地址
http://wossoneri.github.io/2018/09/15/[Android][Framework]create-system-service/

做系统开发,有时候需要自己定义一些接口供App使用, 同时为了方便维护管理,就会需要自己建立一个服务,把新的功能集中在一起。下面就是新建一个系统服务的基本步骤。

  1. 添加接口

    frameworks/base/core/java/android/app/IDemoManager.aidl

    package android.app;
    
    interface IDemoManager
    {
        int getCpuTemperature();
    }
  2. 添加服务,实现aidl文件定义的接口

    frameworks/base/services/core/java/com/android/server/DemoManagerService.java

    package com.android.server;
    
    import android.app.IDemoManager;
    import android.content.Context;
    import android.util.Slog;
    
    public class DemoManagerService extends IDemoManager.Stub {
        private Context mContext;
    
        public DemoManagerService(Context context) {
            mContext = context;
            Slog.d("Demo", "Construct");
        }
    
        @Override
        public int getCpuTemperature() {
            return 100; // Test code
        }
    }
  3. 添加对应的Manager

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

    package android.app;
    
    import android.content.Context;
    import android.os.RemoteException;
    import android.util.Slog;
    
    public class DemoManager {
        Context mContext;
        IDemoManager mService;
    
        public DemoManager(Context context, IDemoManager service) {
            mContext = context;
            mService = service;
        }
    
        public int getCpuTemperature() {
            if (mService != null) {
                try {
                    return mService.getCpuTemperature();
                } catch (RemoteException e) {
                    Slog.e("Demo", "RemoteException " + e);
                }
            }
            return -1;
        }
    }
  4. 添加aidl到Makefile src

    frameworks/base/Android.mk

    LOCAL_SRC_FILES += 
        core/java/android/app/IDemoManager.aidl 
  5. 添加DEMO_SERVICE常量

    frameworks/base/core/java/android/content/Context.java

    public static final String DEMO_SERVICE = "demo";
  6. 注册系统服务

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

    registerService(Context.ORISLINK_SERVICE, DemoManager.class,
        new CachedServiceFetcher() {
            @Override
            public DemoManager createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(Context.DEMO_SERVICE);
                return new DemoManager(ctx, IDemoManager.Stub.asInterface(b));
    }});
  7. 开机启动服务

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

    try {
        ServiceManager.addService(Context.DEMO_SERVICE, new DemoManagerService(context));
    } catch (Throwable e) {
        Slog.e("Demo", "Failed to start Demo Service " + e);
    }
  8. 编译源码,因为添加了接口,所以需要

    make update-api

    更新接口。然后再整编刷机。

  9. service list 查看服务,不存在,这是因为selinux权限没加。

  10. 添加sepolicy权限

device/qcom/sepolicy/msm8937/service.te

type demo_service, system_api_service, system_server_service, service_manager_type;

device/qcom/sepolicy/msm8937/service_contexts

demo  u:object_r:demo_service:s0
  1. 重新编译代码,使用下面测试代码验证

    import android.app.DemoManager;
    
    DemoManager om = (DemoManager) getSystemService(Context.DEMO_SERVICE);
    Log.d(TAG, "Current temperature is " + om.getCpuTemperature());

    最终log打印出100,服务添加完成。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2750.html

相关文章

  • [实践] Android5.1.1源码 - 在Framework添加自定义系统服务

    摘要:下面是服务文件的例子在类中添加我们自定义的系统服务,系统如何添加系统服务可以参考源码分析系统服务何时被添加到这篇文章。下面是我在这个白名单中添加的一行就是时输入的服务名。至此添加系统服务成功,重新编译源码即可。 前言 本文的方法要修改Android源码。但只要将系统服务写出来,也可以注入system_server进程将系统服务加载到system_server中。 步骤 1.添加一个ai...

    LiangJ 评论0 收藏0
  • 深入理解flutter的编译原理与优化

    摘要:本文将以一个简单的为例,介绍下相关原理及定制与优化。模式对应了的模式,又称检查模式或者慢速模式。为快速启动,快速执行,包大小做了优化。并不支持模拟器的原因在于,模拟器上的诊断并不代表真实的性能。因此本文主要讨论因引入的构建,运行等原理。 摘要: 闲鱼技术-正物 问题背景 对于开发者而言,什么是Flutter?它是用什么语言编写的,包含哪几部分,是如何被编译,运行到设备上的呢?Flutt...

    codecook 评论0 收藏0
  • [Android][Framework]裁剪SystemServer服务以及关闭SystemFeat

    摘要:比如,为了应对的应用场景,它就裁剪掉了很多服务。下面介绍一下裁剪服务的方法。关于服务,要提一下,具体介绍见另一篇文章。所以要裁剪掉打印机服务,我们只需要将关闭即可。通过修改判断后,在里面的裁剪代码就可以不再添加了。本文链接 http://wossoneri.github.io/2018/08/30/[Android][Framework]crop-SystemServer-and-Syste...

    Tychio 评论0 收藏0
  • Android的隐私保护利器

    摘要:总线控制型的第三方工具在年,的隐私保护只有。停止更新了谷歌重视的官方关注是谷歌与竞争的平台。谷歌当然会重视隐私安全。谷歌随后在推出了程序,对不起啦功能,并且可以在设置面板里直接限制程序访问隐私的权限。 IPHONE/IPAD的IOS的隐私保护,曾经让我这种玩Android的穷人急红了眼。 1、总线控制型的第三方工具 在2011年,Android的隐...

    Turbo 评论0 收藏0
  • Android的隐私保护利器

    摘要:总线控制型的第三方工具在年,的隐私保护只有。停止更新了谷歌重视的官方关注是谷歌与竞争的平台。谷歌当然会重视隐私安全。谷歌随后在推出了程序,对不起啦功能,并且可以在设置面板里直接限制程序访问隐私的权限。 IPHONE/IPAD的IOS的隐私保护,曾经让我这种玩Android的穷人急红了眼。 1、总线控制型的第三方工具 在2011年,Android的隐...

    plokmju88 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<