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 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 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>

    
    <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>

    
    <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>

    
    <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"/>

    
    <service android:name="group.pals.android.lib.ui.filechooser.services.LocalFileProvider"
        android:exported="false"/>

综上,以上就是整个FBReader工程的一个结构解析,再深入分析就需要研究每个activity,service或者具体类了,希望以上总结能给你带来帮助。

这里写图片描述
本公众号将以推送Android各种技术干货或碎片化知识,以及整理老司机日常工作中踩过的坑涉及到的经验知识为主,也会不定期将正在学习使用的新技术总结出来进行分享。每天一点干货小知识把你的碎片时间充分利用起来。

你可能感兴趣的:(Android,阅读引擎,经验&amp;总结)