在Android13上添加系统服务的好用例子

发布于:2025-06-08 ⋅ 阅读:(20) ⋅ 点赞:(0)

在Android13上添加一个自动的system service例子

留好,备用。

---
 .../prebuilts/api/30.0/plat_pub_versioned.cil | 76 ++++++++++++++-
 .../prebuilts/api/31.0/plat_pub_versioned.cil | 94 ++++++++++++++++++-
 .../prebuilts/api/32.0/plat_pub_versioned.cil | 94 ++++++++++++++++++-
 frameworks/base/core/api/current.txt          | 18 ++++
 .../android/app/SystemServiceRegistry.java    | 25 ++++-
 .../core/java/android/bean/BeanManager.java   | 50 ++++++++++
 .../core/java/android/bean/IBeanManager.aidl  | 16 ++++
 .../base/core/java/android/bean/Person.aidl   |  3 +
 .../base/core/java/android/bean/Person.java   | 74 +++++++++++++++
 .../core/java/android/content/Context.java    | 12 +++
 .../server/bean/BeanManagerService.java       | 71 ++++++++++++++
 .../java/com/android/server/SystemServer.java | 11 ++-
 .../api/28.0/private/service_contexts         |  1 +
 .../api/28.0/private/system_server.te         |  2 +
 .../api/28.0/public/system_server.te          |  1 +
 .../api/29.0/private/service_contexts         |  1 +
 .../api/29.0/private/system_server.te         |  2 +
 .../prebuilts/api/29.0/public/service.te      |  1 +
 .../api/30.0/private/service_contexts         |  1 +
 .../api/30.0/private/system_server.te         |  1 +
 .../prebuilts/api/30.0/public/service.te      |  1 +
 .../api/31.0/private/service_contexts         |  1 +
 .../api/31.0/private/system_server.te         |  1 +
 .../prebuilts/api/31.0/public/service.te      |  1 +
 .../api/32.0/private/service_contexts         |  1 +
 .../api/32.0/private/system_server.te         |  1 +
 .../prebuilts/api/32.0/public/service.te      |  1 +
 .../api/33.0/private/service_contexts         |  1 +
 .../api/33.0/private/system_server.te         |  2 +
 .../prebuilts/api/33.0/public/service.te      |  1 +
 system/sepolicy/private/service_contexts      |  1 +
 system/sepolicy/private/system_server.te      |  2 +
 system/sepolicy/public/service.te             |  1 +
 33 files changed, 561 insertions(+), 8 deletions(-)
 create mode 100644 frameworks/base/core/java/android/bean/BeanManager.java
 create mode 100644 frameworks/base/core/java/android/bean/IBeanManager.aidl
 create mode 100644 frameworks/base/core/java/android/bean/Person.aidl
 create mode 100644 frameworks/base/core/java/android/bean/Person.java
 create mode 100644 frameworks/base/services/core/java/com/android/server/bean/BeanManagerService.java

diff --git a/device/qcom/sepolicy/prebuilts/api/30.0/plat_pub_versioned.cil b/device/qcom/sepolicy/prebuilts/api/30.0/plat_pub_versioned.cil
index ac63b142bc..b6a28cc608 100644
--- a/device/qcom/sepolicy/prebuilts/api/30.0/plat_pub_versioned.cil
+++ b/device/qcom/sepolicy/prebuilts/api/30.0/plat_pub_versioned.cil
@@ -1 +1,75 @@
-;; this file should not be empty
+(type vendor_smcinvoke_device)
+(type vendor_qtelephony)
+(type vendor_dpmd)
+(type vendor_dun-server)
+(type vendor_elabel_data_file)
+(type vendor_dpmtcm_socket)
+(type vendor_seempdw_socket)
+(type vendor_fm_app)
+(type vendor_hal_atfwd_hwservice)
+(type vendor_sigmahal_hwservice)
+(type vendor_qccsyshal_hwservice)
+(type vendor_location_app)
+(type vendor_mmi_sys)
+(type vendor_perfservice)
+(type vendor_persist_dpm_prop)
+(type vendor_persist_camera_prop)
+(type vendor_bt_prop)
+(type vendor_sys_video_prop)
+(type vendor_wlc_prop)
+(type vendor_qcc_app)
+(type vendor_qcc_trd)
+(type vendor_qcc_utils_app)
+(type vendor_qspmsvc)
+(type qti-testscripts)
+(type vendor_qvrd)
+(type vendor_seempd)
+(type vendor_usta_app_service)
+(type vendor_vpsservice)
+(type vendor_wfd_app)
+(type vendor_wfdservice)
+(type vendor_sigmahal_qti)
+(type vendor_dataservice_app)
+(typeattribute vendor_smcinvoke_device_30_0)
+(typeattribute vendor_qtelephony_30_0)
+(typeattribute vendor_dpmd_30_0)
+(typeattribute vendor_dun-server_30_0)
+(typeattribute vendor_elabel_data_file_30_0)
+(typeattribute vendor_dpmtcm_socket_30_0)
+(typeattribute vendor_seempdw_socket_30_0)
+(typeattribute vendor_fm_app_30_0)
+(typeattribute vendor_hal_atfwd_hwservice_30_0)
+(typeattribute vendor_sigmahal_hwservice_30_0)
+(typeattribute vendor_qccsyshal_hwservice_30_0)
+(typeattribute vendor_location_app_30_0)
+(typeattribute vendor_mmi_sys_30_0)
+(typeattribute vendor_perfservice_30_0)
+(typeattribute vendor_persist_dpm_prop_30_0)
+(typeattribute vendor_persist_camera_prop_30_0)
+(typeattribute vendor_bt_prop_30_0)
+(typeattribute vendor_sys_video_prop_30_0)
+(typeattribute vendor_wlc_prop_30_0)
+(typeattribute vendor_qcc_app_30_0)
+(typeattribute vendor_qcc_trd_30_0)
+(typeattribute vendor_qcc_utils_app_30_0)
+(typeattribute vendor_qspmsvc_30_0)
+(typeattribute qti-testscripts_30_0)
+(typeattribute vendor_qvrd_30_0)
+(typeattribute vendor_seempd_30_0)
+(typeattribute vendor_usta_app_service_30_0)
+(typeattribute vendor_vpsservice_30_0)
+(typeattribute vendor_wfd_app_30_0)
+(typeattribute vendor_wfdservice_30_0)
+(typeattribute vendor_sigmahal_qti_30_0)
+(typeattribute vendor_dataservice_app_30_0)
+(typeattribute vendor_hal_systemhelper)
+(typeattribute vendor_hal_systemhelper_client)
+(typeattribute vendor_hal_systemhelper_server)
+(type vendor_hal_systemhelper_hwservice)
+(type vendor_display_notch_prop)
+(type vendor_sys_qti_display)
+(type vendor_systemhelper_app)
+(typeattribute vendor_hal_systemhelper_hwservice_30_0)
+(typeattribute vendor_display_notch_prop_30_0)
+(typeattribute vendor_sys_qti_display_30_0)
+(typeattribute vendor_systemhelper_app_30_0)
diff --git a/device/qcom/sepolicy/prebuilts/api/31.0/plat_pub_versioned.cil b/device/qcom/sepolicy/prebuilts/api/31.0/plat_pub_versioned.cil
index ac63b142bc..35396982d8 100644
--- a/device/qcom/sepolicy/prebuilts/api/31.0/plat_pub_versioned.cil
+++ b/device/qcom/sepolicy/prebuilts/api/31.0/plat_pub_versioned.cil
@@ -1 +1,93 @@
-;; this file should not be empty
+(type vendor_smcinvoke_device)
+(type vendor_qtelephony)
+(type vendor_dpmd)
+(type vendor_dun-server)
+(type vendor_elabel_data_file)
+(type vendor_dpmtcm_socket)
+(type vendor_seempdw_socket)
+(type vendor_fm_app)
+(type vendor_hal_atfwd_hwservice)
+(type vendor_sigmahal_hwservice)
+(type vendor_qccsyshal_hwservice)
+(type vendor_location_app)
+(type vendor_mmi_sys)
+(type vendor_perfservice)
+(type vendor_persist_dpm_prop)
+(type vendor_persist_camera_prop)
+(type vendor_bt_prop)
+(type vendor_sys_video_prop)
+(type vendor_wlc_prop)
+(type vendor_qcc_app)
+(type vendor_qcc_trd)
+(type vendor_qcc_utils_app)
+(type vendor_qspmsvc)
+(type qti-testscripts)
+(type vendor_qvrd)
+(type vendor_seempd)
+(type vendor_usta_app_service)
+(type vendor_vpsservice)
+(type vendor_wfd_app)
+(type vendor_wfdservice)
+(type vendor_sigmahal_qti)
+(type vendor_dataservice_app)
+(type vendor_qesdk_service)
+(type vendor_qcc_authmgr_app)
+(type vendor_qcc_lmtp_app)
+(type vendor_qcc_netstat_app)
+(type vendor_qvirtmgr)
+(type vendor_hal_displayconfig_service)
+(type vendor_hal_telephony_service)
+(type vendor_persist_tcm_prop)
+(type vendor_persist_rcs_prop)
+(typeattribute vendor_smcinvoke_device_31_0)
+(typeattribute vendor_qtelephony_31_0)
+(typeattribute vendor_dpmd_31_0)
+(typeattribute vendor_dun-server_31_0)
+(typeattribute vendor_elabel_data_file_31_0)
+(typeattribute vendor_dpmtcm_socket_31_0)
+(typeattribute vendor_seempdw_socket_31_0)
+(typeattribute vendor_fm_app_31_0)
+(typeattribute vendor_hal_atfwd_hwservice_31_0)
+(typeattribute vendor_sigmahal_hwservice_31_0)
+(typeattribute vendor_qccsyshal_hwservice_31_0)
+(typeattribute vendor_location_app_31_0)
+(typeattribute vendor_mmi_sys_31_0)
+(typeattribute vendor_perfservice_31_0)
+(typeattribute vendor_persist_dpm_prop_31_0)
+(typeattribute vendor_persist_camera_prop_31_0)
+(typeattribute vendor_bt_prop_31_0)
+(typeattribute vendor_sys_video_prop_31_0)
+(typeattribute vendor_wlc_prop_31_0)
+(typeattribute vendor_qcc_app_31_0)
+(typeattribute vendor_qcc_trd_31_0)
+(typeattribute vendor_qcc_utils_app_31_0)
+(typeattribute vendor_qspmsvc_31_0)
+(typeattribute qti-testscripts_31_0)
+(typeattribute vendor_qvrd_31_0)
+(typeattribute vendor_seempd_31_0)
+(typeattribute vendor_usta_app_service_31_0)
+(typeattribute vendor_vpsservice_31_0)
+(typeattribute vendor_wfd_app_31_0)
+(typeattribute vendor_wfdservice_31_0)
+(typeattribute vendor_sigmahal_qti_31_0)
+(typeattribute vendor_dataservice_app_31_0)
+(typeattribute vendor_qesdk_service_31_0)
+(typeattribute vendor_qcc_authmgr_app_31_0)
+(typeattribute vendor_qcc_lmtp_app_31_0)
+(typeattribute vendor_qcc_netstat_app_31_0)
+(typeattribute vendor_qvirtmgr_31_0)
+(typeattribute vendor_hal_displayconfig_service_31_0)
+(typeattribute vendor_hal_telephony_service_31_0)
+(typeattribute vendor_persist_tcm_prop_31_0)
+(typeattribute vendor_persist_rcs_prop_30_0)
+(typeattribute vendor_hal_systemhelper)
+(typeattribute vendor_hal_systemhelper_client)
+(typeattribute vendor_hal_systemhelper_server)
+(type vendor_hal_systemhelper_hwservice)
+(type vendor_display_notch_prop)
+(type vendor_sys_qti_display)
+(type vendor_systemhelper_app)
+(typeattribute vendor_hal_systemhelper_hwservice_31_0)
+(typeattribute vendor_display_notch_prop_31_0)
+(typeattribute vendor_sys_qti_display_31_0)
+(typeattribute vendor_systemhelper_app_31_0)
diff --git a/device/qcom/sepolicy/prebuilts/api/32.0/plat_pub_versioned.cil b/device/qcom/sepolicy/prebuilts/api/32.0/plat_pub_versioned.cil
index ac63b142bc..becda6acb8 100644
--- a/device/qcom/sepolicy/prebuilts/api/32.0/plat_pub_versioned.cil
+++ b/device/qcom/sepolicy/prebuilts/api/32.0/plat_pub_versioned.cil
@@ -1 +1,93 @@
-;; this file should not be empty
+(type vendor_smcinvoke_device)
+(type vendor_qtelephony)
+(type vendor_dpmd)
+(type vendor_dun-server)
+(type vendor_elabel_data_file)
+(type vendor_dpmtcm_socket)
+(type vendor_seempdw_socket)
+(type vendor_fm_app)
+(type vendor_hal_atfwd_hwservice)
+(type vendor_sigmahal_hwservice)
+(type vendor_qccsyshal_hwservice)
+(type vendor_location_app)
+(type vendor_mmi_sys)
+(type vendor_perfservice)
+(type vendor_persist_dpm_prop)
+(type vendor_persist_camera_prop)
+(type vendor_bt_prop)
+(type vendor_sys_video_prop)
+(type vendor_wlc_prop)
+(type vendor_qcc_app)
+(type vendor_qcc_trd)
+(type vendor_qcc_utils_app)
+(type vendor_qspmsvc)
+(type qti-testscripts)
+(type vendor_qvrd)
+(type vendor_seempd)
+(type vendor_usta_app_service)
+(type vendor_vpsservice)
+(type vendor_wfd_app)
+(type vendor_wfdservice)
+(type vendor_sigmahal_qti)
+(type vendor_dataservice_app)
+(type vendor_qesdk_service)
+(type vendor_qcc_authmgr_app)
+(type vendor_qcc_lmtp_app)
+(type vendor_qcc_netstat_app)
+(type vendor_qvirtmgr)
+(type vendor_hal_displayconfig_service)
+(type vendor_hal_telephony_service)
+(type vendor_persist_tcm_prop)
+(type vendor_persist_rcs_prop)
+(typeattribute vendor_smcinvoke_device_32_0)
+(typeattribute vendor_qtelephony_32_0)
+(typeattribute vendor_dpmd_32_0)
+(typeattribute vendor_dun-server_32_0)
+(typeattribute vendor_elabel_data_file_32_0)
+(typeattribute vendor_dpmtcm_socket_32_0)
+(typeattribute vendor_seempdw_socket_32_0)
+(typeattribute vendor_fm_app_32_0)
+(typeattribute vendor_hal_atfwd_hwservice_32_0)
+(typeattribute vendor_sigmahal_hwservice_32_0)
+(typeattribute vendor_qccsyshal_hwservice_32_0)
+(typeattribute vendor_location_app_32_0)
+(typeattribute vendor_mmi_sys_32_0)
+(typeattribute vendor_perfservice_32_0)
+(typeattribute vendor_persist_dpm_prop_32_0)
+(typeattribute vendor_persist_camera_prop_32_0)
+(typeattribute vendor_bt_prop_32_0)
+(typeattribute vendor_sys_video_prop_32_0)
+(typeattribute vendor_wlc_prop_32_0)
+(typeattribute vendor_qcc_app_32_0)
+(typeattribute vendor_qcc_trd_32_0)
+(typeattribute vendor_qcc_utils_app_32_0)
+(typeattribute vendor_qspmsvc_32_0)
+(typeattribute qti-testscripts_32_0)
+(typeattribute vendor_qvrd_32_0)
+(typeattribute vendor_seempd_32_0)
+(typeattribute vendor_usta_app_service_32_0)
+(typeattribute vendor_vpsservice_32_0)
+(typeattribute vendor_wfd_app_32_0)
+(typeattribute vendor_wfdservice_32_0)
+(typeattribute vendor_sigmahal_qti_32_0)
+(typeattribute vendor_dataservice_app_32_0)
+(typeattribute vendor_qesdk_service_32_0)
+(typeattribute vendor_qcc_authmgr_app_32_0)
+(typeattribute vendor_qcc_lmtp_app_32_0)
+(typeattribute vendor_qcc_netstat_app_32_0)
+(typeattribute vendor_qvirtmgr_32_0)
+(typeattribute vendor_hal_displayconfig_service_32_0)
+(typeattribute vendor_hal_telephony_service_32_0)
+(typeattribute vendor_persist_tcm_prop_32_0)
+(typeattribute vendor_persist_rcs_prop_30_0)
+(typeattribute vendor_hal_systemhelper)
+(typeattribute vendor_hal_systemhelper_client)
+(typeattribute vendor_hal_systemhelper_server)
+(type vendor_hal_systemhelper_hwservice)
+(type vendor_display_notch_prop)
+(type vendor_sys_qti_display)
+(type vendor_systemhelper_app)
+(typeattribute vendor_hal_systemhelper_hwservice_32_0)
+(typeattribute vendor_display_notch_prop_32_0)
+(typeattribute vendor_sys_qti_display_32_0)
+(typeattribute vendor_systemhelper_app_32_0)
diff --git a/frameworks/base/core/api/current.txt b/frameworks/base/core/api/current.txt
index c8a43db2f9..ecc1482006 100644
--- a/frameworks/base/core/api/current.txt
+++ b/frameworks/base/core/api/current.txt
@@ -8924,6 +8924,23 @@ package android.appwidget {
 
 }
 
+package android.bean {
+
+  public final class Person implements android.os.Parcelable {
+    ctor public Person();
+    ctor public Person(@NonNull String, int);
+    method public int describeContents();
+    method public int getAge();
+    method @NonNull public String getName();
+    method public void readFromParcel(@NonNull android.os.Parcel);
+    method public void setAge(int);
+    method public void setName(@NonNull String);
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.bean.Person> CREATOR;
+  }
+
+}
+
 package android.companion {
 
   public final class AssociationInfo implements android.os.Parcelable {
@@ -9774,6 +9791,7 @@ package android.content {
     field public static final String APP_SEARCH_SERVICE = "app_search";
     field public static final String AUDIO_SERVICE = "audio";
     field public static final String BATTERY_SERVICE = "batterymanager";
+    field public static final String BEAN_SERVICE = "bean";
     field public static final int BIND_ABOVE_CLIENT = 8; // 0x8
     field public static final int BIND_ADJUST_WITH_ACTIVITY = 128; // 0x80
     field public static final int BIND_ALLOW_OOM_MANAGEMENT = 16; // 0x10
diff --git a/frameworks/base/core/java/android/app/SystemServiceRegistry.java b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
index 40192836e0..7ba20fe120 100644
--- a/frameworks/base/core/java/android/app/SystemServiceRegistry.java
+++ b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
@@ -235,6 +235,8 @@ import android.view.textservice.TextServicesManager;
 import android.view.translation.ITranslationManager;
 import android.view.translation.TranslationManager;
 import android.view.translation.UiTranslationManager;
+import android.bean.IBeanManager;
+import android.bean.BeanManager;
 
 import com.android.internal.app.IAppOpsService;
 import com.android.internal.app.IBatteryStats;
@@ -282,10 +284,25 @@ public final class SystemServiceRegistry {
         //CHECKSTYLE:OFF IndentationCheck
         registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
                 new CachedServiceFetcher<AccessibilityManager>() {
-            @Override
-            public AccessibilityManager createService(ContextImpl ctx) {
-                return AccessibilityManager.getInstance(ctx);
-            }});
+                    @Override
+                    public AccessibilityManager createService(ContextImpl ctx) {
+                        return AccessibilityManager.getInstance(ctx);
+                    }});
+
+        /*   20250520  */
+        registerService(Context.BEAN_SERVICE, BeanManager.class,
+                // 这里是CachedServiceFetcher抽象类的实现
+                new CachedServiceFetcher<BeanManager>() {
+                    // 抽象方法createService的实现,我们看到其实很简单,就是通过ServiceManager获取服务的binder代理对象
+                    @Override
+                    public BeanManager createService(ContextImpl ctx) throws ServiceNotFoundException {
+                        IBinder b = ServiceManager.getServiceOrThrow(Context.BEAN_SERVICE);
+                        IBeanManager service = IBeanManager.Stub.asInterface(b);
+                        // 以IBeanManager和Context为参数构造BeanManager,这样我们通过Context.getSysetemService(Context.BEAN_SERVICE)
+                        // 返回的对象就是BeanManager
+                        return new BeanManager(service, ctx);
+                    }});
+
 
         registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class,
                 new CachedServiceFetcher<CaptioningManager>() {
diff --git a/frameworks/base/core/java/android/bean/BeanManager.java b/frameworks/base/core/java/android/bean/BeanManager.java
new file mode 100644
index 0000000000..7535f88d7b
--- /dev/null
+++ b/frameworks/base/core/java/android/bean/BeanManager.java
@@ -0,0 +1,50 @@
+package android.bean;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.os.RemoteException;
+import android.util.Log;
+
+/**
+* {@hide}
+*/
+public class BeanManager {
+
+    private static final String TAG = "BeanManager";
+    private Context mContext;
+    private IBeanManager mService;
+
+    public BeanManager(IBeanManager service, Context ctx) {
+        Log.d(TAG, "new BeanManager");
+        mService = service;
+        mContext = ctx;
+    }
+
+    public void sayHello(@NonNull String words) {
+      Log.d(TAG, "sayHello words: " + words);
+        if (mService == null) {
+            Log.d(TAG, "sayHello mService is null!!!");
+            return;
+        }
+
+        try {
+            mService.sayHello(words);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    public void sayHelloTo(@NonNull Person person, @NonNull String words) {
+        Log.d(TAG, "sayHelloTo " + person.getName() + ": " + words);
+          if (mService == null) {
+              Log.d(TAG, "sayHelloTo mService is null!!!");
+              return;
+          }
+
+          try {
+              mService.sayHelloTo(person, words);
+          } catch (RemoteException e) {
+              throw e.rethrowFromSystemServer();
+          }
+      }
+}
diff --git a/frameworks/base/core/java/android/bean/IBeanManager.aidl b/frameworks/base/core/java/android/bean/IBeanManager.aidl
new file mode 100644
index 0000000000..48a3b22107
--- /dev/null
+++ b/frameworks/base/core/java/android/bean/IBeanManager.aidl
@@ -0,0 +1,16 @@
+package android.bean;
+
+import android.bean.Person;
+
+/**
+ * {@hide}
+ */
+interface IBeanManager {
+    void sayHello(String words);
+    // 自定义类型前面必须加上in或者out或者inout标识符
+    // in:    表示参数只能由客户端传递到服务端,基本类型默认只支持in修饰符
+    // out:   表示参数只能由服务端传递到客户端,服务端如果修改了参数对象的值
+    //        那么客户端的值也会改变,但是服务端无法读取客户端对象的值
+    // inout: 表示参数可以双向传递
+    void sayHelloTo(in Person person, String words);
+}
diff --git a/frameworks/base/core/java/android/bean/Person.aidl b/frameworks/base/core/java/android/bean/Person.aidl
new file mode 100644
index 0000000000..a4518f1601
--- /dev/null
+++ b/frameworks/base/core/java/android/bean/Person.aidl
@@ -0,0 +1,3 @@
+package android.bean;
+
+parcelable Person;
diff --git a/frameworks/base/core/java/android/bean/Person.java b/frameworks/base/core/java/android/bean/Person.java
new file mode 100644
index 0000000000..474cd897a2
--- /dev/null
+++ b/frameworks/base/core/java/android/bean/Person.java
@@ -0,0 +1,74 @@
+package android.bean;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public final class Person implements Parcelable {
+    // 注意定义成员变量的顺序,后面读取和写入都必须按这个顺序
+    private String mName;
+    private int mAge;
+
+    public Person() {
+    }
+
+    public Person(@NonNull String name, int age) {
+        this.mName = name;
+        this.mAge = age;
+    }
+
+    private Person(@NonNull Parcel in) {
+        // 注意定义成员变量的顺序
+        this.mName = in.readString();
+        this.mAge = in.readInt();
+    }
+
+    @NonNull
+    public String getName() {
+        return mName;
+    }
+
+    public int getAge() {
+        return mAge;
+    }
+
+    public void setName(@NonNull String name) {
+        mName = name;
+    }
+
+    public void setAge(int age) {
+        mAge = age;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    // 
+    @Override
+    public void writeToParcel(@NonNull Parcel dest, int flags) {
+        // 注意定义成员变量的顺序
+        dest.writeString(this.mName);
+        dest.writeInt(this.mAge);
+    }
+
+    public void readFromParcel(@NonNull Parcel source) {
+        // 注意定义成员变量的顺序
+        this.mName = source.readString();
+        this.mAge = source.readInt();
+    }
+
+    @NonNull
+    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
+        @Override
+        public Person createFromParcel(@NonNull Parcel source) {
+            return new Person(source);
+        }
+
+        @Override
+        public Person[] newArray(int size) {
+            return new Person[size];
+        }
+    };
+}
diff --git a/frameworks/base/core/java/android/content/Context.java b/frameworks/base/core/java/android/content/Context.java
index fce23cf681..831c46e36f 100644
--- a/frameworks/base/core/java/android/content/Context.java
+++ b/frameworks/base/core/java/android/content/Context.java
@@ -3809,6 +3809,7 @@ public abstract class Context {
             ACCOUNT_SERVICE,
             ACTIVITY_SERVICE,
             ALARM_SERVICE,
+            BEAN_SERVICE,
             NOTIFICATION_SERVICE,
             ACCESSIBILITY_SERVICE,
             CAPTIONING_SERVICE,
@@ -4247,6 +4248,17 @@ public abstract class Context {
      */
     public static final String ACTIVITY_SERVICE = "activity";
 
+    /**
+     *  
+     * Use with {@link #getSystemService(String)} to retrieve a
+     * {@link android.bean.BeanManager} for interacting with the global
+     * system state.
+     *
+     * @see #getSystemService(String)
+     * @see android.bean.BeanManager
+     */
+    public static final String BEAN_SERVICE = "bean";
+
     /**
      * Use with {@link #getSystemService(String)} to retrieve a
      * {@link android.app.ActivityTaskManager} for interacting with the global system state.
diff --git a/frameworks/base/services/core/java/com/android/server/bean/BeanManagerService.java b/frameworks/base/services/core/java/com/android/server/bean/BeanManagerService.java
new file mode 100644
index 0000000000..4f5749b91e
--- /dev/null
+++ b/frameworks/base/services/core/java/com/android/server/bean/BeanManagerService.java
@@ -0,0 +1,71 @@
+package com.android.server.bean;
+
+import android.bean.IBeanManager;
+import android.bean.Person;
+import android.content.Context;
+import android.util.Log;
+
+import com.android.server.SystemService;
+import com.android.server.Watchdog;
+
+public class BeanManagerService extends IBeanManager.Stub
+        implements Watchdog.Monitor {
+
+    static final String TAG = "BeanManagerService";
+
+    final Context mContext;
+
+    public BeanManagerService(Context systemContext) {
+        Log.d(TAG, "BeanManagerService");
+        mContext = systemContext;
+        Watchdog.getInstance().addMonitor(this);
+    }
+
+    @Override
+    public void sayHello(String words) {
+        Log.d(TAG, " sayHello : " + words);
+    }
+
+    @Override
+    public void sayHelloTo(Person person, String words) {
+        Log.d(TAG, " sayHello " + person.getName() + ": " + words);
+    }
+
+    public void systemReady() {
+        Log.d(TAG, " systemReady ");
+    }
+
+    /** In this method we try to acquire our lock to make sure that we have not deadlocked */
+    public void monitor() {
+        synchronized (this) { }
+    }
+
+    // 这里我们定义了一个内部类继承SystemService,这样便于方便system_server统一管理启动服务
+    // 系统启动时会回调所有继承了SystemService的类的函数,比如onStart,onBootPhase等等。
+    public static final class Lifecycle extends SystemService {
+        static final String TAG = "BeanManagerService.Lifecycle";
+
+        private BeanManagerService mService;
+
+        public Lifecycle(Context context) {
+            super(context);
+            // 在这里构造我们的BeanManagerService对象
+            mService = new BeanManagerService(context);
+        }
+
+        @Override
+        public void onStart() {
+            Log.d(TAG, "onStart");
+            // 这里最终调用ServiceManager.addService
+            publishBinderService(Context.BEAN_SERVICE, mService);
+        }
+
+        @Override
+        public void onBootPhase(int phase) {
+            Log.d(TAG, "onBootPhase");
+            if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
+                mService.systemReady();
+            }
+        }
+    }
+}
diff --git a/frameworks/base/services/java/com/android/server/SystemServer.java b/frameworks/base/services/java/com/android/server/SystemServer.java
index ce91cd2cc8..13cb7e09cf 100644
--- a/frameworks/base/services/java/com/android/server/SystemServer.java
+++ b/frameworks/base/services/java/com/android/server/SystemServer.java
@@ -111,6 +111,7 @@ import com.android.server.appbinding.AppBindingService;
 import com.android.server.art.ArtManagerLocal;
 import com.android.server.attention.AttentionManagerService;
 import com.android.server.audio.AudioService;
+import com.android.server.bean.BeanManagerService;
 import com.android.server.biometrics.AuthService;
 import com.android.server.biometrics.BiometricService;
 import com.android.server.biometrics.sensors.face.FaceService;
@@ -1404,7 +1405,7 @@ public final class SystemServer implements Dumpable {
      * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
      */
     private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
-        t.traceBegin("startOtherServices");
+        t.traceBegin("c LA.QSSI, startOtherServices");
         mSystemServiceManager.updateOtherServicesStartIndex();
 
         final Context context = mSystemContext;
@@ -1473,6 +1474,14 @@ public final class SystemServer implements Dumpable {
                 }
             }, SECONDARY_ZYGOTE_PRELOAD);
 
+            // 
+            Slog.d(TAG, "  test add BeanManagerService.");
+            t.traceBegin("  BeanManagerService");
+            // 这里最终会通过反射的方法调用BeanManagerService.Lifecycle的构造函数
+            mSystemServiceManager.startService(BeanManagerService.Lifecycle.class);
+            t.traceEnd();
+
+
             t.traceBegin("StartKeyAttestationApplicationIdProviderService");
             ServiceManager.addService("sec_key_att_app_id_provider",
                     new KeyAttestationApplicationIdProviderService(context));
diff --git a/system/sepolicy/prebuilts/api/28.0/private/service_contexts b/system/sepolicy/prebuilts/api/28.0/private/service_contexts
index 5ec45a23ef..80f05057a6 100644
--- a/system/sepolicy/prebuilts/api/28.0/private/service_contexts
+++ b/system/sepolicy/prebuilts/api/28.0/private/service_contexts
@@ -185,4 +185,5 @@ wificond                                  u:object_r:wificond_service:s0
 wifiaware                                 u:object_r:wifiaware_service:s0
 wifirtt                                   u:object_r:rttmanager_service:s0
 window                                    u:object_r:window_service:s0
+bean                                      u:object_r:bean_service:s0
 *                                         u:object_r:default_android_service:s0
diff --git a/system/sepolicy/prebuilts/api/28.0/private/system_server.te b/system/sepolicy/prebuilts/api/28.0/private/system_server.te
index 8b1b4df6e6..aa7b791b73 100644
--- a/system/sepolicy/prebuilts/api/28.0/private/system_server.te
+++ b/system/sepolicy/prebuilts/api/28.0/private/system_server.te
@@ -866,3 +866,5 @@ neverallow system_server { domain -system_server }:process ptrace;
 # CAP_SYS_RESOURCE was traditionally needed for sensitive /proc/PID
 # file read access. However, that is now unnecessary (b/34951864)
 neverallow system_server system_server:global_capability_class_set sys_resource;
+
+allow system_server bean_service:service_manager add;
diff --git a/system/sepolicy/prebuilts/api/28.0/public/system_server.te b/system/sepolicy/prebuilts/api/28.0/public/system_server.te
index 805d6175d6..0592293f0b 100644
--- a/system/sepolicy/prebuilts/api/28.0/public/system_server.te
+++ b/system/sepolicy/prebuilts/api/28.0/public/system_server.te
@@ -3,3 +3,4 @@
 # Most of the framework services run in this process.
 #
 type system_server, domain;
+type bean_service, service_manager_type;
diff --git a/system/sepolicy/prebuilts/api/29.0/private/service_contexts b/system/sepolicy/prebuilts/api/29.0/private/service_contexts
index 96d553bf49..a397671972 100644
--- a/system/sepolicy/prebuilts/api/29.0/private/service_contexts
+++ b/system/sepolicy/prebuilts/api/29.0/private/service_contexts
@@ -219,4 +219,5 @@ wificond                                  u:object_r:wificond_service:s0
 wifiaware                                 u:object_r:wifiaware_service:s0
 wifirtt                                   u:object_r:rttmanager_service:s0
 window                                    u:object_r:window_service:s0
+bean                                      u:object_r:bean_service:s0
 *                                         u:object_r:default_android_service:s0
diff --git a/system/sepolicy/prebuilts/api/29.0/private/system_server.te b/system/sepolicy/prebuilts/api/29.0/private/system_server.te
index 5f60674b0e..8cb7f63464 100644
--- a/system/sepolicy/prebuilts/api/29.0/private/system_server.te
+++ b/system/sepolicy/prebuilts/api/29.0/private/system_server.te
@@ -1044,3 +1044,5 @@ neverallow {
   -system_server
 } password_slot_metadata_file:notdevfile_class_set ~{ relabelto getattr };
 neverallow { domain -init -system_server } password_slot_metadata_file:notdevfile_class_set *;
+
+allow system_server bean_service:service_manager add;
diff --git a/system/sepolicy/prebuilts/api/29.0/public/service.te b/system/sepolicy/prebuilts/api/29.0/public/service.te
index a2193d0edb..d4c5f7d737 100644
--- a/system/sepolicy/prebuilts/api/29.0/public/service.te
+++ b/system/sepolicy/prebuilts/api/29.0/public/service.te
@@ -187,6 +187,7 @@ type wifiaware_service, app_api_service, system_server_service, service_manager_
 type window_service, system_api_service, system_server_service, service_manager_type;
 type inputflinger_service, system_api_service, system_server_service, service_manager_type;
 type wpantund_service, system_api_service, service_manager_type;
+type bean_service,service_manager_type;
 
 ###
 ### Neverallow rules
diff --git a/system/sepolicy/prebuilts/api/30.0/private/service_contexts b/system/sepolicy/prebuilts/api/30.0/private/service_contexts
index 5c6f1a4766..2c8ee79c2f 100644
--- a/system/sepolicy/prebuilts/api/30.0/private/service_contexts
+++ b/system/sepolicy/prebuilts/api/30.0/private/service_contexts
@@ -247,4 +247,5 @@ wifinl80211                               u:object_r:wifinl80211_service:s0
 wifiaware                                 u:object_r:wifiaware_service:s0
 wifirtt                                   u:object_r:rttmanager_service:s0
 window                                    u:object_r:window_service:s0
+bean                                      u:object_r:bean_service:s0
 *                                         u:object_r:default_android_service:s0
diff --git a/system/sepolicy/prebuilts/api/30.0/private/system_server.te b/system/sepolicy/prebuilts/api/30.0/private/system_server.te
index 00828274d6..c965ba3eb0 100644
--- a/system/sepolicy/prebuilts/api/30.0/private/system_server.te
+++ b/system/sepolicy/prebuilts/api/30.0/private/system_server.te
@@ -1170,3 +1170,4 @@ neverallow system_server self:perf_event ~{ open write cpu kernel };
 
 # Do not allow any domain other than init or system server to set the property
 neverallow { domain -init -system_server } socket_hook_prop:property_service set;
+allow system_server bean_service:service_manager add;
diff --git a/system/sepolicy/prebuilts/api/30.0/public/service.te b/system/sepolicy/prebuilts/api/30.0/public/service.te
index f27772eabb..05540e0a79 100644
--- a/system/sepolicy/prebuilts/api/30.0/public/service.te
+++ b/system/sepolicy/prebuilts/api/30.0/public/service.te
@@ -205,6 +205,7 @@ type inputflinger_service, system_api_service, system_server_service, service_ma
 type wpantund_service, system_api_service, service_manager_type;
 type tethering_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
 type emergency_affordance_service, system_server_service, service_manager_type;
+type bean_service,service_manager_type;
 
 ###
 ### HAL Services
diff --git a/system/sepolicy/prebuilts/api/31.0/private/service_contexts b/system/sepolicy/prebuilts/api/31.0/private/service_contexts
index 3fd342b9be..71f3be55f0 100644
--- a/system/sepolicy/prebuilts/api/31.0/private/service_contexts
+++ b/system/sepolicy/prebuilts/api/31.0/private/service_contexts
@@ -307,4 +307,5 @@ wifinl80211                               u:object_r:wifinl80211_service:s0
 wifiaware                                 u:object_r:wifiaware_service:s0
 wifirtt                                   u:object_r:rttmanager_service:s0
 window                                    u:object_r:window_service:s0
+bean                                      u:object_r:bean_service:s0
 *                                         u:object_r:default_android_service:s0
diff --git a/system/sepolicy/prebuilts/api/31.0/private/system_server.te b/system/sepolicy/prebuilts/api/31.0/private/system_server.te
index 73301c1e9f..b046c5c0f8 100644
--- a/system/sepolicy/prebuilts/api/31.0/private/system_server.te
+++ b/system/sepolicy/prebuilts/api/31.0/private/system_server.te
@@ -1409,3 +1409,4 @@ neverallowxperm { domain -system_server } binder_device:chr_file ioctl { BINDER_
 # Only system server can write the font files.
 neverallow { domain -init -system_server } font_data_file:file no_w_file_perms;
 neverallow { domain -init -system_server } font_data_file:dir no_w_dir_perms;
+allow system_server bean_service:service_manager add;
diff --git a/system/sepolicy/prebuilts/api/31.0/public/service.te b/system/sepolicy/prebuilts/api/31.0/public/service.te
index ba7837d562..7da8ae30fa 100644
--- a/system/sepolicy/prebuilts/api/31.0/public/service.te
+++ b/system/sepolicy/prebuilts/api/31.0/public/service.te
@@ -268,6 +268,7 @@ type hal_secureclock_service, vendor_service, protected_service, service_manager
 type hal_sharedsecret_service, vendor_service, protected_service, service_manager_type;
 type hal_vibrator_service, vendor_service, protected_service, service_manager_type;
 type hal_weaver_service, vendor_service, protected_service, service_manager_type;
+type bean_service,service_manager_type;
 
 ###
 ### Neverallow rules
diff --git a/system/sepolicy/prebuilts/api/32.0/private/service_contexts b/system/sepolicy/prebuilts/api/32.0/private/service_contexts
index 3fd342b9be..71f3be55f0 100644
--- a/system/sepolicy/prebuilts/api/32.0/private/service_contexts
+++ b/system/sepolicy/prebuilts/api/32.0/private/service_contexts
@@ -307,4 +307,5 @@ wifinl80211                               u:object_r:wifinl80211_service:s0
 wifiaware                                 u:object_r:wifiaware_service:s0
 wifirtt                                   u:object_r:rttmanager_service:s0
 window                                    u:object_r:window_service:s0
+bean                                      u:object_r:bean_service:s0
 *                                         u:object_r:default_android_service:s0
diff --git a/system/sepolicy/prebuilts/api/32.0/private/system_server.te b/system/sepolicy/prebuilts/api/32.0/private/system_server.te
index 6aca000385..c9ae3aa3ec 100644
--- a/system/sepolicy/prebuilts/api/32.0/private/system_server.te
+++ b/system/sepolicy/prebuilts/api/32.0/private/system_server.te
@@ -1411,3 +1411,4 @@ neverallowxperm { domain -system_server } binder_device:chr_file ioctl { BINDER_
 # Only system server can write the font files.
 neverallow { domain -init -system_server } font_data_file:file no_w_file_perms;
 neverallow { domain -init -system_server } font_data_file:dir no_w_dir_perms;
+allow system_server bean_service:service_manager add;
diff --git a/system/sepolicy/prebuilts/api/32.0/public/service.te b/system/sepolicy/prebuilts/api/32.0/public/service.te
index ba7837d562..7da8ae30fa 100644
--- a/system/sepolicy/prebuilts/api/32.0/public/service.te
+++ b/system/sepolicy/prebuilts/api/32.0/public/service.te
@@ -268,6 +268,7 @@ type hal_secureclock_service, vendor_service, protected_service, service_manager
 type hal_sharedsecret_service, vendor_service, protected_service, service_manager_type;
 type hal_vibrator_service, vendor_service, protected_service, service_manager_type;
 type hal_weaver_service, vendor_service, protected_service, service_manager_type;
+type bean_service,service_manager_type;
 
 ###
 ### Neverallow rules
diff --git a/system/sepolicy/prebuilts/api/33.0/private/service_contexts b/system/sepolicy/prebuilts/api/33.0/private/service_contexts
index 72fa16629e..107139f764 100644
--- a/system/sepolicy/prebuilts/api/33.0/private/service_contexts
+++ b/system/sepolicy/prebuilts/api/33.0/private/service_contexts
@@ -384,4 +384,5 @@ wifinl80211                               u:object_r:wifinl80211_service:s0
 wifiaware                                 u:object_r:wifiaware_service:s0
 wifirtt                                   u:object_r:rttmanager_service:s0
 window                                    u:object_r:window_service:s0
+bean                                      u:object_r:bean_service:s0
 *                                         u:object_r:default_android_service:s0
diff --git a/system/sepolicy/prebuilts/api/33.0/private/system_server.te b/system/sepolicy/prebuilts/api/33.0/private/system_server.te
index 0f72c7fcfe..15e252f2d8 100644
--- a/system/sepolicy/prebuilts/api/33.0/private/system_server.te
+++ b/system/sepolicy/prebuilts/api/33.0/private/system_server.te
@@ -1486,3 +1486,5 @@ neverallowxperm { domain -system_server } binder_device:chr_file ioctl { BINDER_
 # Only system server can write the font files.
 neverallow { domain -init -system_server } font_data_file:file no_w_file_perms;
 neverallow { domain -init -system_server } font_data_file:dir no_w_dir_perms;
+
+allow system_server bean_service:service_manager add;
diff --git a/system/sepolicy/prebuilts/api/33.0/public/service.te b/system/sepolicy/prebuilts/api/33.0/public/service.te
index e862b405fe..2d0f7a9eb3 100644
--- a/system/sepolicy/prebuilts/api/33.0/public/service.te
+++ b/system/sepolicy/prebuilts/api/33.0/public/service.te
@@ -310,6 +310,7 @@ type hal_weaver_service, vendor_service, protected_service, hal_service_type, se
 type hal_nlinterceptor_service, vendor_service, protected_service, hal_service_type, service_manager_type;
 type hal_wifi_hostapd_service, vendor_service, protected_service, hal_service_type, service_manager_type;
 type hal_wifi_supplicant_service, vendor_service, protected_service, hal_service_type, service_manager_type;
+type bean_service,service_manager_type;
 
 ###
 ### Neverallow rules
diff --git a/system/sepolicy/private/service_contexts b/system/sepolicy/private/service_contexts
index 72fa16629e..107139f764 100644
--- a/system/sepolicy/private/service_contexts
+++ b/system/sepolicy/private/service_contexts
@@ -384,4 +384,5 @@ wifinl80211                               u:object_r:wifinl80211_service:s0
 wifiaware                                 u:object_r:wifiaware_service:s0
 wifirtt                                   u:object_r:rttmanager_service:s0
 window                                    u:object_r:window_service:s0
+bean                                      u:object_r:bean_service:s0
 *                                         u:object_r:default_android_service:s0
diff --git a/system/sepolicy/private/system_server.te b/system/sepolicy/private/system_server.te
index 0f72c7fcfe..15e252f2d8 100644
--- a/system/sepolicy/private/system_server.te
+++ b/system/sepolicy/private/system_server.te
@@ -1486,3 +1486,5 @@ neverallowxperm { domain -system_server } binder_device:chr_file ioctl { BINDER_
 # Only system server can write the font files.
 neverallow { domain -init -system_server } font_data_file:file no_w_file_perms;
 neverallow { domain -init -system_server } font_data_file:dir no_w_dir_perms;
+
+allow system_server bean_service:service_manager add;
diff --git a/system/sepolicy/public/service.te b/system/sepolicy/public/service.te
index e862b405fe..2d0f7a9eb3 100644
--- a/system/sepolicy/public/service.te
+++ b/system/sepolicy/public/service.te
@@ -310,6 +310,7 @@ type hal_weaver_service, vendor_service, protected_service, hal_service_type, se
 type hal_nlinterceptor_service, vendor_service, protected_service, hal_service_type, service_manager_type;
 type hal_wifi_hostapd_service, vendor_service, protected_service, hal_service_type, service_manager_type;
 type hal_wifi_supplicant_service, vendor_service, protected_service, hal_service_type, service_manager_type;
+type bean_service,service_manager_type;
 
 ###
 ### Neverallow rules
-- 
2.17.1


--