Android 11新增系统服务

这篇具有很好参考价值的文章主要介绍了Android 11新增系统服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.编写.aidl文件

存放位置:frameworks/base/core/java/android/os

package android.os;

interface ISystemVoiceServer {

    void setHeightVoice(int flag);

    void setBassVoice(int flag);

    void setReverbVoice(int flag);

}

2.将.aidl文件添加到frameworks/base/Android.bp

filegroup {
    name: "framework-core-sources",
    srcs: [
        "core/java/**/*.java",
        "core/java/**/*.aidl",
    ],
    path: "core/java",
}

说明:android.bp文件中默认把core/java/目录下的aidl文件添加到编译文件中,所以这一步不需要操作.

由于Android 11对语法检测比较严格,所以针对我们新增的文件先加入忽略:

// TODO(b/145644363): move this to under StubLibraries.bp or ApiDocs.bp
metalava_framework_docs_args = "--manifest $(location core/res/AndroidManifest.xml) " +
    "--ignore-classes-on-classpath " +
    "--hide-package com.android.server " +
    "--error UnhiddenSystemApi " +
    "--hide RequiresPermission " +
    "--hide CallbackInterface " +
    "--hide MissingPermission --hide BroadcastBehavior " +
    "--hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol " +
    "--hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo " +
    "--force-convert-to-warning-nullability-annotations +*:-android.*:+android.icu.*:-dalvik.* " +
    "--api-lint-ignore-prefix android.icu. " +
    "--api-lint-ignore-prefix java. " +
    "--api-lint-ignore-prefix android.os. " +   //新增这一行 
    "--api-lint-ignore-prefix android.app. " +  //新增这一行  
    "--api-lint-ignore-prefix junit. " +
    "--api-lint-ignore-prefix org. "

3、Context.java添加服务注册名称, 添加该服务名称, 用于快捷注册和快捷引用

修改位置:frameworks/base/core/java/android/content/

  //增加新增定义服务名称  
  /**
     * Use with {@link #getSystemService(String)} to retrieve a
     * {@link  android.app.SystemVoiceManager} for accessing
     * text services.
     *
     * @see #getSystemService(String)
     */
  
    public static final String SYSTEMVOCIE_SERVICER = "systemvoice";
    

    /** @hide */
    @StringDef(suffix = { "_SERVICE" }, value = {
            POWER_SERVICE,
            SYSTEMVOCIE_SERVICER,   //此处新增服务
            WINDOW_SERVICE,
            LAYOUT_INFLATER_SERVICE,
            ......}

4、新建SystemVoiceService.java和SystemVoiceManager.java

存放位置:frameworks\base\services\core\java\com\android\server\SystemVoiceService.java

frameworks\base\core\java\android\app\SystemVoiceManager.java

package com.android.server;

import android.app.SystemVoiceManager;
import android.content.Context;
import android.os.ISystemVoiceServer;
import android.os.RemoteException;
import com.android.server.SystemService;
import com.android.internal.app.IAppOpsService;


public class SystemVoiceService extends SystemService {
    private final String TAG = "SystemVoiceService";

    private Context mContext;
    private IAppOpsService mAppOps;
    private SystemVoiceManager mManager;

    public SystemVoiceService(Context context) {
        super(context);
        this.mContext = context;
    }

    public void systemReady(IAppOpsService appOps) {
        mAppOps = appOps;
        if (mManager == null) {
            mManager = (SystemVoiceManager) mContext.getSystemService(Context.SYSTEMVOICE_SERVICE);
        }
    }

    @Override
    public void onStart() {
        publishBinderService(Context.SYSTEMVOICE_SERVICE, new BinderService());
    }


    private final class BinderService extends ISystemVoiceServer.Stub {

        @Override
        public void setHeightVoice(int flag) throws RemoteException {
            
        }

        @Override
        public void setBassVoice(int flag) throws RemoteException {

        }

        @Override
        public void setReverbVoice(int flag) throws RemoteException {

        }
    }
}
package android.app;

import android.content.Context;
import android.os.ISystemVoiceServer;
import android.util.Log;
import android.annotation.SystemService;
import android.os.RemoteException;


@SystemService(Context.SYSTEMVOICE_SERVICE)
public class SystemVoiceManager {

    private static final String TAG = "SystemVoiceManager";
    private ISystemVoiceServer mService;
    private Context context;

    public SystemVoiceManager(Context ctx, ISystemVoiceServer service) {
        mService = service;
        context = ctx;
    }

    public void setHeightVoice(int flag) {
        try {
            mService.setHeightVoice(flag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void setBassVoice(int flag) {
        try {
            mService.setBassVoice(flag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void setReverbVoice(int flag) {
        try {
            mService.setReverbVoice(flag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

5、SystemServer.java 中注册该service

修改位置: frameworks\base\services\java\com\android\server

import com.android.server.SystemVoiceService ;//导包
 
private SystemVoiceService  mSystemVoiceService; //定义

  //系统服务加入的位置加入以下内容
  t.traceBegin("StartSystemVoiceManager");
  mSystemVoiceService = mSystemServiceManager.startService(SystemVoiceService.class);
  t.traceEnd();

  //系统服务加入的位置加入以下内容
   t.traceBegin("MakeSystemVoiceManagerServiceReady");
   try {
           // TODO: use boot phase
       mSystemVoiceService.systemReady(mActivityManagerService.getAppOpsService());
    } catch (Throwable e) {
           reportWtf("making SystemVoice Manager Service ready", e);
    }
     t.traceEnd();

6、SystemServiceRegistry的static{}, 并在其中注册该service

修改位置:frameworks\base\core\java\android\app

import android.os.ISystemVoiceServer;//导包

//SystemVoiceManager在同一目录下所以不用导包

   registerService(Context.SYSTEMVOICE_SERVICE, SystemVoiceManager.class,
                new CachedServiceFetcher<SystemVoiceManager>() {
                    @Override
                    public SystemVoiceManager createService(ContextImpl ctx)
                            throws ServiceNotFoundException {
                        IBinder b = ServiceManager.getServiceOrThrow(
                                Context.SYSTEMVOICE_SERVICE);
                        return new SystemVoiceManager(
                                ctx.getOuterContext(),ISystemVoiceService.Stub.asInterface(b));
                    }});

以上步骤完成我们的自定义系统服务就完成了90% 但是我们还有最后一步,也是最重要的一步:

然后我们只需要添加这个自定义服务SystemVoiceService相关的 SELinux 规则。为了方便之后验证,打开selinux

要记住这个命令 adb shell setenforce 1 # 1为打开 #0为关闭

Android 11 的 selinux 规则是放在 system/sepolicy 目录下的:

service.te 和 service_contexts 都要加上SystemVoiceService的配置:

//在以下目录文件
./prebuilts/api/30.0/public/service.te   # 需要
./public/service.te                 # 需要
//添加以下内容
type systemvoice_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
//在以下目录文件
./prebuilts/api/30.0/private/service_contexts   # 需要
./private/service_contexts         # 需要
//添加以下内容
systemvoice_service                      u:object_r:isystemvoice_service:s0

添加完配置后,Android11版本还要需要在以下目录修改以下忽略配置,才能正常编译

在以下目录
./prebuilts/api/30.0/private/compat/29.0/29.0.ignore.cil
./prebuilts/api/30.0/private/compat/28.0/28.0.ignore.cil
./prebuilts/api/30.0/private/compat/27.0/27.0.ignore.cil
./prebuilts/api/30.0/private/compat/26.0/26.0.ignore.cil
./private/compat/29.0/29.0.ignore.cil
./private/compat/28.0/28.0.ignore.cil
./private/compat/27.0/27.0.ignore.cil
./private/compat/26.0/26.0.ignore.cil
android 添加系统服务,android studio,android,ide,Powered by 金山文档

到此,android 11 系统服务已经添加完成!.

8、验证:

编译完成后,输入adb shell

#service list

查看服务列表中 是否存在有添加服务 :itest

如果不存在 逐步排查 参照上一步看哪一步错误

如果存在 就在代码中验证

找到编译最新生成的class.jar文件,导入Androidstudio(如何导入自行百度)

编译后的class.jar目录\out\target\common\obj\JAVA_LIBRARIES\framework_intermediates

如果未生成 执行下make javac-check-framework 这个命令 就会生成!!!

觉得我写的好的兄弟 动动你发财的小手 点个赞 !!!

你们的认同将是我继续写下去的动力 !!文章来源地址https://www.toymoban.com/news/detail-665913.html

到了这里,关于Android 11新增系统服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 13添加自定义Java系统服务(一)

    欢迎加入我的知识星球Android系统开发指南 欢迎关注微信公众号 无限无羡 欢迎关注知乎账号 无限无羡 在平时的业务开发中,我们往往需要开发自定义的系统服务来处理自己特殊的需求,我们这里提供两种方式来实现。第一种是按照已有的系统服务的方法,运行在system_serve

    2024年02月10日
    浏览(48)
  • Android Studio 如何添加依赖

    1.有时候写项目需要添加一个依赖,比如我需要使用蓝牙,但是又不想自己写,从网上找一个成熟稳定的蓝牙项目,在自己的项目中添加一个文件夹取个名字,再把找到的项目中app路径下的内容, 把这些复制到自己项目的新建文件夹中,这样就成了一个内部模块,然后再将此

    2024年02月12日
    浏览(47)
  • Android Studio开发简易APP添加代办事项

    创建xml布局页

    2024年02月15日
    浏览(45)
  • Android Studio开发之路(二)添加图片资源

    第一步:复制要添加的图片 第二步:右键点击项目的res-drawable目录,选择paste粘贴 选择drawable目录 问你是否确定要复制,点击ok即可 然后就可以看到在drawable目录下出现了复制的图片 然后在xml中添加代码就可以显示在界面上了

    2024年02月09日
    浏览(48)
  • android studio 添加并读取json配置文件

    第一步:在android  studio中添加json文件;   第二步:读取文件的函数

    2024年02月16日
    浏览(46)
  • Android11.0 导航栏添加图标截屏

    需求: 导航栏添加截屏和电源键图标,控制截屏和用于设备重启关机功能。设置中添加延时截屏和控制截屏图标显示开关。 1. 导航栏添加图标 1.1 添加布局文件和图标icon 在layout目录下添加nav_power.xml和screenshot.xml文件 frameworks/base/packages/SystemUI/res/layout/nav_power.xml frameworks/base

    2024年02月15日
    浏览(62)
  • 2022 最新 Android studio添加阿里云Aliyun Maven仓库

    网上看了很多的文章,都是老文章,要不就是AS是老版本,我是个新手,也不懂AS老了有啥好的,所以下载AS的时候,默认就选了最新的,这也让我踩了很多的坑,因为新。。。 太新了,很多资料对不上,连文件都找不到,CV过去之后,一堆错误。。。 看的是真让我头疼,几天

    2024年02月12日
    浏览(88)
  • Android studio添加MP3音频文件(超详细教程)

    进入Android studio 在res下新建一个文件夹raw,右击res—— New ——Direclory 输入raw 再把MP3文件复制到raw就可以了。 这样就完成了。

    2024年02月11日
    浏览(52)
  • 如何在现有的 Android Studio 工程中添加 C++ 代码

    创建了一个 Android Studio 工程,在实现了许多功能后,需要在当前的工程中调用一些 C++ 代码,在网上查了一些资料,发现,都是在创建 Android Studio 工程时,就加入 C++ 支持,我不想 重新 创建带 C++ 支持的 Android Studio 工程,因为有些工作需要在新工程中重复做,很麻烦,于是

    2024年03月19日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包