我使用adb和以下命令连接到我的活动设备:
C:\>adb -s HT829GZ52000 shell
$ ls
ls
sqlite_stmt_journals
cache
sdcard
etc
system
sys
sbin
proc
logo.rle
init.trout.rc
init.rc
init.goldfish.rc
init
default.prop
data
root
dev
$ cd data
cd data
$ ls
ls
opendir failed, Permission denied
我惊讶地发现,我的访问被拒绝了。为什么我不能像这样使用命令行浏览目录呢?
我如何获得我手机的根权限?
从API级别8 (Android 2.2)开始,对于可调试的应用程序(一直由Android Studio构建,除非发布版本被请求),你可以使用shell run-as命令作为特定用户/应用程序运行命令或可执行文件,或者只是切换到应用程序的UID,这样你就可以访问它的数据目录。
列出yourapp的目录内容:
run-as com.yourapp ls -l /data/data/com.yourapp
切换到com的UID。然后使用该uid运行所有后续命令(直到调用exit):
run-as com.yourapp
cd /data/data/com.yourapp
ls -l
exit
注1:部分HTC Desire手机存在已知问题。由于“/data/data”目录的属主/权限不规范,run-as命令无法在这些话机上运行。
注2:正如@Avio在评论中指出的那样:
run-as在任何版本(从7到10.1)运行Cyanogenmod的三星Galaxy S手机上也有问题,因为在这个平台上/data/data是到/datadata的符号链接。解决这个问题的一种方法是用实际目录替换符号链接(不幸的是,这通常需要根访问)。
我在这方面也遇到了很多麻烦。我仍然不完全理解权限和根运行,但这对我来说是有效的(之前的答案之一),从/data/data/[包名]/databases/my_db.db复制数据库文件。由于某种原因,运行shell root或shell中的su不能工作,复制db文件也不行(尽管我可以导航到目录),sqlite3也不行。
所以,这是有效的!在DOS命令提示符中:
C:\Program Files\Android\android-sdk\platform-tools>adb shell
1|shell@android:/ $ run-as de.vogella.android.locationapi.maps
run-as de.vogella.android.locationapi.maps
1|shell@android:/data/data/de.vogella.android.locationapi.maps $ cd /data
cd /data
shell@android:/data $ cd data
cd data
shell@android:/data/data $ cd de.vogella.android.locationapi.maps
cd de.vogella.android.locationapi.maps
shell@android:/data/data/de.vogella.android.locationapi.maps $ cd databases
cd databases
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ ls
ls
bus_timetable_lines.db
bus_timetable_lines.db-journal
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ cat bus
_timetable_lines.db > /sdcard/db_copy.db
bus_timetable_lines.db > /sdcard/db_copy.db <
shell@android:/data/data/de.vogella.android.locationapi.maps/databases $exit ^
exit
shell@android:/ $ exit
exit
C:\Program Files\Android\android-sdk\platform-tools>
现在转到SDCARD目录,获取文件db_copy.db。连这个都藏起来了,但我还是发了邮件。回到Windows,我可以用SQLite数据库浏览器打开db文件。:)
在我们开始之前,你有手机吗?如果不是,我强烈建议你是时候跳槽了。99%的教程都要求你有一个root手机(我知道b/c我花了大约一个小时的时间来寻找一个没有root手机的方法。如果你仔细想想,你的iPhone也必须扎根才能完成同样的任务。所以这是完全合理的。更多关于在答案末尾进行根的内容。
从你的命令行输入:
adb shell
这将把你带到你的android shell命令行(你应该看到类似这样的东西:shell@android:/ $ now键入:
shell@android:/ $run-as com.domain.yourapp
这将直接带你到com.domain.yourapp的数据目录:
shell@android:/data/data/com.domain.yourapp $
如果它没有(即如果你得到一个错误),那么你可能没有根电话,或者你没有使用你的根用户特权。要使用您的根用户权限,在adb命令行上键入su,看看会发生什么,如果您得到一个错误,那么您的电话不是根用户。如果不是,请先将其根化,然后继续执行这些说明。
从那里你可以输入ls,你会看到所有的目录,包括dbs:
shell@android:/data/data/com.domain.yourapp $ ls
cache
databases
lib
shared_prefs
之后,您可以使用sqlite3来浏览dbase..如果你没有安装它(你可以通过输入sqlite3找到它,如果你没有找到命令,那么你必须安装它。要安装sqlite,请遵循此处的说明。
关于根:如果你以前从未给你的手机根过根,你担心它会弄坏你的手机,我可以满怀信心地告诉你,没什么好担心的。有大量的快速和简单的手机根教程,几乎所有的新老型号在那里,你可以根你的手机,即使你有mac(我用我的mac根我的s3)。
如果你只是想看到你的数据库和表,那么最简单的方法是使用Stetho。非常酷的工具,每个Android开发者谁使用SQLite buit由Facobook开发。
工具使用步骤
在应用程序的gradle文件中添加以下依赖项
“编译”com.facebook.stetho: stetho: 1.4.2
在Activity onCreate()方法中添加以下代码行
@Override
onCreate(Bundle savedInstanceState)
super.onCreate (savedInstanceState);
Stetho.initializeWithDefaults(这个);
setContentView (R.layout.activity_main);
}
现在,构建您的应用程序&当应用程序正在运行时,您可以浏览您的应用程序数据库,通过在url中打开chrome:
chrome://inspect/#devices
其截图如下_
ChromeInspact
你的数据库
希望对大家有所帮助!:)