系统精简归总

文章目录

  • 1. 前言
  • 2. apk的裁剪
  • 3. 服务的裁剪
  • 4. 运行库的裁剪
  • 5. 硬件抽象层的裁剪
  • 6. 补充裁剪项
  • 7. 后记

1. 前言

先来看一下android的系统架构:
系统精简归总_第1张图片
图上虚线所划定的范畴内对Android系统进行裁剪,具体可分为以下几个方面:

应用程序层:在这一层的工作是针对系统原生的应用程序进行裁剪,通过对不必要的应用程序进
行裁剪,可以加速包扫描的过程,从而使得系统启动速度加快:并且因为减少了驻留在内存中的
应用程序,使得系统可以更高效的使用内存。

应用程序框架层:应用框架层由Java系统服务组成,通过对不必要的Java系统服务的裁剪可以加
速SystemServer进程init阶段的初始化工作,使得系统启动速度加快。

运行库层:运行库层里主要包括两类库文件,第一类是通过Android系统本地服务编译出来的库
文件,如SurfaceFlinger、AudioFlinger等服务的库文件。第二类是第三方提供的库文件,如libc、
webkit等库文件。通过裁剪本地系统服务编译而来的库文件,可以加速initl阶段的初始化的时间,
从而加速系统的启动速度。并且通过配合Java系统服务的裁剪,可以从开发商的角度限制系统服
务,从而保证产品安全。通过裁剪运行库文件,可以降低Android系统在内存和存储介质上的占
用率。

硬件抽象层:硬件抽象层主要起到为Android系统和Linux内核提供一个桥梁的作用。通过裁剪
不必要的硬件设备所对应的硬件抽象层文件,可以降低系统镜像在存储设备上的占用率。

2. apk的裁剪

简单理解的话就是原生的话就是去除GMS,即谷歌全家桶,视需要保留其他原生apk

3. 服务的裁剪

Android系统的服务主要分为两类,第一类是系统服务,第二类是应用程序服务,如图:
系统精简归总_第2张图片
先了解下我们的本地服务的作用:
系统精简归总_第3张图片
这里可以根据设备的实际情况裁剪,在init.rc取消启动或者注册即可。

4. 运行库的裁剪

通过分析运行库文件源码的Android.mk文件,发现一个运行库文件编译运行时经常依赖其他的运行
库,且该库本身又有可能被其他运行库所依赖,所以对Android系统运行库裁剪的主要难点是处理好库与
库之间的依赖关系。

5. 硬件抽象层的裁剪

对该层文件的裁剪可以通过对不需要模块的入口函数hw_get_module0进行屏蔽来实现,其具体实方法是:在Android系统启动中,对不需要的硬件抽象层模块不进行注册,这样的话就不会加载相应的模块。

在Android系统启动SystemServer时会加载android_servers库,而这个动作会调用JNI_OnLoad()函数,该函数在源码树中的位置是frameworks/base/services/jni/Onload.cpp,该函数是Android系统提供的一种特有的机制,负责将本地方法注册到虚拟机当中,部分代码如下所示:

extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv* env = NULL;
    jint result = -1;

    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        ALOGE("GetEnv failed!");
        return result;
    }
    ALOG_ASSERT(env, "Could not retrieve the env!");

    register_android_server_PowerManagerService(env);
    register_android_server_SerialService(env);
    register_android_server_InputApplicationHandle(env);
    //省略
    return JNI_VERSION_1_4;
}

所以在此函数中,根据应用需求分析,将不需要的硬件抽象层模块注释掉,即可以在系统开机启动的
时候不将其注册,所以系统不会再去加载相应硬件抽象层的二进制文件。

6. 补充裁剪项

本来上面几个采集项已经够了,突然想到还有资源文件的裁剪,这也是我最近才接触到的,这里也补充一下。
即是对系统字体、声音、视频、软盘等资源的裁剪,系统路径为frameworks/base/data,这个可以参考我前面的内容的第18,19小节,如何添加就如何删减,链接为android系统开机默认设置修改记录。

7. 后记

主要强调是两个事,第一,裁剪需谨慎,需对系统架构熟悉到一定程度之后再进行,操作不当就可能造成牵一发而动全身的影响;第二,这篇文章是闲暇时间的草稿,后续会不断追加完善,如有问题,可在评论区留言。

你可能感兴趣的:(android系统学习轨迹)