天天看點

android系統裁剪之原生字型庫精簡

        字型庫精簡的目标是精簡/system/fonts下的字型檔案,達到壓縮system大小的目的。

        由于本項目之用到了中英文,是以精簡的方法是将其他語言的ttf字庫全部去掉,也就是将/frameworks/base/data/fonts目錄下的幾個配置檔案的相關内容全部注掉,之保留中英文的部分。

        最後精簡的結果是隻保留如下幾個檔案,其餘都可删除,如果想知道字庫的具體語種,可以下載下傳fontcreator工具檢視,或者直接将ttf名字進行百度。下面幾個字庫分别代表了中英文的字庫。

android系統裁剪之原生字型庫精簡
裁剪檔案 大小 作用 是否可裁剪
Roboto-Bold.ttf 112.0K DroidSans-Bold.ttf連結到了本字型上,android4.4以後系統實際使用的是本字型檔案作為英文加粗的字庫 不可删除
DroidSans-Bold.ttf 系統預設使用的英文加粗字型,隻是一個空殼 不可删除
Roboto-Regular.ttf 112.0K 系統預設使用的英文字型,DroidSans.ttf連結到了本字庫上 不可删除
DroidSans.ttf 系統預設使用的英文字型,隻是一個空殼 不可删除
DroidSansFallback.ttf 4.3M   系統使用的預設漢字字庫 不可删除

具體修改一般來講隻需要修改以下三個檔案即可。

frameworks/base/data/fonts/Android.mk
 frameworks/base/data/fonts/fallback_fonts.xml
 frameworks/base/data/fonts/system_fonts.xml
           

對于frameworks/base/data/fonts/Android.mk中定義的整段的編譯,如果不需要的話要将include整個注釋掉,如

diff --git a/frameworks/base/data/fonts/Android.mk b/frameworks/base/data/fonts/Android.mk
index 5cb51cd..b71b62d 100644
--- a/frameworks/base/data/fonts/Android.mk
+++ b/frameworks/base/data/fonts/Android.mk
@@ -44,26 +44,26 @@ ifeq ($(SMALLER_FONT_FOOTPRINT),true)
 droidsans_fallback_src := DroidSansFallback.ttf
 extra_font_files := DroidSans.ttf DroidSans-Bold.ttf
 else
-include $(CLEAR_VARS)
-LOCAL_MODULE := DroidSansEthiopic-Regular.ttf
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
-include $(BUILD_PREBUILT)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := MTLmr3m.ttf
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_CLASS := ETC
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
-include $(BUILD_PREBUILT)
+#include $(CLEAR_VARS)
+#LOCAL_MODULE := DroidSansEthiopic-Regular.ttf
+#LOCAL_SRC_FILES := $(LOCAL_MODULE)
+#LOCAL_MODULE_CLASS := ETC
+#LOCAL_MODULE_TAGS := optional
+#LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
+#include $(BUILD_PREBUILT)
+
+#include $(CLEAR_VARS)
+#LOCAL_MODULE := MTLmr3m.ttf
+#LOCAL_SRC_FILES := $(LOCAL_MODULE)
+#LOCAL_MODULE_CLASS := ETC
+#LOCAL_MODULE_TAGS := optional
+#LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
+#include $(BUILD_PREBUILT)
           

對于下面extra_font_files和font_src_files定義的,将不用的行注釋掉就行,保留中英文的行即可。

對于frameworks/base/data/fonts/fallback_fonts.xml檔案,需要以family為機關進行注釋,注釋掉不需要的family。比如

--- a/frameworks/base/data/fonts/fallback_fonts.xml
+++ b/frameworks/base/data/fonts/fallback_fonts.xml
@@ -29,6 +29,7 @@
     all others.
 -->
 <familyset>
+<!--
     <family>
         <fileset>
             <file variant="elegant">DroidNaskh-Regular.ttf</file>
@@ -230,11 +231,13 @@
             <file>NotoColorEmoji.ttf</file>
         </fileset>
     </family>
+-->
     <family>
         <fileset>
             <file>DroidSansFallback.ttf</file>
         </fileset>
     </family>
+<!--
    <family>
         <fileset>
             <file>NotoSansGurmukhi-Bold.ttf</file>
@@ -300,6 +303,7 @@
             <file >MTLmr3m.ttf</file>
         </fileset>
     </family>
+-->
           

對于frameworks/base/data/fonts/system_fonts.xml檔案,隻是掉不需要的file标簽和family标簽即可,方法跟上面類似。

以上修改完之後就可以删除out/。。。/system/fonts目錄下的ttf檔案,然後進行編譯,驗證下自己的修改了,如果有發現還有多餘的其他字型檔案仍然參與了編譯,可以查下源碼路徑下/external目錄下是否有其他的字型檔案的makefile配置,如果有則進行注釋就可以了。我在修改的時候就發現有兩個檔案NotoSansSymbols-Regular.ttf,NotoColorEmoji.ttf是在/external下進行配置的,注掉即可。

字型精簡這部分其實還是挺簡單的,隻要找到makefile就很好下手。