Andorid开发调试之run-as

Posted by Codeboy on September 10, 2019

前言

Android开发中,经常会将一些文件放在内部目录中,即/data/data/pacakge_id中,db文件也在该目录中 ,在非root的手机中,我们无法直接访问 /data/data 下的文件,调试起来非常的不方便,解决的办法有几种:

  1. 找一台root的手机,想看什么看什么

  2. 断点调试,可以稍微麻烦的看到本应用的目录及文件

  3. 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_a27910279

小结

run-as 让可以在非root的手机上查看应用的私有目录,对开发调试来说非常的方便。

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。