基於android N添加服務使其成爲系統服務

部分一

一 我們首先需要寫好自己的服務

frameworks/base/core/java/android/content/dyna/DynaSystemManager.java
frameworks/base/core/java/android/content/dyna/IDynaSystemManager.aidl
frameworks/base/services/core/java/com/android/server/dyna/DynaSystemService.java
這一部分可根據業務需求實現,真正實現是在DynaSystemService中

二 我們需要去註冊我們的服務

frameworks/base/core/java/android/app/SystemServiceRegistry.java

--- a/frameworks/base/core/java/android/app/SystemServiceRegistry.java
+++ b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
@@ -158,6 +158,11 @@ import com.mediatek.usp.UspManager;
 
 import java.util.HashMap;
 
+//weiyw add start
+import android.content.dyna.DynaSystemManager;
+import android.content.dyna.IDynaSystemManager;
+//weiyw add end
+
 /**
  * Manages all of the system services that can be returned by {@link Context#getSystemService}.
  * Used by {@link ContextImpl}.
@@ -743,6 +748,16 @@ final class SystemServiceRegistry {
                 return new MediaProjectionManager(ctx);
             }});
 
+        //weiyw add start
+        registerService(Context.DYNASYSTEM_SERVICE, DynaSystemManager.class,
+            new CachedServiceFetcher<DynaSystemManager>(){
+                @Override
+                public DynaSystemManager createService(ContextImpl ctx) {
+                 IBinder b = ServiceManager.getService(Context.DYNASYSTEM_SERVICE);
+                return new DynaSystemManager(ctx, IDynaSystemManager.Stub.asInterface(b));
+            }});
+        //weiyw add end
+
         registerService(Context.APPWIDGET_SERVICE, AppWidgetManager.class,
                 new CachedServiceFetcher<AppWidgetManager>() {
             @Override

在此處我們用到了Context.DYNASYSTEM_SERVICE,所以我們需要去定義一下
frameworks/base/core/java/android/content/Context.java

+    /*
+    *weiyw add
+    */
+    public static final String DYNASYSTEM_SERVICE = "dynasystem";

三 需要將我們的服務託管給SystemServer

frameworks/base/services/java/com/android/server/SystemServer.java

 import com.mediatek.suppression.service.SuppressionService;
 /// @}
 
+import com.android.server.dyna.DynaSystemService;
+
 public final class SystemServer {
     private static final String TAG = "SystemServer";
 
@@ -647,6 +649,9 @@ public final class SystemServer {
         ConsumerIrService consumerIr = null;
         MmsServiceBroker mmsService = null;
         HardwarePropertiesManagerService hardwarePropertiesService = null;
+        //weiyw add start
+        DynaSystemService dynasystem = null;
+        //weiyw add end
 
         /// M: add for hdmi feature
         MtkHdmiManagerService hdmiManager = null;
@@ -725,6 +730,16 @@ public final class SystemServer {
             mSystemServiceManager.startService(AlarmManagerService.class);
             Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
 
+            //weiyw add start
+            try {
+                Slog.i(TAG, "DynaSystemService");
+                dynasystem = new DynaSystemService(context);
+                ServiceManager.addService(Context.DYNASYSTEM_SERVICE,dynasystem);
+            } catch (Throwable e) {
+                reportWtf("starting DynaSystemService", e);
+            }
+            //weiyw add end
+
             traceBeginAndSlog("InitWatchdog");
             final Watchdog watchdog = Watchdog.getInstance();
             watchdog.init(context, mActivityManagerService);

四 需要修改Android.mk將我們的代碼添加編譯

frameworks/base/Android.mk

 	core/java/android/bluetooth/IBluetoothGatt.aidl \
 	core/java/android/bluetooth/IBluetoothGattCallback.aidl \
 	core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \
+	core/java/android/content/dyna/IDynaSystemManager.aidl \
 	core/java/android/content/IClipboard.aidl \
 	core/java/android/content/IContentService.aidl \
 	core/java/android/content/IIntentReceiver.aidl \

主要是添加aidl文件,java文件會默認包含的

五 添加相關selinux權限

這部分主要涉及文件
system/sepolicy/service.te
system/sepolicy/service_contexts
system/sepolicy/system_server.te

在service.te 中定義

type dynasystem_service,system_api_service,system_server_service,service_manager_type;

在service_contexts 中關聯

dynasystem                                u:object_r:dynasystem_service:s0

在system_server.te中賦予權限

allow system_server gas_srv_service:service_manager find;

基本就這些了,目前還沒發現有什麼問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章