macos app获取android设备/data目录文件

最近有客户提到一个需求,如下:


image.png

他要导出whatsapp程序下面的xml数据,并再手动输入用户手机号以及国家区号之后生成一个json文件,我们都知道/data/data目录存放存储包私有数据,对于设备中每一个安装的 App,系统都会在内部存储空间的 data/data 目录下以应用包名为名字自动创建与之对应的文件夹。
用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。
该目录下又把存储内容进行了分类:

data/data/包名/cache: 存放的 APP 的缓存信息
data/data/包名/databases: 存放 APP 的数据库信息
data/data/包名/files: 存放 APP 的文件信息
data/data/包名/shared_prefs: 存放 APP 内的 SharedPreferences

所以他这个数据比较隐私,如果手机没有root的话是没有权限获取的,为了做这个小功能再把我小米手机root一下?感觉不太好,于是下载了genymotion模拟器,我也不知道为啥我的genymotion好像一直都有root权限,这块我没太弄明白,有清楚的人可以给我留言。
因为用户要的是macos的app,所以需要在macos app里面获取genymotion模拟器里面的/data/data数据,经过一番研究最终通过:


image.png

在程序你面添加:

rm -rf ~/Downloads/keystore.xml
~/Library/Android/sdk/platform-tools/adb pull /data/data/com.whatsapp/shared_prefs/keystore.xml    ~/Downloads/keystore.xml

通过adb的pull命令可以把设备里面的文件拷到外面,这里需要设置程序权限:

image.png

最后效果:
https://www.youtube.com/watch?v=mpXtJ-lM480&feature=youtu.be

本项目源码

拓展

如果在安卓上访问别的apk的私密数据该怎么做呢?
Java的File类可以对文件做一系列操作。开始的思路是通过File.listFiles()来获取目标应用的子文件列表,然后对指定的文件进行exists()判断。但是当进入到包名下的一个目录时,里面的文件夹用isDirectory()和isFile()判断,返回的都是false,同时用canRead()做判断,返回的也是false。判断是文件访问权限的问题,但是通过chmod 744之后,canRead()仍然返回false。看样子通过File对/data分区的操作仍然受系统安全性限制。
后来找到了另外一种方法来判断,通过执行shell命令ls -R ,获取指定应用目录下文件的列表,从而判断文件是否存在。
这是执行shell命令的方法

    public static ArrayList execCmdsforResult(String[] cmds) {
        ArrayList list = new ArrayList();
        try {
            Process process = Runtime.getRuntime().exec("su");
            OutputStream os = process.getOutputStream();
            process.getErrorStream();
            InputStream is = process.getInputStream();
            int i = cmds.length;
            for (int j = 0; j < i; j++) {
                String str = cmds[j];
                os.write((str + "\n").getBytes());
            }
            os.write("exit\n".getBytes());
            os.flush();
            os.close();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            while (true) {
                String str = reader.readLine();
                if (str == null)
                    break;
                list.add(str);
            }
            reader.close();
            process.waitFor();
            process.destroy();
            return list;
        } catch (Exception localException) {
        }
        return list;
    }

你可能感兴趣的:(macos app获取android设备/data目录文件)