zoukankan      html  css  js  c++  java
  • Android开发使用run-as获取应用数据

    应用包名com.packagename。

    没有root权限的手机,使用adb shell无法直接获取到/data/data/com.packagename下的数据,因为没有访问的权限。

    这个时候,就可以使用run-as来获取应用数据协助开发调试。

    $ adb shell
    $ run-as com.packagename
    $ pwd
    /data/data/com.packagename      #run-as命令当前已自动切换到用户目录
    $ ls -l
    drwxrwx--x app_83 app_83 2010-01-17 08:01 files
    drwxrwx--x app_83 app_83 2010-01-17 08:01 databases
    drwxrwx--x app_83 app_83 2010-01-17 08:01 shared_prefs
    drwxr-xr-x system system 2010-01-17 08:01 lib
    $ ls databases
    test.db
    $ cat databases/skyAppStroe.db > /sdcard/test.db
    $ ls -l /sdcard/test.db
    ----rwxr-x system sdcard_rw 8192 2010-01-17 08:04 test.db
    $ exit
    $ pwd
    /

    注意:

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

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

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

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

    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 ");
    }

    /* 根据传入包名获取应用信息,失败则退出 */
    pkgname = argv[1];
    if (get_package_info(pkgname, &info) < 0) {
      panic("Package '%s' is unknown ", pkgname);
      return 1;
    }

    /* reject system packages */
    if (info.uid < AID_APP) {
      panic("Package '%s' is not an application ", pkgname);
      return 1;
    }

    /* 如果设置了android:debuggable="false",则退出 */
    if (!info.isDebuggable) {
      panic("Package '%s' is not debuggable ", pkgname);
      return 1;
    }

    /* 检查/data/data/com.packagename目录是否可用 */
    if (check_data_path(info.dataDir, info.uid) < 0) {
      panic("Package '%s' has corrupt installation ", 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 ", 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 ");
      return 1;
    }

    /* 用户在包名参数后指定了要执行的命令,就执行这个命令 */
    if (argc >= 3 ) {
      if (execvp(argv[2], argv+2) < 0) {
        panic("exec failed for %s Error:%s ", argv[2], strerror(errno));
        return -errno;
      }
    }

    /* 用户没有传入要执行的命令,执行默认的shell命令子进程,此时可以执行exit命令退出 */
    execlp("/system/bin/sh", "sh", NULL);

    panic("exec failed ");
    return 1;

    参考:

    http://www.iandroid.cn/bbs/android-1506-1-1.html

    http://www.cnblogs.com/over140/archive/2012/06/13/2547706.html

  • 相关阅读:
    偏倚有感
    SAS--修改默认语言
    SAS--EXCEL读写、批量读EXCEL
    SAS--sql2
    Day2----respondToValue
    python的一些遗漏用法
    一些常见的东西
    爬虫学习06用selenium爬取空间
    爬虫学习04.
    爬虫学习03常用模块
  • 原文地址:https://www.cnblogs.com/daemon369/p/3227309.html
Copyright © 2011-2022 走看看