赞
踩
Android系统采用了sqlite3数据库,这是一个关系型数据库,而且是一个轻量级的,广泛应用于嵌入式系统中。
最近,又在使用sqlite3了,遇到了下面的错误:
1). “/system/bin/sqlite3[1]: syntax error: '(' unexpected”;
2). error: only position independent executables (PIE) are supported;
3). CANNOT LINK EXECUTABLE: cannot locate symbol "uiter_setUTF8_51" referenced by "/system/lib/libsqlite.so"...
现将sqlite3的使用以及上述错误排除方法做一个总结。
sqlite3是一个可执行命令,在“adb shell“环境中使用。通常,位于/system/bin/ 或者/system/xbin/目录下。
如果你在adb shell命令行中,有如下的运行结果,恭喜你,你的sqlite3可以使用。
./sqlite3
SQLite version 3.8.11.1 2015-07-29 20:00:57
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
但是,很多时候,设备中中并没有sqlite3命令,这就需要用户手动安装。然而, 安装sqlite3并非易事,因为/system目录是不可写的,无法将sqlite3写入到systemm目录下的bin(xbin)目录中。
这就需要获取到root权限,只有root权限才可以操作system目录。并且,需要将其属性改为可写属性。但是,正常的手机无法获取root权限。 这样,就形成了死锁。
这里,针对“可获取到root权限”的手机,进行sqlite3的安装(即将其copy到/system/xbin)目录下。
先准备sqlite3文件,可以从模拟器中copy。我这里是一个以前从一个root过的真机中copy出来的。
然后将其push到/sdcard/tmp目录下,如果没有tmp目录,可以直接copy到/sdcard目录下。
% adb push sqlite3 /sdcard/tmp/
% adb shell
shell@hammerhead:/ $
1|shell@hammerhead:/sdcard $ cd /sdcard/tmp
我们的目的是将这个sqlite3 copy到/system/xbin下面。
此时,/system还是不可写的,所以,先改变起属性为可写属性,通过mount命令。
1|shell@hammerhead:/sdcard/tmp $ mount -o remount,rw /system
mount: Permission denied
可见,普通用户无权修改mount。只能用root用户来操作(我的手机事先已经root过了)
- 255|shell@hammerhead:/sdcard/tmp $ su
- root@hammerhead:/storage/emulated/0/tmp # mount -o remount,rw /system
-
- 1|root@hammerhead:/storage/emulated/0/tmp # cd /system/xbin
-
- 1|root@hammerhead:/system/xbin # cp /sdcard/tmp/sqlite3 .
-
- //再修改sqlite3的权限:
- 1|root@hammerhead:/system/xbin # chmod 4755 sqlite3
这样sqlite3就copy到/system/xbin/目录下了。
root@hammerhead:/system/xbin # ls
dexdump
sqlite3
wlutil
新的错误出现了:
松了以口气,赶紧试一下,结果,直接打脸:
1|root@hammerhead:/system/xbin # sqlite3
/system/xbin/sqlite3[1]: syntax error: '(' unexpected
这是因为Android设备中的shell命令行下,无法识别sqlite3命令,这个设备不兼容我的sqlite3文件。
于是,从网上重新找了几个sqlite3命令,重复上面的过程,终于成功。
在我的这个手机上,最后只有sqlite3.armv7-pie可以用:
sqlite3
sqlite3.armv7
sqlite3.armv7-pie //成功
运行结果:(sqlite3.armv7-pie)
- $ sqlite3.armv7-pie
- SQLite version 3.8.11.1 2015-07-29 20:00:57
- Enter ".help" for usage hints.
- Connected to a transient in-memory database.
- Use ".open FILENAME" to reopen on a persistent database.
- sqlite> .help
- .backup ?DB? FILE Backup DB (default "main") to FILE
- .bail on|off Stop after hitting an error. Default OFF
如果运行“./sqlite3.armv7”,就会出现如下错误:
error: only position independent executables (PIE) are supported.
期间,也试过将libsqlite3.so等copy到/system/lib目录下的方式,发生如下错误:
shell@hammerhead:/system/xbin $ ./sqlite3
CANNOT LINK EXECUTABLE: cannot locate symbol "uiter_setUTF8_51" referenced by "/system/lib/libsqlite.so"...
最后,附上sqlite3资源链接:
sqlite3,小巧玲珑
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。