1. 程式人生 > >android系統裁減之服務裁減

android系統裁減之服務裁減

android系統服務分本地(native)服務和java服務。

1、本地(native)服務裁減

很明顯:本地(native)服務是基於C/C++實現的,本地服務的啟動都在init.rc中通過指令碼的方式控制,如surfaceflinger這個服務的啟動,

service surfaceflinger /system/bin/surfaceflinger
            class core
            user system
            group graphics drmrpc
            onrestart restart zygote
本地(native)服務由ServiceManager註冊和管理,如下所示:
sp<IServiceManager> sm(defaultServiceManager);
sm->addService(String16(SurfaceFlinger::getServiceName), flinger, false);
所以對於本地服務的裁減其實只要將相應的服務從init.rc中刪除,同時遮蔽掉相應的原始碼即可。

2、java服務裁減

系統中大部分的服務都以java服務的方法存在,可以在adb shell下通過如下命令檢視有哪些服務在後臺執行:

<strong>service list</strong>
java服務大部分都在frameworks/base/services/java/com/android/server/SystemServer.java中進行新增,在這裡有如下幾個方法:

startBootstrapServices:在這裡啟動了一些系統啟動依賴的服務,如:InstallerService、ActivityManagerService、PowerManagerService等等。

startCoreServices:在這裡啟動了一些如:LightsService、BatteryService、WebViewUpdateService等

startOtherServices:這裡啟動的服務就比較多了,系統開機耗時也主要在這裡,如:TelephonyRegistry、AccountManagerService、VibratorService、FingerprintService、LauncherAppsService等。

所有的java服務都通過ServiceManager註冊和管理,對於要裁減掉的java服務,只需要在這裡不讓其註冊就可以了,但對於系統依賴度很高的一些服務,像TelephonyRegistry,單純的不讓其註冊是行不通的,系統啟動之後會報錯誤,需要另行處理(後面再說)。

對於一些系統依賴不是很高的服務,可簡單的通過如下方法裁減掉,如VibratorService

boolean disableVibrator = SystemProperties.getBoolean("config.disable_vibrator", false);

if(!disableVibrator){
    Slog.i(TAG, "Vibrator Service");<pre name="code" class="plain">service check vibrator

vibrator = new VibratorService(context); ServiceManager.addService("vibrator", vibrator); } 然後在對應的vendor中加入如下properties屬性值即可,
#Xandy add only for system service config
PRODUCT_PROPERTY_OVERRIDES += \
      config.disable_vibrator = true

刪掉system目錄下的build.prop,重新編譯system,燒錄啟動系統之後,執行如下命令

service check vibrator
得到如下提示:
<strong>service check vibrator
Service vibrator: not found</strong>