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
/frameworks/base/core/java/android/context/Context.java
Agregue el nombre del servicio debajo del archivo:
public static final String YVAN_SERVICE = "yvan";
- Agregar el servicio en la constante
YVAN_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.java
bajo 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.java
es 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
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-321
el directorio, consulte el paso 3 source.properties
y package.xml
el 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.