run as 没有android,使用run-as来获取Android应用私有数据

假设我们开发的应用的应用包名为:com.packagename。

关于run-as

run-as是Android系统中的一个小应用,可以辅助我们进行Android程序的开发。

我们在开发Android应用的时候,有的时候希望能获取到保存到手机盘应用私有目录/data/data/com.packagename下的数据来验证开发的应用是否达到预期结果,或者获取写到私有目录的log日志文件来进行debug工作。

但是在没有root权限的手机中,我们是无法直接使用adb shell来获取到/data/data/com.packagename下的数据,因为我们没有这个目录的访问权限。

这个时候,run-as程序就可以派上用场了。

run-as的用法

见注释:

$ adb shell      #执行adb shell命令连接手机设备

$ run-as com.packagename       #执行run-as命令切换当前用户

$ pwd

/data/data/com.packagename      #run-as命令当前已自动切换到用户目录

$ ls -l       #可以看到,当前目录下文件夹,非应用本身是没有r和w权限的

drwxrwx--x app_83 app_83 2013-01-17 08:01 files

drwxrwx--x app_83 app_83 2013-01-17 08:01 databases

drwxrwx--x app_83 app_83 2013-01-17 08:01 shared_prefs

drwxr-xr-x system system 2013-01-17 08:01 lib

$ ls databases

test.db

$ cat databases/test.db > /sdcard/test_sd.db     #使用cat命令导出需要的文件到sd卡

$ ls -l /sdcard/test_sd.db

----rwxr-x system sdcard_rw 8192 2013-01-17 08:04 test_sd.db

$ exit

$ pwd

/

Tips

注意:

1.使用run-as后,是无法使用cp命令将应用数据拷贝到sd卡的,没有权限

2.如果apk已经签名,并且设置了android:debuggable="false",将无法使用该命令。

3.如果无法使用run-as来直接获取应用数据,可以在自己的应用里实现读取应用数据到sd卡的功能,应用本身对自己的数据是有访问权限的。

4./data/data/com.packagename/lib目录不需要执行run-as就拥有访问权限,为apk间共享so提供了便利

run-as代码分析

android2.3.3_r1中run-as.c中主要代码:

/* 没有传入包名则退出 */

if (argc < 2)

usage();

/* 非'shell'用户或'root'用户则退出 */

myuid = getuid();

if (myuid != AID_SHELL && myuid != AID_ROOT) {

panic("only 'shell' or 'root' users can run this program\n");

}

/* 根据传入包名获取应用信息,失败则退出 */

pkgname = argv[1];

if (get_package_info(pkgname, &info) < 0) {

panic("Package '%s' is unknown\n", pkgname);

return 1;

}

/* reject system packages */

if (info.uid < AID_APP) {

panic("Package '%s' is not an application\n", pkgname);

return 1;

}

/* 如果设置了android:debuggable="false",则退出 */

if (!info.isDebuggable) {

panic("Package '%s' is not debuggable\n", pkgname);

return 1;

}

/* 检查/data/data/com.packagename目录是否可用 */

if (check_data_path(info.dataDir, info.uid) < 0) {

panic("Package '%s' has corrupt installation\n", pkgname);

return 1;

}

/* 切换当前工作目录为/data/data/com.packagename,失败则退出 */

{

int ret;

do {

ret = chdir(info.dataDir);

} while (ret < 0 && errno == EINTR);

if (ret < 0) {

panic("Could not cd to package's data directory: %s\n", strerror(errno));

return 1;

}

}

/* Ensure that we change all real/effective/saved IDs at the

* same time to avoid nasty surprises.

*/

/* 切换真实/有效/saved 用户ID和组ID*/

uid = gid = info.uid;

if(setresgid(gid,gid,gid) || setresuid(uid,uid,uid)) {

panic("Permission denied\n");

return 1;

}

/* 用户在包名参数后指定了要执行的命令,就执行这个命令 */

if (argc >= 3 ) {

if (execvp(argv[2], argv+2) < 0) {

panic("exec failed for %s Error:%s\n", argv[2], strerror(errno));

return -errno;

}

}

/* 用户没有传入要执行的命令,执行默认的shell命令子进程,此时可以执行exit命令退出 */

execlp("/system/bin/sh", "sh", NULL);

panic("exec failed\n");

return 1;

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值