【Android Car Series】Capítulo 11 Servicio del sistema - Servicio personalizado de SystemServer

1 Escriba un servicio de sistema personalizado

1.1 Definición de la interfaz AIDL

/frameworks/base/core/java/android/app/Cree una nueva interfaz AIDL IYvanManager.aidl en el directorio de código fuente del sistema

package android.app;

/**
* 目录:/frameworks/base/core/java/android/app/IYvanManager.aidl
*/
interface IYvanManager{
    
    
    String request(String msg);
}

1.2 Servidor

package com.android.server.yvan;

import android.app.IYvanManager;
import android.os.RemoteException;


/**
 * 服务端   AMS PMS WMS
 * 目录:/frameworks/base/services/core/java/com/android/server/yvan/YvanManagerService.java
 */
public class YvanManagerService extends IYvanManager.Stub {
    
    
    @Override
    public String request(String msg) throws RemoteException {
    
    
        return "YvanManagerService接收数据:"+msg;
    }
}

1.3 Cliente

package android.app;

import android.annotation.SystemService;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Singleton;
import android.os.ServiceManager;
import android.annotation.Nullable;
/**
 * 客户端
 * 目录:/frameworks/base/core/java/android/app/YvanManager.java
 */
@SystemService(Context.YVAN_SERVICE)
public class YvanManager{
    
    
    /**
     * @hide
     */
    public YvanManager() {
    
    
    }
    /**
     * @hide
     */
    public static IYvanManager getServerice(){
    
    
        return I_YVAN_MANAGER_SINGLETON.get();
    }

    @UnsupportedAppUsage
    private static final Singleton<IYvanManager> I_YVAN_MANAGER_SINGLETON =
            new Singleton<IYvanManager>() {
    
    
                @Override
                protected IYvanManager create() {
    
    
                    final IBinder b= ServiceManager.getService(Context.YVAN_SERVICE);
                    final IYvanManager im=IYvanManager.Stub.asInterface(b);
                    return im;
                }
            };


    @Nullable
    public String request(@Nullable String msg){
    
    
        try{
    
    
            return getServerice().request(msg);
        }catch (RemoteException e){
    
    
            throw e.rethrowFromSystemServer();
        }
    }
}

1.4 Agregar constantes de archivo superior e inferior

  1. /frameworks/base/core/java/android/context/Context.javaAgregue el nombre del servicio debajo del archivo:
public static final String YVAN_SERVICE = "yvan";
  1. Agregar el servicio en la constanteYVAN_SERVICE
	@StringDef(suffix = {
    
     "_SERVICE" }, value = {
    
    
            POWER_SERVICE,
            //@hide: POWER_STATS_SERVICE,
            WINDOW_SERVICE,
            LAYOUT_INFLATER_SERVICE,
            ACCOUNT_SERVICE,
            ACTIVITY_SERVICE,
            YVAN_SERVICE,

1.5 Registrar BINDER

1.5.1 Agregue el servicio bajo el método frameworks/base/services/java/com/android/server/SystemServer.javabajo el archivostartOtherServices()

ServiceManager.addService(Context.YVAN_SERVICE,new YvanManagerService());

1.5.2 La obtención de servicios getSystemService()se implementa en el método ContextImpl in Context

SystemServiceRegistry.getSystemService(this, name);

1.5.3 frameworks/base/core/java/android/app/SystemServiceRegistry.javaes la clase utilizada para obtener servicios para el cliente, en la que se ejecuta un bloque estático registerService()para el registro

registerService(Context.YVAN_SERVICE, YvanManager.class,
                new CachedServiceFetcher<YvanManager>() {
    
    
                    @Override
                    public YvanManager createService(ContextImpl ctx) {
    
    
                        return new YvanManager();
                    }});

1.5.4 Últimos permisos de seguridad de SeLinux modificados

system/sepolicy/prebuilts/api/32.0/private/ 与 system/sepolicy/private/En el directorio, modifique los siguientes tres archivos respectivamente
inserte la descripción de la imagen aquí

1.service_contexts
#Configure el rol de selinux del servicio personalizado
yvan u:object_r:yvan_service:s0
user:role:type:security level

2.service.te
#Configurar permisos para tipos de servicios personalizados
type yvan_service,
app_api_service, ephemeral_app_api_service,
system_server_service,
service_manager_type;

3.untrusted_app_all.te
#Permitir que todas las aplicaciones utilicen servicios personalizados
allow untrusted_app_all yvan_service:service_manager find;

1.5.5 Actualizar y compilar

#Actualizar: hacer update-api
#Compilar: m
#Ejecutar emulador: emulador

1.5.6 Verificación exitosa del servicio agregado

adb shell service list |grep yvan

2 Uso de servicios personalizados

2.1 Método 1: Uso del mecanismo de delegación de los padres

Generalmente, solo se usa para depurar si la función de servicio en sí es normal.

package android.app;

public class YvanManager {
    
    
    public String request(String msg){
    
    
        return null;
    }
}

// 使用
YvanManager yvanManager=(YvanManager)getSystemService("yvan");
String str=yvanManager.request("app msg!");
Log.i("yvan",str);

2.2 Método 2: modificando la configuración del SDK

Personalice el SDK para la capa de aplicación

2.2.1 Haga una copia del SDK en uso y cámbiele el nombre a android-32.car, y también haga una copia de la plataforma en plataformas y fuentes en android-32.car

2.2.2 Reemplace android.jar en el SDK/plataforma nativo copiado con el compilado por usted mismo

out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes-header.jar

2.2.3 Modificar la configuración del SDK

2.2.3.1 Android-32.car\platforms\android-321\source.properties

	#指定自定义平台标识为321(可以是任意数字,但为了与原生标识区分,请使用三位数) 
	#修改: 
		Pkg.Desc=Android SDK Platform 321 
		Pkg.UserSrc=false 
	#修改: 
		Platform.Version=321 
		Platform.CodeName= 
		Pkg.Revision=1 
	#修改: 
		AndroidVersion.ApiLevel=321 
		Layoutlib.Api=15 
		Layoutlib.Revision=1 
		Platform.MinToolsRev=22

2.2.3.2 Modificar android-32.car\platforms\android-321\package.xml

<localPackage path="platforms;android-321" obsolete="false"> 
 <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:type="ns5:platformDetailsType"> 
 <!-- 修改 --> 
 <api-level>321</api-level> 
 <codename></codename> 
 <layoutlib api="15"/></type-details> 
 <revision> 
 <major>1</major> 
 </revision> 
 <!-- 修改 --> 
 <display-name>Android SDK Platform 321</display-name> 
 <uses-license ref="android-sdk-license"/> 
</localPackage>

2.2.4 Configurar salto de fuente

Modifique android-32.car\sources\android-321el directorio, consulte el paso 3 source.propertiesy package.xmlel archivo

3 preguntas para pensar

¿ Cómo escribir un servicio personalizado y requerir un proceso de ejecución del sistema 生命周期管理? ? ? Consulte Gestión del ciclo de vida de los servicios AMS.

おすすめ

転載: blog.csdn.net/u010687761/article/details/130353630