Android 11新增系统服务
创始人
2025-05-31 17:54:26
0

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);}}@Overridepublic void onStart() {publishBinderService(Context.SYSTEMVOICE_SERVICE, new BinderService());}private final class BinderService extends ISystemVoiceServer.Stub {@Overridepublic void setHeightVoice(int flag) throws RemoteException {}@Overridepublic void setBassVoice(int flag) throws RemoteException {}@Overridepublic 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 phasemSystemVoiceService.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() {@Overridepublic 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 11 系统服务已经添加完成!.

8、验证:

编译完成后,输入adb shell

#service list

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

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

如果存在 就在代码中验证

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

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

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

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

你们的认同将是我继续写下去的动力 !!

相关内容

热门资讯

打架斗殴检讨书通用版三篇 打架... 我们之所以要写检讨书是为了自我反省,这才是写检讨书的真正目的,以下是小编为大家搜集整理的打架斗殴检讨...
认识最深刻的检讨书多篇 深刻认...   篇一  尊敬的老师:  我是很认真得的写这篇检讨书,没有任何搞笑色彩,也没有任何的其他杂念,我是...
放学去网吧检讨书范文3篇 学生...  放学去网吧检讨书范文一  本人,XXX(姓名),XX中学高中X年级X班学生,学号为XX。  前天放...
写给父母的检讨书多篇 顶撞父母... 父母总是爱着自己的子女的,也许他们会对你很严厉,让你不能理解,但是你要理解父母的苦心,以下是小编推荐...
做错事的检讨书精选5篇 做错事...  做错事的检讨书(一)  尊敬的老师:  你好!  开学至今,我本人做错的事很多,如迟到、爬墙等。但...
最新或2023(历届)普通党员...   教师党员四风对照检查材料  根据走访调研和召开不同类型座谈会收集到的意见,梳理出管理(服务)岗、...
因期中考试成绩不好检讨书三篇 ... 因中考成绩不好检讨书(一)  尊敬的老师们:  您们好!现在我怀着愧疚的心情,写下这份检查.以向您表...
喝酒检讨书,学生和上班喝酒检讨...  喝酒检讨书(一)  尊敬的老师:  你好,我知错了,我不该喝酒,我下次再也不敢喝酒了  我这次喝酒...
最新或2023(历届)学校三严... 学校三严三实班子对照检查材料一  按照学校的总体部署,根据学院《学院“三严三实”专题民主生活会工作方...
值日偷懒检讨书,没做值日检讨书...   值日偷懒检讨书(一)  尊敬的老师:  非常抱歉,我在值日工作当中偷懒了,基本没有完成值日工作就...
最新或2023(历届)最新三严... “凡是有利于党和人民事业的,就坚决干、加油干、一刻不停歇地干;凡是不利于党和人民事业的,就坚决改、彻...
党员干部四风对照检查材料范文【...  党员干部四风对照检查材料范文一  市局总队启动党的群众路线教育实践活动以来,按照机关党委工作方案的...
最新或2023(历届)教师党员...  教师党员反四风对照检查材料篇一  这次党的群众路线教育实践活动,对个人来说,既是一次用群众观点、群...
最新小学美德少年事迹材料范文 ...  “美德少年”事迹材料一:  这次,我非常荣幸地被老师推荐为我们班的“美德少年”侯选人,这是让我意想...
最新或2023(历届)评选劳模...  劳模先进事迹材料一  郝建峰同志,是有着多年党龄的优秀共产党员,现在负责通风区行政管理工作,负责组...
最新或2023(历届)最新学校... 学校优秀团干部事迹材料篇一  在团市委领导的指导和我校党支部的关心、支持下,本人在思想上积极上进,工...
最新或2023(历届)女劳模先...   女劳模先进事迹材料_第1篇  最近,XXX正在为自己的几个婴幼儿护理项目多方奔走,由一名从业10...
最新或2023(历届)最新孝心...   材料一:最美孝心少年事迹材料  李云宽,男,13岁,家住武安市南通乐村,目前就读于武安市第九中学...
学校关于美德少年事迹材料简写 ...  【小学生美德少年事迹材料简写一】  我是一名孤儿,在我呱呱坠地不久,父亲就去世了,母亲不堪生活的压...
最新或2023(历届)企业优秀...  材料一:优秀员工先进事迹材料  我在xx有限公司生产车间担任手xx组组长,参加工作已有两年,在这两...