前言
Android开发中,经常会将一些文件放在内部目录中,即/data/data/pacakge_id
中,db文件也在该目录中 ,在非root的手机中,我们无法直接访问 /data/data
下的文件,调试起来非常的不方便,解决的办法有几种:
-
找一台root的手机,想看什么看什么
-
断点调试,可以稍微麻烦的看到本应用的目录及文件
-
run-as命令
前两种并不陌生,本文来讲解一下第三个run-as
。
run-as
run-as
命令可以获取debug应用的私有数据,在调试debug包的时候,可以使用该命令将用户切换到系统分配给debug应用的用户上,之后就可以访问其私有数据。下面以我的一个测试应用me.codeboy.test
为例看一下:
➜ ~ adb shell
chiron:/ $ whoami
shell
chiron:/ $ ls /data/data/me.codeboy.test
ls: /data/data/me.codeboy.test: Permission denied
1|chiron:/ $ run-as me.codeboy.test
chiron:/data/data/me.codeboy.test $ ls
cache code_cache shared_prefs
chiron:/data/data/me.codeboy.test $ whoami
u0_a279
可以看出在默认的shell环境下,用户身份是shell
,无法查看应用的私有数据,运行 run-as
后,身份切换了 u0_a279
,这个用户其实是测试应用的uid,也可以自由的访问其私有目录。
Android中每一个应用都有一个uid,可以通过以下方式获取:
try {
PackageManager pm = getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo("me.codeboy.test", 0);
Toast.makeText(MainActivity.this, Integer.toString(ai.uid,10), Toast.LENGTH_SHORT).show();
} catch (PackageManager.NameNotFoundException e) {
}
执行后,输出的结果是10279。
每个Android应用程序的u0_axxx都是不一样的,同时uid是从10000开始,u0_a后面的数字加上10000所得的值,既是uid,这个和测试应用的输出也非常的吻合,即u0_a279
和 10279
。
小结
run-as
让可以在非root的手机上查看应用的私有目录,对开发调试来说非常的方便。
如有任何知识产权、版权问题或理论错误,还请指正。
转载请注明原作者及以上信息。