在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
--