在目前的机顶盒ROM中,系统可以精简的地方有很多,本篇文章基于Android4.4.2系统,简单介绍下一些常见的系统精简方式。
一、update.zip结构简介
要进行系统体积精简,首先就要了解update.zip的目录结构。各个芯片平台,都有定制过自己的update.zip,所以update.zip里的内容不是完全一样的,但有些公共性的文件是一样的,如
|----boot.img
|----system
|----app
|----bin
|----lib
|----etc
......
|----META-INF
|----CERT.RSA
|----CERT.SF
|----MANIFEST.MF
|----com
|----android
|----metadata
|----otacert
|----google
|----android
|----update-binary
|----updater-script
1>boot.img
boot.img是更新boot分区所需要的文件,主要包括kernel+ramdisk。
2>system目录
system目录的内容在升级后会放在系统的system分区,主要用来更新系统的apk、so、bin等,在系统源码中对应着out/target/product/xxx/system/中的所有文件。
3>META-INF目录
CERT.RSA:与签名文件相关联的签名程序块文件,它存储了用于签名JAR文件的公共签名。
CERT.SF:JAR文件的签名文件,其中前缀CERT代表签名者。
MANIFEST.MF:定义了与包的组成结构相关的数据,类似上层Android应用的mainfest.xml文件。
metadata:描述设备信息及环境变量的元数据,主要包括一些编译选项,签名公钥,时间戳以及设备型号等。
otacert:具体的签名检验文件,里面存放着签名校验的字符串。
update-binary:二进制文件,相当于一 个脚本解释器,能够识别updater-script中描述的操作。
updater-script:脚本文件,具体描述了更新过程。
二、系统体积精简
此处指的是对update.zip体积进行精简,主要针对system目录进行,具体见于下文。
2.1 system/app
该目录存放的是系统应用,基于Android4.4.2系统,可裁剪的应用见于下表:
分类 | 应用名称 | 包名 | 功能说明 |
---|---|---|---|
墙纸 | WallpaperCropper.apk | com.android.wallpaper | Basic动态墙纸 |
墙纸 | Galaxy4.apk | com.android.galaxy4 | Galaxy4 动态墙纸 |
墙纸 | HoloSpiral.aapk | com.android.wallpaper.holospiral | HoloSpiral动态墙纸 |
墙纸 | LiveWallpapersPicker.apk | com.android.wallpaper.livepicker | 动态墙纸选择器 |
墙纸 | MagicSmoke.apk | com.android.magicsmoke | MagicSmoke动态墙纸 |
墙纸 | MusicVisualization.apk | com.android.musicvis | MusicVisualization动态墙纸 |
墙纸 | NoiseField.apk | com.android.noisefield | NoiseField动态墙纸 |
墙纸 | PhaseBeam.apk | com.android.phasebeam | PhaseBeam动态墙纸 |
屏保 | BasicDreams.apk | com.android.dreams.basic | Basic屏保 |
屏保 | PhotoTable.apk | com.android.dreams.phototable | PhotoTable屏保 |
屏保 | WebViewDream.apk | com.android.dreams.web | WebView屏保 |
短信/彩信/电话 | BasicSmsReceiver.apk | com.android.basicsmsreceiver | 基础短信接收 |
短信/彩信/电话 | Mms.apk | com.android.mms | 彩信 |
短信/彩信/电话 | Telephony.apk | com.android.phone | 电话应用 |
短信/彩信/电话 | TelephonyProvider.apk | com.android.providers.telephony | 电话记录 Content Provider |
短信/彩信/电话 | VoiceDialer.apk | com.android.voicedialer | 语音拨号器 |
短信/彩信/电话 | InCallUI.apk | com.android.incallui | 拨号盘 |
短信/彩信/电话 | CellBroadcastReceiver.apk | com.android.cellbroadcastreceiver | 小区广播 |
通讯录 | Contacts.apk | com.android.contacts | 联系人 |
通讯录 | ContactsProvider.apk | ContactsProvider | 联系人 Content Provider |
浏览器 | Browser.apk | com.android.Browser | 系统浏览器 |
浏览器 | HTMLViewer.apk | com.android.htmlviewer | 简易HTMLView |
计算器 | Calculator.apk | com.android.calculator2 | 计算器 |
日历 | Calendar.apk | com.android.Calendar | 日历 |
日历 | CalendarProvider.apk | com.android.providers.calendar | 日程表 Content Provider |
邮件 | Email.apk | com.android.email | 邮件应用 |
邮件 | UnifiedEmail.apk | com.android.mail | 邮件 |
图库 | Gallery2.apk | com.android.gallery3d | 图库 |
相机/录音/视频编辑 | Camera.apk | com.android.camera | 相机 |
相机/录音/视频编辑 | Camera2.apk | com.android.camera2 | 相机 |
相机/录音/视频编辑 | SpeechRecorder.apk | com.android.speechrecorder | 语音录制 |
相机/录音/视频编辑 | SoundRecorder.apk | com.android.SoundRecorder | 音频录制 |
相机/录音/视频编辑 | VideoEditor.apk | com.android.VideoEditor | 视频编辑器 |
桌面 | Launcher2.apk | com.android.launcher | 原生launcher2 |
桌面 | Launcher3.apk | com.android.launcher3 | 原生launcher3 |
音乐 | Music.apk | com.android.music | 音乐播放器 |
音乐 | MusicFX.apk | com.android.musicfx | 音乐控制面板 |
桌面小工具 | DeskClock.apk | com.android.deskclock | 时钟 |
桌面小工具 | Protips.apk | com.android.protips | 桌面帮助提示 |
桌面小工具 | QuickSearchBox.apk | com.android.quicksearchbox | 快速搜索框 |
其他 | PartnerBookmarksProvider.apk | com.android.providers.partnerbookmarks | 书签Content Provider |
其他 | SpareParts.apk | com.android.spare_parts | 开发样例 |
其他 | OneTimeInitializer.apk | com.android.onetimeinitializer | 首次安装Google app工具 |
其他 | UserDictionaryProvider.apk | com.android.providers.userdictionary | 用户词典Content Provider |
芯片自带应用 | HiVideoPhoneTest.apk | com.android.videophonetest | 视频测试工具 |
芯片自带应用 | Hdcp1.4KeyLoadTool.apk | com.example.hidisplaytest | 接口测试工具 |
芯片自带应用 | MultiVideoTest.apk | com.android.multivideotest | 多路视频测试工具 |
芯片自带应用 | HiFactoryTest.apk | com.android.factorytest | 厂测工具 |
芯片自带应用 | HiGallery.apk | com.hisilicon.android.gallery3d | 图库 |
芯片自带应用 | ServiceSettings.apk | com.android.smart.terminal.iptv.aidl | 中间件通信 |
芯片自带应用 | HiGalleryL.apk | com.android.nativeimage.gallery | 4K图库 |
芯片自带应用 | PicturePlayer.apk | com.droidlogic.PicturePlayer | 本地文件管理 |
芯片自带应用 | Miracast.apk | com.amlogic.miracast | 无线传屏 |
芯片自带应用 | NativeImagePlayer.apk | com.droidlogic.imageplayer | 图片播放器 |
2.2 system/bin
该目录存放的是系统会使用到的脚本文件,该目录精简效果有限,主要的精简思路如下:
1>检查是否有bin文件重复情况
如xiriservice_All和xiriservice_tv,保留使用的bin文件即可。
2>检查是否预置无效bin文件情况。
比如未适配MediaAnalytics.apk时,就不用预置sqmloader、sqmpro.md5和sqm_setup.sh文件。
2.3 system/lib
该目录存放的是系统自动编译出来的so文件及apk运行所需要的so。系统编译出来的so可以不用处理,但是当从app目录删除一个apk时,务必要检查该apk是否包含有so,如果有,则需要在lib目录删除对应的so。该目录精简效果最大,务必要进行。
2.4 system/media
该目录主要存放的是系统所需的媒体文件,如开机动画、开机视频、音频文件等。该目录的精简主要可以从两方面进行:
1>bootanimation.zip
此文件即开机动画,主要检查下该zip包里是否有重复的图片文件,如果有过多重复的图片文件,可以删掉部分图片,然后修改desc.txt,达到图片重复播放的效果即可。
举个例子,将bootanimation.zip解压后,part0目录有五个图片文件,分别为boot0.png、boot1.png、boot2.png、boot3.png、boot4.png。desc.txt内容为:
1280 720 1
p 1 0 part0
此时,可以将part0目录下的五张图片任意删除4张,然后修改desc.txt内容为:
1280 720 1
p 5 0 part0
2>audio目录
该目录下存放的是系统所需要的的音频文件,不用保留Android原生的所有音频文件。如在Hi3798MV300平台上,所使用的音频文件可以通过"getprop |grep ogg"查看,如下:
[ro.config.alarm_alert]: [Alarm_Classic.ogg]
[ro.config.notification_sound]: [pixiedust.ogg]
[ro.config.ringtone]: [Ring_Synth_04.ogg]
如以上属性,则系统中只需保留Alarm_Classic.ogg、pixiedust.ogg]及Ring_Synth_04.ogg三个音频文件,其余ogg文件则不用编译到update.zip。需要修改的文件为:
frameworks/base/data/sounds/AllAudio.mk
frameworks/base/data/sounds/AudioPackage10.mk
frameworks/base/data/sounds/AudioPackage11.mk
frameworks/base/data/sounds/AudioPackage12.mk
frameworks/base/data/sounds/AudioPackage12_48.mk
frameworks/base/data/sounds/AudioPackage2.mk
frameworks/base/data/sounds/AudioPackage3.mk
frameworks/base/data/sounds/AudioPackage4.mk
frameworks/base/data/sounds/AudioPackage5.mk
frameworks/base/data/sounds/AudioPackage6.mk
frameworks/base/data/sounds/AudioPackage7.mk
frameworks/base/data/sounds/AudioPackage7alt.mk
frameworks/base/data/sounds/AudioPackage8.mk
frameworks/base/data/sounds/AudioPackage9.mk
frameworks/base/data/sounds/OriginalAudio.mk
将别的ogg不编译进版本的修改方式,示例如下:
--- a/frameworks/base/data/sounds/AllAudio.mk
+++ b/frameworks/base/data/sounds/AllAudio.mk
- $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
+ # $(LOCAL_PATH)/Alarm_Beep_01.ogg:system/media/audio/alarms/Alarm_Beep_01.ogg \
2.5 system/preinstall
该目录主要存放的是系统所需要预安装的应用,此目录与app目录下的应用安装机制有所不同:app目录下的应用,开机后自动安装,而该目录下的apk一般需要调用脚本去安装。检查一下系统中是否需要预安装某个应用,如果不需要,直接在该目录删除即可。
2.6 system/tts
该目录主要存放了一些语音播报相关的文件。目前机顶盒ROM中,语音交互功能大都由科大讯飞进行实现,所以该目录可以删掉。具体的处理方式与处理音频文件相似,需要修改以下文件:
external/svox/pico/lang/PicoLangDeDeInSystem.mk
external/svox/pico/lang/PicoLangEnGBInSystem.mk
external/svox/pico/lang/PicoLangEsEsInSystem.mk
external/svox/pico/lang/PicoLangItItInSystem.mk
external/svox/pico/lang/PicoLangDefaultInSystem.mk
external/svox/pico/lang/PicoLangEnUsInSystem.mk
external/svox/pico/lang/PicoLangFrFrInSystem.mk
external/svox/pico/lang/all_pico_languages.mk
不生成system/tts目录的修改方式,示例如下:
--- a/external/svox/pico/lang/PicoLangDeDeInSystem.mk
+++ b/external/svox/pico/lang/PicoLangDeDeInSystem.mk
-PRODUCT_COPY_FILES += \
- external/svox/pico/lang/de-DE_gl0_sg.bin:system/tts/lang_pico/de-DE_gl0_sg.bin \
- external/svox/pico/lang/de-DE_ta.bin:system/tts/lang_pico/de-DE_ta.bin
+#PRODUCT_COPY_FILES += \
+# external/svox/pico/lang/de-DE_gl0_sg.bin:system/tts/lang_pico/de-DE_gl0_sg.bin \
+# external/svox/pico/lang/de-DE_ta.bin:system/tts/lang_pico/de-DE_ta.bin
2.7 芯片特殊文件
如海思平台上的fastplay.img,即定制的开机视频播放文件,该文件可用一同名空文件替代。原因是:如果要指定开机视频,在system/media目录下直接预置boot.ts等视频文件即可,不要再制作该fastplay.img。
三、update.zip精简效果验证
第二章节说的都是在源码中如何修改,其实在源码中进行修改之前,应该先用实际的update.zip进行精简的动作,验证效果,当验证删除一些文件对系统运行无异常影响时,再在代码中进行删减。具体的方法为:
1>以zip方式打开update.zip,然后尝试删掉一些不需要的文件。
2>对删掉一些文件后的update.zip进行签名,签名命令如下:
java -Xmx2048m -jar signapk.jar -w testkey.x509.pem testkey.pk8 update.zip update_signed.zip
其中,所涉及的文件如下:
signapk.jar :out/host/Linux-x86/framework/signapk.jar
testkey.x509.pem:build/target/product/security/testkey.x509.pem
testkey.pk8:build/target/product/security/testkey.pk8
update.zip:删除一些文件的升级包
update_signed.zip:签名后的升级包
至此,常见的机顶盒ROM体积精简方式介绍完毕。