有时我会在手机上安装一些类似电子书的程序。称其为类似,是因为一方面我只关心它的内容(如同电子书);另一方面,它们被包装成程序,想要做摘抄之类的操作会很痛苦。
不过,对于大多数程序来说,可以把资源提取出来。(通常作者不太会没事做用二进制或加密资源吧)
拿 Brilliant Quotes 这个程序举例(从 Market 直接下载)。
首先,将程序以 apk 的格式备份到存储卡。这一步可以使用多种工具,如豌豆荚就可以。(几乎任何备份软件都可以)
从 Google Code 搜索 android-apktool 项目,下载 apktool-ver-tar.bz2 及 apktool-install-windows-ver-tar.bz2。将下载文件解压到任意文件夹,按“apktool d apk_文件名 解压目录名”的格式输入命令进行解压。
然后,将包含有你需要的文本的文件找出来就行。简单的几行 Groovy 可以让你免于四处手工寻找
1: key = 'A first rate soup'
2: path = 'C://Users//hiarcs//Desktop//New folder//bri'
3:
4: new File(path).eachFileRecurse {
5: if(it.file && it.text.contains(key)) println it.absolutePath
6: }
查看输出,发现路径为:C:/Users/hiarcs/Desktop/New folder/bri/res/raw/bq_data.txt
现在,找到这个文件,把它塞进 Kindle 吧。
PS: 以后再找先手动翻下 res/raw 这个文件夹,说不定这是习惯位置。
不过当打开文档的时候,我真的吓了一跳。整个文档居然是个 SQL 文件!
这就闻所未闻了,再次开始解析,毕竟我只关心两个字段:author, quote
1: qs = [:]
2: pf = "INSERT into quotes(author, author_id, body, isfavourite, category) VALUES ('"
3: new File('C://Users//hiarcs//Desktop//bq_data.txt').eachLine { line ->
4: if(line.startsWith('INSERT into quotes')) {
5: author = (line - pf).split("'")[0]
6: quote = line.split('"')[1].replaceAll("''", "'")
7: if(!qs.containsKey(author)) qs.put(author, [])
8: qs.get(author) << quote
9: }
10: }
11: sb = new StringBuffer()
12: qs.each { author, quotes -> sb <<"$author/n${quotes.join("/n")}/n/n" }
13: new File('C://Users//hiarcs//Desktop//quotes.txt').write(sb.toString())
解析过程非常简单,无非就是掐头去尾,外加替换单引号而已。
PS II: 最近看到了两个 Android 下 SQLite 数据库的设计,发现大家通常仅仅把它当作数据持久化的手段而不太愿意在其数据库结构上下功夫,结果就是很多很奇特很多冗余的表结构。(比如上面的文本中 author 的冗余)