从 Android 程序中提取文本资源

有时我会在手机上安装一些类似电子书的程序。称其为类似,是因为一方面我只关心它的内容(如同电子书);另一方面,它们被包装成程序,想要做摘抄之类的操作会很痛苦。

不过,对于大多数程序来说,可以把资源提取出来。(通常作者不太会没事做用二进制或加密资源吧)

拿 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 的冗余)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值