Fügen Sie Android 11.0 Frameworks einen benutzerdefinierten Systemdienst hinzu und stellen Sie JAR-Pakete für Anwendungsentwicklungsaufrufe bereit

Fügen Sie Android 11.0 Frameworks einen benutzerdefinierten Systemdienst hinzu und stellen Sie JAR-Pakete für Anwendungsentwicklungsaufrufe bereit

Fügen Sie einen Systemdienst in Android11.0Frameworks hinzu

In diesem Artikel wird das Hinzufügen eines neuen Dienstes zu den Frameworks in Android 11 und dessen Kapselung beschrieben, um ein JAR-Paket für Anwendungsentwicklungsaufrufe bereitzustellen.

Benutzerdefinierten Service hinzufügen

Hinweise:
a. Verwenden Sie make Framework-minus-apex, um Frameworks in Android11 ​​zu kompilieren
b. Fügen Sie es im Verzeichnis „framework/base/core“ hinzu Nachdem Sie die Java- und Aidl-Dateien hinzugefügt haben, müssen Sie update-api erstellen, um die Datei current.txt vor dem Kompilieren zu aktualisieren. Anschließend können Sie Android vollständig kompilieren. Nach Android 11 aktiviert Google jedoch zwangsweise die Flusenprüfung. Wenn die Flusen Wenn die Prüfung fehlschlägt, meldet die Kompilierung einen Fehler. Sie können die Flusenprüfung ignorieren. Entfernen Sie Ihr eigenes Modul und ignorieren Sie die Codeprüfung in Android.bp unter „framework/base“, oder Sie können @hide hinzufügen, um Fehler zu vermeiden:

metalava_framework_docs_args = "
"--api-lint-ignore-prefix com.yjz.test. " //其中 com.yjz.test是包名的前缀。

c.Wenn die Kompilierung von Android11 ​​​​den folgenden Fehler meldet, können Sie in /build/make/core/tasks/check_boot_jars/package_allowed_list.txt eine Whitelist hinzufügen

Error: out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/classes.jar contains class file com/yjz/test/api/ITestManager.class, whose package name com.yjz.test.api is empty or not in the allow list build/make/core/tasks/check_boot_jars/package_allowed_list.txt of packages allowed on the bootclasspath.
###################################################
# framework.jar
javax\.microedition\.khronos\.opengles
javax\.microedition\.khronos\.egl
com\.yjz\.test            //添加
com\.yjz\.test\..*        //添加
  1. Definieren Sie den Dienstnamen und ändern Sie den Pfad: /frameworks/base/core/java/android/content/Context.java;

    //这里添加YJZ_TEST_SERVICE
    @StringDef(suffix = {
    
     "_SERVICE" }, value = {
    
    
      YJZ_TEST_SERVICE, 
    }

     /**
     * Use with {
    
    @link #getSystemService(String)} to retrieve a
     * {
    
    @link com.yjz.test.TestManager} for yjz_testcontrol.
     *
     * @hide
     * @see #getSystemService(String)
     * @see com.yjz.test.TestManager
     */
    public static final String YJZ_TEST_SERVICE = "yjz_test";

  1. Fügen Sie ITestManager.aidl und TestManager.java hinzu

Frameworks/base/core/com/yjz/test/api/ITestManager.aidl


package com.yjz.test.api;

/**
* @hide
*/
interface ITestManager {
    
    
     boolean test();
}

Frameworks/base/core/com/yjz/test/TestManager.java

/**
 * @hide
 */
@SystemService(Context.YJZ_TEST_SERVICE)
public class TestManager{
    
    
    private final Context mContext;
    private final ITestManager mService;
    
    public TestManager(Context context, ITestManager manager) {
    
    
        this.mContext = context;
        this.mService = manager;
    }

    public boolean test() {
    
    
        try {
    
    
            return mService.test();
        } catch (RemoteException e) {
    
    
            e.printStackTrace();
        }
        return false;
    }
}
  1. TestManagerService /frameworks/base/services/core/java/com/android/server/yjz/TestManagerService.java hinzufügen;

package com.android.server.yjz;

import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.StaticIpConfiguration;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import com.android.server.SystemService;
import com.yjz.test.api.ITestManager;

public class TestManagerService extends ITestManager.Stub {
    
    
    private static final String TAG = "TestManagerService";
    private final Context mContext;

    public TestManagerService(Context context) {
    
    
        mContext = context;
    }

    @Override
    public boolean test() throws RemoteException {
    
    
        return true;
    }

    public void onStart() {
    
    
    }

    public void systemReady() {
    
    
        Log.d(TAG, "systemReady--->" + Thread.currentThread().getName());
    }

    public static final class Lifecycle extends SystemService {
    
    
        private TestManagerService mServer;

        public Lifecycle(Context context) {
    
    
            super(context);
        }

        @Override
        public void onStart() {
    
    
            mServer = new TestManagerService(getContext());
            publishBinderService(Context.YJZ_TEST_SERVICE, mServer);
            mServer.onStart();
        }

        @Override
        public void onBootPhase(int phase) {
    
    
            if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
    
    
                mServer.systemReady();
            }
        }
    }
}

  1. Fügen Sie den TestManagerService-Dienst zu ServiceManager /frameworks/base/services/java/com/android/server/SystemServer.java hinzu;

//********省略代码******

import com.android.server.yjz.TestManagerService;

private void startOtherServices(@NonNull TimingsTraceAndSlog t){
    
    
            //********省略代码******

            t.traceBegin("StartTestManagerService ");
            mSystemServiceManager.startService(TestManagerService.Lifecycle.class);
            t.traceEnd();

            t.traceBegin("StartTwilightService");
            //********省略代码******
}

//********省略代码******
  1. Registrieren Sie den Dienst /frameworks/base/core/java/android/app/SystemServiceRegistry.java;
//********省略代码******
import com.yjz.test.TestManager;
import com.yjz.test.api.ITestManager;

static {
    
    
//********省略代码******
        registerService(Context.YJZ_TEST_SERVICE, TestManager.class,
                new CachedServiceFetcher<TestManager>() {
    
    
                    @Override
                    public TestManager createService(ContextImpl ctx)
                            throws ServiceNotFoundException {
    
    
                        IBinder b = ServiceManager.getServiceOrThrow(Context.YJZ_TEST_SERVICE);
                        return new TestManager(ctx, ITestManager.Stub.asInterface(b));
                    }
                }); 

//********省略代码******
}
  1. SELinux-Berechtigungen hinzufügen: system/sepolicy/private/service_contexts
    system/sepolicy/prebuilts/api/30.0/private/service_contexts
    oben zwei Fügen Sie Folgendes hinzu
yjz_test                                  u:object_r:yjz_test_service:s0

/system/sepolicy/public/service.te
/system/sepolicy/prebuilts/api/30.0/public/service.te
in Fügen Sie Folgendes zu den beiden oben genannten Dateien hinzu

type yjz_test_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;

system/sepolicy/private/compat/29.0/29.0.ignore.cil
system/sepolicy/private/compat/27.0/27.0.ignore.cil
system/sepolicy/private/compat/28.0/28.0.ignore.cil
system/sepolicy/private/compat/26.0/26.0.ignore.cil
system/sepolicy/prebuilts/api/30.0/private/compat/29.0/29.0.ignore.cil
system/sepolicy/prebuilts/api/30.0/private/compat/27.0/27.0.ignore .cil
system/sepolicy/prebuilts/api/30.0/private/compat/28.0/28.0.ignore.cil
system/sepolicy/prebuilts/api/30.0 /private/compat/26.0/26.0.ignore.cil
在上面的文件中添加以下

(typeattributeset new_objects
  ( new_objects
    //********省略代码******
    hypervisor_prop
    yjz_test_service //添加服务名称
  ))
  1. Whitelist hinzufügen:
    //build/make/core/tasks/check_boot_jars/package_allowed_list.txt
###################################################
# framework.jar
javax\.microedition\.khronos\.opengles
javax\.microedition\.khronos\.egl
com\.yjz\.test          //新添加
com\.yjz\.test\..*       //新添加
  1. Versteckte Methode hinzufügen, um eine Aufrufliste auf Anwendungsebene zu ermöglichen
    /frameworks/base/config/hiddenapi-greylist-packages.txt
com.yjz.test
  1. Kompilierungs- und Flash-Überprüfung, Liste der ADB-Shell-Dienste
    Fügen Sie hier eine Bildbeschreibung ein

Kapseln Sie benutzerdefinierte Dienste und stellen Sie JARs bereit, die Anwendungsentwickler von Drittanbietern aufrufen können

  1. Fügen Sie das yjz-Verzeichnis unter dem Herstellerverzeichnis hinzu:
    Fügen Sie hier eine Bildbeschreibung ein
    /vendor/yjz/Android.bp
java_library_static {
    
    
    name: "yjz-sdk-api",
    srcs: ["com/yjz/**/*.java"],
}

/vendor/yjz/com/yjz/sdk/SDKManager.java

package com.yjz.sdk;

import android.content.Context;
import com.yjz.test.TestManager;

public class SDKManager {
    
    
    private static final String TAG = "SDKManager";

    private final Context mContext;

    private TestManager mTestManager;

    public SDKManager(Context context) {
    
    
        mContext = context.getApplicationContext();
        mTestManager = (TestManager) context.getSystemService(Context.YJZ_TEST_SERVICE);
    }

    public boolean test() {
    
    
        return mTestManager.test();
    }

}
  1. Kompilieren Sie mmm seller/yjz/, um yjz-sdk-api.jar zu generieren
  2. Importieren Sie yjz-sdk-api.jar während der Anwendungsentwicklung und rufen Sie Methoden auf
   SDKManager manger = new SDKManager(this);
   manger.test();

おすすめ

転載: blog.csdn.net/yjz_0314/article/details/134395415