irpas技术客

Android中的sqlite3的安装和使用, /system/xbin/sqlite3[1]: syntax error: ‘(‘ unexpected问题解

未知 4656

sqlite3简介:

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的安装条件:

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安装步骤:

先准备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资源链接:

Android-sqlite3命令-Android开发-sqlite3_armv7-Android文档类资源-CSDN下载包括如下版本:sqlite3,sqlite3_armv6,sqlite3_armv6-nofpu,更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/liranke/84998341


sqlite3,小巧玲珑


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Android #sqlite3