当我尝试使用 adb shell 打开数据库时,为啥在根植的 Nexus One 上出现“sqlite3:未找到”错误?

Posted

技术标签:

【中文标题】当我尝试使用 adb shell 打开数据库时,为啥在根植的 Nexus One 上出现“sqlite3:未找到”错误?【英文标题】:Why do I get a "sqlite3: not found" error on a rooted Nexus One when I try to open a database using the adb shell?当我尝试使用 adb shell 打开数据库时,为什么在根植的 Nexus One 上出现“sqlite3:未找到”错误? 【发布时间】:2011-04-08 09:38:55 【问题描述】:
# sqlite3 /data/data/com.moodme.android/databases/moodme
sqlite3 /data/data/com.moodme.android/databases/moodme
sqlite3: not found

【问题讨论】:

另一个相关答案***.com/a/60892396/2655092 【参考方案1】:

作为替代方案(尽管可能不安全甚至是好主意),您始终可以将 sqlite3 二进制文件上传到 /system/bin 这对我有用:

首先让我们挂载/system/ 以允许读/写(rw)

$ adb shell
$ su
# mount -o remount,rw /system

在另一个终端更改目录 (cd) 到 sqlite3 所在的位置,然后推送它

$ ls
sqlite3
$ adb push sqlite3 /sdcard/

现在回到另一个 shell,让我们复制和更改二进制文件的权限

# cat /sdcard/sqlite3 > /system/bin/sqlite3
# chmod 4755 /system/bin/sqlite3

现在让 /system/ 以只读方式挂载 (ro)

# mount -o remount,ro /system

现在我们可以在 shell 中使用 sqlite3:

# sqlite3 /data/data/com.telly/databases/fun.db
SQLite version 3.7.4
Enter ".help" for instructions
sqlite> .tables
android_metadata  lulz               

注意我使用的是“SuperOneClickv1.6.5-ShortFuse”附带的 sqlite3 二进制文件

您始终可以从模拟器中提取sqlite3 二进制文件:

启动模拟器,然后从终端启动

$ adb pull /system/xbin/sqlite3

如果你像我一样懒惰,你可以download one right here for ICS or before 或Jelly Bean and later here

请确保为您的 Android 版本使用正确的版本,因为您可能会在执行时收到 eloc_library[1306]: 14446 cannot locate 'sqlite3_enable_load_extension'... 或类似错误

【讨论】:

你能告诉我在哪里可以找到姜饼上 NexusOne 的 sqlite3 吗?谢谢。 如果我们能在应用程序中为我们的用户解决问题,我们会很高兴! 您在哪里可以找到为您的设备构建的 sqlite3 命令?还是你自己建造? 为了让 sqlite3 到 bin 目录,我像 adb push sqlite3 /sdcard 一样将它推送到 sdcard。然后我 abd shell;苏; cp /sdcard/sqlite3 /system/bin/sqlite3.这对我有用。 这是 SQLite SQLite 版本 3.8.6 2014-08-15 s000.tinyupload.com/index.php?file_id=52096553461674354126 的链接,以防您在最近的操作系统中遇到“SQLite 标头和源版本不匹配”错误(我收到此错误是Android L)【参考方案2】:

在 Android 模拟器上,sqlite3 位于 /system/xbin 中。 Nexus One (Android 2.2) 上没有 /system/xbin。因此,我怀疑 Nexus One 上没有安装 sqlite3

【讨论】:

如果你安装了 cyanogenmod,它的 shell 中有 sqlite3。 但是设备不需要它来创建和读取 sqlite3 数据库吗?另外,如果它不在 Nexus One 上,有没有办法让它在那里? @Julian:“但是设备不需要它来创建和读取 sqlite3 数据库吗?” ——为什么会这样? SQLite 是一个库,通过 JNI 附加到 Android 应用程序。 sqlite3 是一个命令行可执行文件。 “另外,如果它不在 Nexus One 上,有没有办法让它放在那里?” -- 欢迎您尝试找到一个 ARM 端口,看看您是否可以让它工作。不过,我怀疑它是否真的可以解决您认为遇到的任何问题。 Android 应用程序不需要它。对于开发,您可以将数据库从您的 root 手机中提取出来,然后在您的开发机器上进行检查。 @Julian:在模拟器上,没有。在设备上,是的,是否已植根。此外,如果您是 Eclipse 用户,您可能想看看 MOTODEV Studio for Android。我似乎记得他们有一个用于模拟器数据库的集成 SQLite 编辑器,这可能适用于你的 root 手机。在幕后,它可能只是拉动,但它可能更方便。 @IgorGanapolsky:不能保证命令行sqlite3 客户端二进制文件将存在于任何设备上。【参考方案3】:

根据 evelio 的回答,我在将 sqlite3 文件推送到 /system/bin 时遇到问题。因此,我将其推送到 /sdcard。

在这个线程中,我找到了正确的解决方案(Kila 的答案): How can I install sqlite3 on rooted NexusOne runs Gingerbread

$ adb push sqlite3 /sdcard/
$ adb shell
$ su
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
# dd if=/sdcard/sqlite3 of=/system/bin/sqlite3
# chmod 4755 /system/bin/sqlite3
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system 

它适用于我的三星 Galaxy S II 2.3.3。

【讨论】:

使用来自 SuperOneClick (shortfuse.org/?page_id=2 / download.cnet.com/SuperOneClick/3000-2094_4-75447027.html) 的 sqlite3 二进制文件在运行 Android ICS 4.0.4 的根植 Nexus-S 上工作 在 GT-i9100 4.03 ICS 上工作,方法是从模拟器中拉出 sqlite3,然后按照说明向上推。 它在我的带有 ICS 的 Galaxy s II 上工作,但随着更新到 4.1 JB,我有以下错误找不到'sqlite3_enable_load_extension'...无法链接可执行文件【参考方案4】:

要在非根设备上安装 sqlite3,这是一种已被证明适用于我的 Galaxy S3,FYR 的方法。

$ adb -e pull /system/xbin/sqlite3  # get sqlite3 binary from emulator with the same CPU arch.
$ adb -d push sqlite3 /mnt/sdcard   # push it
$ adb -d shell
$ run-as <PACKAGE_NAME>             # run as your app, which should be debuggable.
$ cd databases; pwd
/data/data/<PACKAGE_NAME>/databases
$ cat /mnt/sdcard/sqlite3 > sqlite3 # copy it to internal storage directory
$ ls -l sqlite3
-rw-rw-rw- u0_a138  u0_a138     36860 2014-03-26 06:37 sqlite3
$ chmod 777 sqlite3                 # change mode bits, to be executable

$ ./sqlite3                         # now it works on your NON-ROOTED device
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

【讨论】:

我的权限被拒绝 还试图让它在非根 4.4 设备上工作。您的步骤几乎可以工作,只是在使用 run-as 应用程序用户帐户后不再具有 /mnt/sdcard 的权限(用于在较旧的 Android 版本中工作;必须是最近的更改)。我通过将 sqlite3 二进制文件放在应用程序资产文件夹中,然后在第一次运行应用程序时将其解压缩到数据库文件夹来解决这部分问题。 我在使用 ./sqlite3 时得到 sh: ./sqlite3: not executable: magic 7F45 @AndroidDeveloper 听起来你放在那里的 sqlite3 用于不同的架构。确保从与目标设备具有相同架构的模拟器中提取它,正如 Jeremy 在第一行评论中所写的那样。 @AndroidDeveloper 您可能不小心推送了 x86 或 x86_64 的平台工具(与 adb 所在的文件夹相同)中包含的 sqlite3。【参考方案5】:

在 Nexus 4 上执行以下操作:

adb shell
$ su
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
# dd if=/sdcard/sqlite3 of=/system/xbin/sqlite3
# chmod 777 /system/xbin/sqlite3
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system

注意文件夹是 /system/xbin,chmod 是 777

【讨论】:

这适用于我的 nexus 4 和 kitkat ,从模拟器 /system/xbin 文件夹中获取的 sqlite3 二进制文件【参考方案6】:

更多信息可能有助于解决此问题

对于那些想知道从哪里获得一个可以工作的 sqilte3 文件二进制文件来复制的人:

您可以使用模拟器来获取工作二进制文件。您必须先检查您的构建是否基于 _86、_64 或 ARM 并复制此映像,否则您可能会得到一个不兼容的版本,从而导致错误。

检查您的安卓设备是哪个版本

https://www.quora.com/How-can-I-check-whether-my-Android-phone-is-32-bit-or-64-bit

在 android studio 中构建 ARM

Android Studio - How Can I Make an AVD With ARM Instead of HAXM?

然后,使用下面的注释在您的机器之间移动文件并返回到 android 设备。

使 adb 可写

Android Emulator sdcard push error: Read-only file system

将文件从 adb 复制到本地设备机器

How to copy selected files from Android with adb pull

在 root 设备 nexus 4 上,这些链接与此页面上的说明有效。希望它可以帮助某人。关键是您需要挂载才能通过 adb 在设备中获得写入权限。

【讨论】:

以上是关于当我尝试使用 adb shell 打开数据库时,为啥在根植的 Nexus One 上出现“sqlite3:未找到”错误?的主要内容,如果未能解决你的问题,请参考以下文章

adb shell 端口占用

ADB 拒绝 shell 命令 (ls -l ): 关闭

执行 chmod 时 ADB Shell 给出错误模式(在 su 下)

手机无法进入adb shell

运行 adb shell 命令时 #adb shell 与 #adb -e shell 之间的区别

运行“adb shell wm density 240”以更改Android设备密度时出错