FBReader工程结构解析

昨天是腊月23,俗称“小年”。民间有这样的说法,二十三糖瓜儿粘;二十四扫房子;二十五磨豆腐;二十六炖大肉;二十七宰公鸡;二十八把面发;二十九蒸馒头;三十晚上熬一宿,大年初一扭一扭!
农历十二月二十三和二十四,是中国民间传统的祭灶日,又称“小年”。传说灶王爷原为平民张生,娶妻以后终日花天酒地,败尽家业沦落到上街行乞。一天,他乞讨到了前妻郭丁香家,羞愧难当,一头钻到灶锅底下烧死了。
玉帝知道后,认为张生能回心转意,还没坏到底,既然死在了锅底,就把他封为灶王,每一年腊月二十3、二十四上天汇报,大年三十再回到灶底。老百姓以为灶王必定要敬重,由于他要上天汇报。因而,民间就有了腊月二十3、二十四的祭灶“小年”,祈求来年平安和财运。
清朝的皇帝从雍正年间开始,每一年腊月二十三在坤宁宫祀神,为了节省开支,皇帝顺便把灶王爷也拜了。之后王族、贝勒随之效仿,于腊月二十三祭灶,自此开始有了官民在不一样日子太小年的分别。
在中国民间,小年有“官三民四船五”的传统,也就是说,官家的小年是腊月二十三,百姓家的是腊月二十四,而水上人家则是腊月二十五。
北方在南宋之前都是政治中心,受官气影响较重,所以小年多为腊月二十三;相反,南方远离政治中心,小年便为腊月二十四;而沿湖、海的居民,则保留了船家的传统,小年定在腊月二十五。
而南京地区是一个比较特殊的地区,这是由于在明代朱棣篡夺皇位后,实行了暴政。当时的百姓在永乐元年正月十五举行灯会,内心纷纷怀念朱允炆时代的宽政,场面胜过过年。所以在南京地区,元宵成了小年。西南云贵川地区和部分北方回民地区把正月初一做为大年夜,除夕就成了小年夜。
以上来源于百度百科。css

(本文写于2017.2.9号,首次在公众号发表)立刻要临近春节了,咱们公司今天(2.9号)正式放假,本篇也是年前的最后一次推文。在这里提早祝你们新春快乐,狗年大吉,十"犬"十美,狗年Go Go Go! 由于最近在作阅读引擎相关的工做,因此总结的文档大都和阅读引擎有关。若是对此不敢兴趣的同窗能够忽略掉。本文讲一下我以前分析FBReader时,对FBReader工程结构解析作的一个笔记总结。下面将分层次说明一下各个模块。html

一、依赖工程

(1)、AmbilWarna:

Android Color Picker application using AmbilWarna Color Picker Library
背景颜色选择器,用在设置背景颜色时,以及标签背景编辑时使用。
能够提取为一个模块。放到最后再提取,先整理主工程。java

移植遇到的坑比较多:
使用AmbilWarnaKotak和AmbilWarnaPrefWidgetView 的xml中的包名须要修改;
原来的为
yuku.ambilwarna.AmbilWarnaKotak
yuku.ambilwarna.widget.AmbilWarnaPrefWidgetView
修改后为,
com.thridapp.widget.AmbilWarnaKotak
com.thridapp.widget.AmbilWarnaPrefWidgetViewandroid

(2)、android-filechooser:

文件选择器,用来进行文件选择。
org.geometerplus.android.util.FileChooserUtil 须要关注,其它好像用途不大,项目中其它文件基本没有在使用。
包名为:group.pals.android.lib.ui.filechooser
能够暂时保留。git

(3)、drag-sort-listview:

拖动排序列表。
只有CatalogManagerActivity(目录管理界面)中使用了DragSortListView ,能够暂时忽略这个界面,RN端来实现。
因此此模块能够不用集成。github

包名为:com.mobeta.android.dslv
此模块能够删除。对应“在线书库” 中的“管理书库”菜单中的列表排序。CatalogManagerActivity 为对应的activity,能够将其删除。数据库

(4)、superToasts:

特殊的toast控件,在工程中使用的地方较多。
能够提取为一个模块,注意其中无用的文件能够删除掉。
包名为:com.github.johnpersano.supertoasts
此工程能够暂时保留。编程

二、jar库

(1)、httpmime-4.2.5.jar

HttpClient 是 Apache Jakarta Common 下的子项目,能够用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,而且它支持 HTTP 协议最新的版本和建议。json

(2)、json-simple-1.1.1.jar

JSON.simple是一个很简单的JSON处理,读取和写JSON数据的JAVA库,它彻底兼容JSON的标准(RFC4627)。你能够用JSON.simple来编码或解码JSON文本。api

(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文件中提取数据。

三、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 应该是插件管理器。

四、模块

(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

五、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格式文件。

六、AndroidManifest文件分析

若是只须要阅读引擎的话,全部的activity都应该清理掉,下面只分析一下Service和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各类技术干货或碎片化知识,以及整理老司机平常工做中踩过的坑涉及到的经验知识为主,也会不按期将正在学习使用的新技术总结出来进行分享。天天一点干货小知识把你的碎片时间充分利用起来。

相关文章
相关标签/搜索