FBReader工程結構解析

昨天是臘月23,俗稱“小年”。民間有這樣的說法,二十三糖瓜兒粘;二十四掃房子;二十五磨豆腐;二十六燉大肉;二十七宰公雞;二十八把面發;二十九蒸饅頭;三十晚上熬一宿,大年初一扭一扭!
農曆十二月二十三和二十四,是中國民間傳統的祭竈日,又稱“小年”。傳說竈王爺原爲平民張生,娶妻之後終日花天酒地,敗盡家業淪落到上街行乞。一天,他乞討到了前妻郭丁香家,羞愧難當,一頭鑽到竈鍋底下燒死了。
玉帝知道後,認爲張生能回心轉意,還沒壞到底,既然死在了鍋底,就把他封爲竈王,每年臘月二十三、二十四上天彙報,大年三十再回到竈底。老百姓覺得竈王一定要敬重,因爲他要上天彙報。於是,民間就有了臘月二十三、二十四的祭竈“小年”,祈求來年平安和財運。
清朝的皇帝從雍正年間開始,每年臘月二十三在坤寧宮祀神,爲了節省開支,皇帝順便把竈王爺也拜了。以後王族、貝勒隨之效仿,於臘月二十三祭竈,自此開始有了官民在不同日子過小年的分別。
在中國民間,小年有“官三民四船五”的傳統,也就是說,官家的小年是臘月二十三,百姓家的是臘月二十四,而水上人家則是臘月二十五。
北方在南宋以前都是政治中心,受官氣影響較重,因此小年多爲臘月二十三;相反,南方遠離政治中心,小年便爲臘月二十四;而沿湖、海的居民,則保留了船家的傳統,小年定在臘月二十五。
而南京地區是一個比較特殊的地區,這是因爲在明代朱棣篡奪皇位後,實行了暴政。當時的百姓在永樂元年正月十五舉行燈會,心裏紛紛懷念朱允炆時代的寬政,場面賽過過年。因此在南京地區,元宵成了小年。西南雲貴川地區和部分北方回民地區把正月初一作爲大年夜,除夕就成了小年夜。
以上來源於百度百科。

(本文寫於2017.2.9號,首次在公衆號發表)馬上要臨近春節了,我們公司今天(2.9號)正式放假,本篇也是年前的最後一次推文。在這裏提前祝大家新春快樂,狗年大吉,十”犬”十美,狗年Go Go Go! 因爲最近在做閱讀引擎相關的工作,所以總結的文檔大都和閱讀引擎有關。如果對此不敢興趣的同學可以忽略掉。本文講一下我之前分析FBReader時,對FBReader工程結構解析做的一個筆記總結。下面將分層次說明一下各個模塊。

1、依賴工程

(1)、AmbilWarna:

Android Color Picker application using AmbilWarna Color Picker Library
背景顏色選擇器,用在設置背景顏色時,以及標籤背景編輯時使用。
可以提取爲一個模塊。放到最後再提取,先整理主工程。

移植遇到的坑比較多:
使用AmbilWarnaKotak和AmbilWarnaPrefWidgetView 的xml中的包名需要修改;
原來的爲
yuku.ambilwarna.AmbilWarnaKotak
yuku.ambilwarna.widget.AmbilWarnaPrefWidgetView
修改後爲,
com.thridapp.widget.AmbilWarnaKotak
com.thridapp.widget.AmbilWarnaPrefWidgetView

(2)、android-filechooser:

文件選擇器,用來進行文件選擇。
org.geometerplus.android.util.FileChooserUtil 需要關注,其它好像用途不大,項目中其它文件基本沒有在使用。
包名爲:group.pals.android.lib.ui.filechooser
可以暫時保留。

(3)、drag-sort-listview:

拖動排序列表。
只有CatalogManagerActivity(目錄管理界面)中使用了DragSortListView ,可以暫時忽略這個界面,RN端來實現。
所以此模塊可以不用集成。

包名爲:com.mobeta.android.dslv
此模塊可以刪除。對應“在線書庫” 中的“管理書庫”菜單中的列表排序。CatalogManagerActivity 爲對應的activity,可以將其刪除。

(4)、superToasts:

特殊的toast控件,在工程中使用的地方較多。
可以提取爲一個模塊,注意其中無用的文件可以刪除掉。
包名爲:com.github.johnpersano.supertoasts
此工程可以暫時保留。

2、jar庫

(1)、httpmime-4.2.5.jar

HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。

(2)、json-simple-1.1.1.jar

JSON.simple是一個很簡單的JSON處理,讀取和寫JSON數據的JAVA庫,它完全兼容JSON的標準(RFC4627)。你可以用JSON.simple來編碼或解碼JSON文本。

(3)、LingvoIntegration_2.5.2.12.jar

語言集成包。應用是提供多語言服務的。

(4)、nanohttpd-2.0.5.jar

NanoHTTPD是專爲嵌入在其他Java應用程序中使用的一個輕量級HTTP服務器,它只有一個Java文件。支持 GET, POST, PUT, HEAD 和 DELETE 請求,支持文件上傳,佔用內存很小。可輕鬆定製臨時文件使用和線程模型。

(5)、open-dictionary-api-1.2.1.jar

The Open Dictionary API Alliance (ODAA) is an open community of dictionary publishers aiming to create new possibilities for millions of people using electronic dictionaries on their mobile devices all over the world.
打開詞典API聯盟(ODAA)是字典出版商旨在全世界範圍內,創造一個爲全世界數百萬人在他們的移動設備上使用電子詞典的新可能性。

(6)、pdfparse.jar

PdfParser, a standalone PHP library, provides various tools to extract data from a PDF file.
PdfParser,一個獨立的PHP庫,提供了各種工具,從PDF文件中提取數據。

3、jni

注意,
原始編譯選項爲,APP_ABI := armeabi armeabi-v7a x86 mips arm64-v8a mips64 x86_64
如果有的手機無法正常運行,可以考慮是否少so文件。

(1)、linebreak :

Liblinebreak is an implementation of the line breaking algorithm as described in Unicode 6.0.0 Standard Annex 14, Revision 26. It breaks lines that contain Unicode characters. It is designed to be used in a generic text renderer. FBReader is one real-world example, and you may also check some simple sample code, like showbreak and breaktext.
應該是用來換行排版使用的
此庫比較有用,在LineBreaker.java中進行調用,對應native層的LineBreaker.cpp,ZLTextParagraphCursor.java中會調用到。

(2)、Expat :

Expat是一個用C語言開發的、用來解析XML文檔的開發庫,它最初是開源的、Mozilla項目下的一個XML解析器。
expat是使用C所寫的XML解釋器,採用流的方式來解析XML文件,並且基於事件通知型來調用分析到的數據,並不需要把所有XML文件全部加載到內存裏,這樣可以分析非常大的XML文件。由於expat庫是由XML的主要負責人James Clark來實現的,因此它是符合W3C的XML標準的。

(3)、DeflatingDecompressor :

應該是進行壓縮的。
DeflatingDecompressor.java中進行調用,對應native層的DeflatingDecompressor.cpp文件。

(4)、NativeFormats

用來對不同格式進行兼容處理的,應該包括,
css,doc,fb2,html,xhtml, oeb,pdb ,rtf ,txt等格式。
提供不同格式的文件以插件方式來支持。
在PluginCollection.java中調用,對應native的JavaPluginCollection.cpp文件。
PluginCollection 應該是插件管理器。

4、模塊

(1)、zip-amse

包路徑:org.amse.ys.zip
功能需要保留,但是包名要替換。注意涉及到底層DeflatingDecompressor 庫。

(2)、util

包路徑:org.fbreader.util
功能需要保留,但是包名要替換。

(3)、text-formats

全部爲jni代碼,包括兩部分,expat-2.0.1 和NativeFormats,應該是對文字字符進行格式化。
最終會編譯成.so或者.a庫,可以不用修改,但是對外提供的natvie接口名稱需要修改。

(4)、resources

包路徑:assets.resources.application和assets.resources.zlibrary
多國語言字符串資源,放在assets目錄下,可以只保留英文和簡體中文。

(5)、common

涉及到的包路徑:
com.paragon.dictionary.fbreader
org.fbreader
org.geometerplus
可以和主工程合到一起,包括assets目錄下的文件。

(6)、api

涉及到的包路徑:
api.src.main.java.org.geometerplus.android
api.src.main.java.org.geometerplus.fbreader
api.src.main.java.org.geometerplus.zlibrary
可以和主工程合到一起。

(7)、app主工程

涉及到的包路徑:
java.org.geometerplus.android
java.org.geometerplus.fbreader
java.org.geometerplus.zlibrary

5、assets目錄

(1)、data

data.premium ,licences.html提供licences和購買信息。
data.whatsnew介紹新特性。

(2)、default

默認的按鍵,插件配置信息
tapzones,keymap.xml提供按鍵映射的xml文件
styles.css,styles.xml提供默認值配置文件
plugins.xml提供插件對應的包名信息

(3)、dictionaries

詞典相關的配置信息
bitknights.xml 提供bitknights 官方網站提供多種詞典下載的地址
main.xml提供多種詞典打開的方式

(4)、encodings

編碼方式設置信息
Encodings.xml列出支持的編碼方式

(5)、formats

包括,
formats.fb2
formats.html
formats.xhtml 三個目錄。
爲NativeFormats 的jni工程提供配置信息。

(6)、hyphenationPatterns

提供斷字模式,模塊ZLTextTeXHyphenator.java會調用到。

(7)、languagePatterns

語言不同編碼模式,languagePatterns.java和ZLLanguageList.cpp會用到。

(8)、resources

多國語言字符串資源。

(9)、wallpapers

預置了幾種牆紙文件,爲jpg格式文件。

6、AndroidManifest文件分析

如果只需要閱讀引擎的話,所有的activity都應該清理掉,下面只分析一下Service和Receiver。

    <!-- receiver -->
    <!--BookDownloaderService 中調用,和下載相關的廣播-->
    <receiver android:name="com.laoxiao79.test.android.reader.network.ListenerCallback"
        android:process=":networkLibrary">
        <intent-filter>
            <action android:name="android.fbreader.action.network.SIGNIN"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </receiver>

    <!-- service -->
    <!--ApiClientImplementation 類隱式啓動, 沒有找到啓動ApiClientImplementation地方,所以此類應該是未用-->
    <service android:name="com.laoxiao79.test.android.reader.api.ApiService"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.fbreader.action.API"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </service>

    <!--BookCollectionShadow 中隱式啓動,用來創建,訪問數據庫,存儲book信息到本地-->
    <service android:name="com.laoxiao79.test.android.reader.libraryService.LibraryService"
        android:launchMode="singleTask"
        android:process=":libraryService">
        <intent-filter>
            <action android:name="android.fbreader.action.LIBRARY_SERVICE"/>
        </intent-filter>
    </service>

    <!--ConfigShadow 類隱式啓動,只有在ZLAndroidApplication中的一個實例-->
    <service android:name="com.laoxiao79.test.android.reader.config.ConfigService"
        android:launchMode="singleTask"
        android:process=":configService">
        <intent-filter>
            <action android:name="android.fbreader.action.CONFIG_SERVICE"/>
        </intent-filter>
    </service>

    <!--和官網同步服務相關-->
    <service android:name="com.laoxiao79.test.android.reader.sync.SyncService"
        android:launchMode="singleTask"
        android:process=":synchroniser">
        <intent-filter>
            <action android:name="android.fbreader.action.sync.START"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.fbreader.action.sync.QUICK_SYNC"/>
        </intent-filter>
    </service>

    <!--BookDownloader下載相關的activity-->
    <service android:name="com.laoxiao79.test.android.reader.network.BookDownloaderService"
        android:launchMode="singleTask"
        android:process=":networkLibrary"
        android:exported="false"/>

    <!--後臺網絡訪問-->
    <service android:name="com.laoxiao79.test.android.reader.httpd.DataService"
        android:launchMode="singleTask"
        android:process=":dataService"
        android:exported="false"/>

    <!--FileChooserActivity 中用到,和選擇文件有關-->
    <service android:name="group.pals.android.lib.ui.filechooser.services.LocalFileProvider"
        android:exported="false"/>

綜上,以上就是整個FBReader工程的一個結構解析,再深入分析就需要研究每個activity,service或者具體類了,希望以上總結能給你帶來幫助。

這裏寫圖片描述
本公衆號將以推送Android各種技術乾貨或碎片化知識,以及整理老司機日常工作中踩過的坑涉及到的經驗知識爲主,也會不定期將正在學習使用的新技術總結出來進行分享。每天一點乾貨小知識把你的碎片時間充分利用起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章