有个测试机里没有自带sqlite,记录了一下安装过程。以防遗忘
(一)第一步:root
使用百度一键root 等app,一键就可root,步骤略
(二)
1、执行
adb shell su 获得root权限 ls 查看当前目录
cd data/data ls
选com.tencent.cm为例
cd com.tencent.cm/database ls
看到里边有一些 .db数据库文件
这时候,执行
sqlite3 tes_db.db
如果你的设备中有sqlite3,这句应该会执行成功,接下来就可以 执行select 语句了,
----------------------------------------------------------------下边就不用看了--------------------------------------------------------------
本文主要说明 一些小米和其他手机中没有sqlite3的情况,和我一样,执行会发现
sqlite3:not found
附 Android的每个版本对应的sqlite3 版本:
SQLite 3.8.4.3: 21-5.0-Lollipop 20-Android L Developer Preview
SQLite 3.7.11: 19-4.4-KitKat 18-4.3-Jelly Bean 17-4.2-Jelly Bean 16-4.1-Jelly Bean
SQLite 3.7.4: 15-4.0.3-Ice Cream Sandwich 14-4.0-Ice Cream Sandwich 13-3.2-Honeycomb 12-3.1-Honeycomb 11-3.0-Honeycomb
SQLite 3.6.22: 10-2.3.3-Gingerbread 9-2.3.1-Gingerbread 8-2.2-Froyo
SQLite 3.5.9: 7-2.1-Eclair 4-1.6-Donut 3-1.5-Cupcake
Note: Android SDK level links show where the android.database.sqlite package has changed. Where there is no link (e.g. SDK level 17), indicates no changes to that package.
Note: Here are some anomalies (list by no means exhaustive): SQLite 3.7.13 (instead of 3.7.11): LG Optimus L70 MS323 LGMS323|KOT49I.MS32310b (19-4.4-KitKat) LG Optimus G E975 LG-E975|JZO54K (16-4.1-Jelly Bean) LG G2 D802 LG-D802|JDQ39B (17-4.2-Jelly Bean)
SQLite 3.7.6.3 (instead of 3.6.22): LG Optimus Sol E730/myTouch E739/myTouch Q C800 (10-2.3.3-Gingerbread, GRJ22) LG Optimus Vu F100S/F100L (10-2.3.3-Gingerbread, RK39F) LG Optimus LTE TAG F120K/F120L (10-2.3.3-Gingerbread, GRK39F) LG Optimus LTE L-01D (10-2.3.3-Gingerbread, GRJ90) LG Optimus Net P690b (10-2.3.3-Gingerbread, GINGERBREAD) LG Prada KU5400 (10-2.3.3-Gingerbread, GWK74) LG Prada P940 (10-2.3.3-Gingerbread, GWK74) LG LU6200/SU640 (10-2.3.3-Gingerbread, GRJ90)s
SQLite 3.7.5 (instead of 3.7.4): Samsung Galaxy Note (15-GT-N7000|IML74K.ZSLPF) Samsung Galaxy SII (15-SC-02C|IML74K.OMMP4 and GT-I9100|IML74K.DXLP7) Samsung Galaxy S Duos (15-GT-S7562|IMM76I.S7562XXBMD6) Samsung Galaxy Tab 7.7 (15-GT-P6810|IMM76D.ZSLP8)
SQLite 3.7.0.1 (instead of 3.6.22): LG Esteem MS910 (10-2.3.3-Gingerbread, GSE-_v.05) AndroTab (8-2.2-Froyo, 1.0.7100.0385) GPLUS MUSN M500 (8-2.2-Froyo, FRG83G)
SQLite 3.6.23.1 (instead of 3.5.9): Motorola Backflip MB300 (7-2.1-Eclair, ERD79) Garmin-Asus nüvifone A10/A50/Garminfone (7-2.1-Eclair, ERE27) Note: adb command to get SQLite version only works on emulators and on devices with sqlite3 available: http://stackoverflow.com/a/3645800/444761
比较简单的获取对应版本的Sqlite的方法:
1、查看你手机的Andorid的版本,比如我的是 4.3 2、在eclipse中打开对应版本(很重要,否则会提示cannot locate 'sqlite3_enable_load_extensions')的模拟器(创建 如果没有)并且启动 3、在DDMS窗口的File Explorer面板下展开system > xbin 看到了sqlite3 了么?ok。点击右上角的软盘图标(pull a file from the device) 将其保存到其他位置 4、然后连接你的手机,打开控制台,输入adb shell。(什么?提示adb命令无效?那去配置环境变量吧) 5、然后查看一下提示符 如果是 # 那就不用管了,如果是 $ ,那么说明你需要获得root权限进行下面的操作 6、保持手机屏幕没有锁屏最好是常亮模式 在提示符下敲入 su 或者 su root,如果手机弹框提示是否允许获得root权限请选择 是。点击后发现 $ 变成 # 了。OK 可以进行下面的操作了 7、将先前保存其他位置的sqlite3 在DDMS面板中通过右上角手机图标(push a file onto the device) 将文件push到sdcard中,准确的是在/mnt/sdcard 8、然后在命令行敲入 cat /mnt/sdcard/sqlite3 > /system/xbin/sqlite3 复制文件(为什么不用mv?我也试过,不过报failed on '/sdcard/test.mp3' - Cross-device link 错误) 9、ok,检查手机/system/xbin下多了一个sqlite3文件,不过还不能执行。 10、继续敲入 chmod 4755 /system/xbin/sqlite3 好的 大功告成。你可以试试敲入sqlite3试试了。可以看到可以正常使用了。
-------------------------------------------------------------如果你成功了,不用看下边-------------------------------------------------------------------------
首先,机器上没有对应android 4.3的avd,所以参考http://www.cnblogs.com/localhost/archive/2012/04/09/2439558.html的方法
下载了sqlite3文件包,地址为http://files.cnblogs.com/localhost/sqlite3_not_found.rar(事实证明他这个包的版本,我不能用,他这个版本太老了)
下这个:http://pan.baidu.com/share/link?shareid=534077&uk=839950715
报了异常,因为直接push进 /system/xbin目录中了,没权限
建一个临时文件夹
push进这个临时文件夹中
再将sqlite3从
/mnt/sdcard/tmp
拷贝到
/system/xbin 目录中,不会报错
cp /mnt/sdcard/tmp/sqlite3 /system/xbin/sqlite3
注意:这一步可能报两种错,
第一种: cp not found,将命令换成cat /mnt/sdcard/tmp/sqlite3 > /system/xbin/sqlite3,
第二种:permission denied,说明/system是只读的,此时需要重新mount,改为可读写,然后继续拷贝
为什么除了sqlite3,还要push进去libncurse.so,因为缺乏依赖库,报了以下异常
我的出现了第二种权限错误 ,执行mount操作
mount -o remount,rw /system
mount命令的解释在 http://blog.csdn.net/progbelief/article/details/6032518
重点解释这条语句的作用 mount -o remount,rw -t yaffs2 /dev/block/mtdblock6 /system 简单来说就是将块设备“/dev/block/mtdblock6” 挂载到/system目录上,挂载格式为yaffs2,这里主要的问题是“/dev/block/mtdblock6”是个什么东东。 mtdblock就是手机 的flash存储设备,但是这个分块号则依机型的不同而有所变化,比如:Droid 的/system是挂载在/dev/block/mtdblock4上的,欧版的milestone 在/dev/block/mtdblock7上,港版的在/dev/block/mtdblock6上,HTC 系列的机器 则好像是在/dev/block/mtdblock3上。而现在有的教程 上写的命令不尽相同,也有这样写的 mount -o remount,rw /dev/block/mtdblock3 /system 这多半上从HTC的论坛 上抄来的吧。 但是有些人可能会说,我就是用这条命令成功了!(好吧,其实我也是的……汗,真是好险 ),甚至用任何分块号mtdblock3、mtdblock4、mtdblock11等等都能正常运行!那么这种错误命令为什么能成功呢?其实我们的命令参数“-o remount”其实自动 忽略了/dev/block/mtdblock? 这一段参数,只是简单的把/system重新挂载了一下而已。这条命令的偷懒不知道救回了多少人的爱机啊! 好吧,说到这里大家应该明白了吧,虽然这条命令即使错误也可以成功,但你毕竟试图将一个错误的块挂载到/system上,悄有不慎肯定变砖。 所以强烈建议大家在执行此命令时使用 cat /proc/mtd 来检查下自己的JJ具体参数,再套用命令, 或者强烈建议新手使用 mount -o remount,rw /system 这样的简化命令来代替上述命令使用!
有了上边的解释, 获取你的设备mount信息,执行
mount
从屏幕列出来的mount数据中找到/system的mount信息,空格隔开的,第一列表示设备名,第二列表示目录,第三列表示文件系统,第四列表示权限。网上其他教程在这一步都直接列出了他们的命令,由于设备名和文件系统不一样,所以执行不成功
mount命令为:mount -o remount,rw -t 第三列信息 第一列信息 /system
如下图,注意看圈红的地方:
mount成功后,再执行上面说的文件copy的步骤,然后就能copy到 /system/xbin目录下了
需要改下文件的权限,命令:
chmod 4755 /system/xbin/sqlite3
最后运行下,sqlite3,发现成功了吧
---------------------------------------------------------------你又成功了,我又没有----------------------------------------------------------
执行了mount,结果如下(没有system啊,但是上边的 mount -o remount,rw /system 执行成功了,所以也无所谓了 ):
这时候执行sqlite3命令,出现了Illegal instruction错误
这大概说明,我的sqlite3版本不对,下了个比较新的: http://pan.baidu.com/share/link?shareid=534077&uk=839950715
拷进去,改权限,执行
成功
在sqlite的...> 状态退不出来的时候,一般是进入SQL数据语言模式了,此时输入个;(分号) 就可以退回到sqlite>状态
.quit 退出 sqlite .help 查看帮助
.schema 抓出数据库中所有的表
.tables 抓出数据库中所有的表和索引(都可以使用LIKE来匹配)
附:
sqlite的官网
http://www.sqlite.org/lang.html