Android 系统精简思路


文章目录

  • Android 系统精简思路
  • Android框架层次
  • 层次(从上往下)
  • 移除
  • 删除(还没有删,待确认)
  • 不同层次的log
  • 另一种删除预装APK方法


Android框架层次

层次(从上往下)

  • 应用程序层(Application)
  • 应用程序框架层(Application Framework)
  • 运行时库层(Runtime)
  • 硬件抽象层(HAL)
  • Linux内核层(Linux kernel)

移除

  • 应用程序层:移除APP/可执行文件(已经删除谷歌和高通的一部分APP了)
  • 应用程序框架层:移除资源:图片/音视频/字库/语言包
  • 运行时库层(Runtime)
  • 硬件抽象层(HAL):移除JNI生成的SO
  • Linux内核层(Linux kernel):移除驱动/关闭后台服务

删除(还没有删,待确认)

  • 字库:frameworks/base/data/fonts
  • 铃声:frameworks/base/data/sounds
  • 视频:frameworks/base/data/videos
  • 键盘:frameworks/base/data/keyboards
  • 环境权限等配置:frameworks/base/data/etc
  • 安装包:frameworks/base/packages
  • Google VR:frameworks/base/vr

注意

  • 不要删除源文件
  • 先把xml里的配置删除,再在Android.mk里删除资源文件名称(即不复制到image中)
1. build/target/product是编译产品关键的mk文件存放处,此处可以更改各个mk文件编译内容进行裁剪
base.mk文件:去除不必要的lib库文件和bin文件
core_minimal.mk:dmtracedump, Shell, HTMLViewer, screencap等工具和apk等
core.mk: libnfc_ndef, mms-common nfc功能库文件和mms短信功能等
embedded.mk:dumpstate, dumpsys
: camera.goldfish , camera.goldfish.jpeg , lights.goldfish , gps.goldfish等
full_base.mk: 去除不需要的库和apk
full_base_telephony.mk: 去除apk和电话功能
generic_no_telephony.mk:去除apk和不必要的库
languages_full.mk,locales_full.mk: 去除不需要的语言设置(可以去除res包的大小)
1. external/icu4c/stubdata/icu-data-default.txt: 修改此文件,去除编译出的icu.dat文件大小,去除不需要的语言,重新用脚本生成想要的dat文件
external/skia/Android.mk: 去除其中test的编译
2. frameworks/base/data/etc/platform.xml: 去除不需要的属性
frameworks/base/data/fonts/Android.mk: 去除不需要的字体
frameworks/base/data/fonts/fallback_fonts.xml: 去除不需要的字体
frameworks/base/data/fonts/: 去除不需要的字体
3. frameworks/base/data/sounds/: 去除不需要的声音文件(除了ui的保留,其他都可以去除)
frameworks/base/data/videos/VideoPackage1.mk: 去除不需要的视频文件
frameworks/native/data/etc/handheld_core_hardware.xml: 去除不需要的属性
frameworks/native/data/etc/tablet_core_hardware.xml:去除不需要的属性
frameworks/base/preloaded-classes: 裁剪不必要的资源加载
4. init.rc: 裁剪不需要的本地服务
system.prop: 裁剪不必要的属性内容

不同层次的log

  • java层:Log.v()
  • framework层:Slog.v()
  • HAL:LOGV()
  • JNI:LOGV()

另一种删除预装APK方法

# device/qcom/msm8953_64/msm8953_64.mk
# 这里定义了PRODUCT_PACKAGES

# build/core/
# 这里加载了PRODUCT_PACKAGES
# 再过滤过滤

ifdef FULL_BUILD
  # The base list of modules to build for this product is specified
  # by the appropriate product definition file, which was included
  # by product_config.mk.
  product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
ifdef BOARD_VNDK_VERSION
  product_MODULES += vndk_package
endif
  # Filter out the overridden packages before doing expansion
  product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \
      $(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))
  # Filter out executables as well
  product_MODULES := $(filter-out $(foreach m, $(product_MODULES), \
      $(EXECUTABLES.$(m).OVERRIDES)), $(product_MODULES))

作者 [@lhgcs]
2020 年 09月 03