美文网首页
macos app获取android设备/data目录文件

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

作者: 朱传武 | 来源:发表于2020-12-13 16:30 被阅读0次

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


    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<String> list = new ArrayList<String>();
            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目录文件

          本文链接:https://www.haomeiwen.com/subject/bjhpgktx.html