昨天是腊月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。

<!-- 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各种技术干货或碎片化知识,以及整理老司机日常工作中踩过的坑涉及到的经验知识为主,也会不定期将正在学习使用的新技术总结出来进行分享。每天一点干货小知识把你的碎片时间充分利用起来。

转载于:https://www.cnblogs.com/laoxiao79/p/8490604.html

FBReader工程结构解析相关推荐

  1. 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析...

    1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...

  2. Visual Studio的工程结构解析

    废话不多说,首先查看下一个简单的sln文件结构 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio  ...

  3. go项目标准化工程结构解析

    目录 1. Go标准项目结构目录 /cmd /internal /pkg /API /WEB /configs /scripts /build /deployments /test /docs 2. ...

  4. android ndk怎样加载o文件_JNI初探之NDK 开发环境配置

    安装 CMake.LLDB与NDK 开发工具包 CMake 简介 CMake 是一款比make更强大的编译自动配置工具,它可以根据不同平台.不同的编译器,并通过CMakeLists.txt文件中简单的 ...

  5. 14天学会安卓开发(附PDF文档和全部示例代码)

    前言: 本人也是菜鸟,老鸟看了此文有哪里不好之处敬请指点,本书是根据<<Android应用开发揭秘>>攒写的,如何把一本书读薄,是一件值得思考的问题.相信看过那本书的都知道有5 ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》

    开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>--(1).And ...

  7. 【亿可控】第一天系统分析与设计

    第1章 亿可控系统分析与设计 学习目标 了解物联网应用领域及发展现状 能够说出亿可控的核心功能 能够画出亿可控的系统架构图 能够完成亿可控环境的准备并了解亿可控的功能结构 完成设备管理相关功能的开发 ...

  8. spring boot基础简介

    一.    创建方式 1.1  spring initializer 可以在IDE中安装springinitializer插件,选择SDK和输入URL,选择需要依赖的模块即可自动创建工程. 1.2   ...

  9. 亿可控_第1章_系统分析与设计

    亿可控_第1章_系统分析与设计 文章目录 亿可控_第1章_系统分析与设计 第1章 亿可控系统分析与设计 学习目标 1.物联网行业分析 1.1 什么是物联网 1.2 物联网应用领域 1.3 物联网发展现 ...

  10. Java物联网企业级项目 亿可控系统分析与设计

    第1章 亿可控系统分析与设计 学习目标 了解物联网应用领域及发展现状 能够说出亿可控的核心功能 能够画出亿可控的系统架构图 能够完成亿可控环境的准备并了解亿可控的功能结构 完成设备管理相关功能的开发 ...

最新文章

  1. react 监听组合键_投资组合中需要的5个React项目
  2. Oracle入门第四天(上)——表管理与数据处理
  3. [MetalKit]34-Working-with-memory-in-Metal内存管理
  4. ilistT 与listT 之间的相互转换
  5. Anaconda套件,精簡版miniconda
  6. MySQL 中NULL和空值的区别
  7. Vue3 组件通信学习笔记
  8. css3-3 css3背景样式
  9. 有关上次的字符串是否相等的比较
  10. 【COCOS2D-HTML5 开发之一】新建HTML5项目及简单阐述与COCOS2D/X引擎关系
  11. 解决Required String parameter xxx is not present异常
  12. Jenkins下载插件,报java.net.SocketTimeoutException: Read timed out
  13. element表格头部换行
  14. VMware Explore 2022 China,赋能中国企业加速实现云智能
  15. 完全平方数-动态规划
  16. Unity 贴花/喷漆功能的原理、Projector组件的原理与优化
  17. QQ技术全攻略(原来简单的QQ,还隐藏着这么多秘密!)
  18. php地铁,php 抓取自如友家首页的区域和地铁数据
  19. D. Empty Graph(贪心/二分)
  20. Power BI /Power BI Pro账户等基本概念介绍

热门文章

  1. 腾讯VS华为:2021“渠道战争”第一枪
  2. 团队项目计划、人员安排、方法流程
  3. Linux服务器之Redis集群搭建
  4. 探索GIS+物联网应用场景 MapGIS IoT实时大数据解决方案
  5. Python编写微信打飞机小游戏(二)
  6. 猿创征文|我的技术成长之路C++
  7. @Aspect不生效
  8. 筛选过的 Code rule
  9. Blow Up 3macOS图片放大锐利的详细使用教程与安装方法
  10. 如果能重来,我不会选择北漂——初见北京