Android 11 agrega nuevos servicios del sistema

1. Escribe el archivo .aidl

Ubicación de almacenamiento: frameworks/base/core/java/android/os

package android.os;

interface ISystemVoiceServer {

    void setHeightVoice(int flag);

    void setBassVoice(int flag);

    void setReverbVoice(int flag);

}

2. Agregue el archivo .aidl a frameworks/base/Android.bp

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

Nota: En el archivo android.bp, el archivo Aidl en el directorio core/java/ se agrega al archivo compilado de forma predeterminada, por lo que no es necesario realizar este paso.

Dado que Android 11 es más estricto en la detección de sintaxis, primero agregamos ignorar a nuestros archivos recién agregados:

// 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 agrega el nombre de registro del servicio y agrega el nombre del servicio para un registro rápido y una referencia rápida.

Ubicación de modificación: 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. Cree nuevos SystemVoiceService.java y SystemVoiceManager.java

Ubicación de almacenamiento: 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. Registre el servicio en SystemServer.java

Modificar ubicación: 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. Estático {} de SystemServiceRegistry y registrar el servicio en él

Ubicación de modificación: frameworks\base\core\java\android\app

importar android.os.ISystemVoiceServer;//导包

//SystemVoiceManager está en el mismo directorio, por lo que no es necesario importar paquetes

   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));
                    }});

Los pasos anteriores están completos en un 90% cuando se completa nuestro servicio de sistema personalizado, pero aún nos queda el último y más importante paso:

Luego solo necesitamos agregar reglas SELinux relacionadas con este servicio personalizado SystemVoiceService. Para verificación posterior, abra selinux

Recuerde este comando adb shell setenforce 1 # 1 está abierto # 0 está cerrado

Las reglas de selinux de Android 11 se colocan en el directorio system/sepolicy:

Service.te y service_contexts deben agregar la configuración de 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

Después de agregar la configuración, la versión Android11 ​​también necesita modificar la siguiente configuración de ignorar en el siguiente directorio para compilar normalmente

在以下目录
./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

¡En este punto, se ha agregado el servicio del sistema Android 11!

8. Verificación:

Una vez completada la compilación, ingrese adb shell

#Lista de servicios

Compruebe si hay un servicio agregado en la lista de servicios: itest

Si no hay una solución de problemas paso a paso, consulte el paso anterior para ver cuál es el incorrecto.

Verificar en código si existe

Busque y compile el último archivo class.jar generado e impórtelo a Androidstudio (cómo importarlo desde Baidu)

Directorio class.jar compilado\out\target\common\obj\JAVA_LIBRARIES\framework_intermediates

Si no se genera, ejecute el comando make javac-check-framework y se generará. ! !

Creo que mi escritura es buena, hermano, mueve tu manita para hacer una fortuna, ¡dale el visto bueno! ! !

¡Tu reconocimiento será la motivación para seguir escribiendo! !

Supongo que te gusta

Origin blog.csdn.net/a546036242/article/details/129683832
Recomendado
Clasificación