用shell监控APP沙盒数据

作者: M4K0 | 来源:发表于2018-09-13 19:38 被阅读6次

前言:出于某些原因,要对APP沙盒数据进行实时监控。但手动用AK的文件查看器操作太繁琐,于是尝试用脚本来实现自动化监控以提高效率。通过对脚本的优化,倒逼自己不断地学习和总结shell编程知识。
update:2018-09-13 16:07:30

任务描述

  • 实时查看安卓手机中/data/data/当前运行APP的包名/files/目录中以jar和dex结尾的文件名。

代码

# V0.1
while true;
pkgname=$(dumpsys activity top|grep pid|awk '{print $2}'|awk -F '/' '{print $1}');
do echo -n "#=============Checking $pkgname  ";
date;
find /data/data/$pkgname/ -iname \*.jar -o -iname \*.dex;
sleep 1;
done;

由于busybox为阉割版,对换行后的脚本支持不到位。代码本身没有换行,为了便于观看,这里做了换行处理。

代码解析

  • 运行环境
    Android底层采用了linux内核,可以执行一些基本的shell命令。安装busybox后,可以使用一些高级的命令。
  • 初始配置
  1. 上述代码保存为checknow.sh
  2. 发送到手机 adb push checknow.sh /data/local/tmp/
  3. 赋予执行权限adb shell su -c chmod 0755 /data/local/tmp/checknow.sh
  4. 执行脚本adb shell su -c /data/local/tmp/checknow.sh
  • 在shell脚本中实现循环
    要做到实时监控,必须要有一个循环的逻辑。linux系统中使用watch -n 秒数 命令可以每隔n秒执行一次指定命令,但在手机中却运行不起来,又是busybox的锅……
    顺手学了一下循环指令:
while true;  
do xxx;    
sleep n;    # n是秒数,可以是小数。
done;    
  • 获取当前运行的app信息
shell@hammerhead:/ $ dumpsys activity top
TASK com.miui.mihome2 id=1
  ACTIVITY com.miui.mihome2/com.android.launcher2.Launcher 43045638 pid=1107
    Local Activity 427982f0 State:
      mResumed=true mStopped=false mFinished=false
      mLoadersStarted=true
      mChangingConfigurations=false
      mCurrentConfig={0.85 460mcc65535mnc zh_CN ldltr sw360dp w360dp h567dp 480dpi nrml port finger -keyb/v/h -nav/h s.38}
    FragmentManager misc state:
      mActivity=com.android.launcher2.Launcher@427982f0
      mContainer=android.app.Activity$1@427a2640
#……

adb shell中,通过dumpsys activity top可以获取手机屏幕上运行的应用信息。但信息太多,接下来可以用一系列的shell命令把APP包名给提取出来。

  • 使用grep指令提取目标字符串所在行
shell@hammerhead:/ $ dumpsys activity top|grep pid
  ACTIVITY com.miui.mihome2/com.android.launcher2.Launcher 43045638 pid=1107

在上面代码中,|为管道命令,将结果重定向到grep中。grep 后面跟一个关键词,可以提取出关键词所在的一整行。经过观察发现,pid可以作为该关键词。此外,grep -v 关键词可以查找不含关键词的行。

  • 使用awk提取行中的关键词
shell@hammerhead:/ $ dumpsys activity top|grep pid|awk '{print $2}'
com.miui.mihome2/com.android.launcher2.Launcher

默认情况下,awk会按照空格对行进行分割,分割后可 '{print $数字}'按照位置顺序输出,从1开始计数。注意,'{print $0}'代表的是分割前的完整字符串。
接下来用awk -F对指定字符串/进行分割,获取到包名com.miui.mihome2
awk支持正则,也许不用多次使用awk分割,以后若掌握了更高级用法会补充进来。

  • 使用shell变量
    将上述命令获取到的包名赋值给pkgname,供后续使用:
    pkgname=$(dumpsys activity top|grep pid|awk '{print $2}'|awk -F '/' '{print $1}')
    变量赋值变量名=$(一条指令),或变量名="字符串",注意这里是圆括号
    变量引用$变量名,或${变量名},注意这里是花括号
    关于shell数组还可以参考这里http://www.runoob.com/linux/linux-shell-array.html

  • 使用find查找文件
    find命令可以递归查找指定文件夹内的文件,基本用法为:find 目录名 -name 文件名

相关文章

  • 用shell监控APP沙盒数据

    前言:出于某些原因,要对APP沙盒数据进行实时监控。但手动用AK的文件查看器操作太繁琐,于是尝试用脚本来实现自动化...

  • iOS 沙盒

    沙盒机制:在iOS中每个APP都拥有自己的沙盒,APP只能访问对应沙盒中存储的数据, iOS是不允许跨越沙盒去访问...

  • iOS的永久话储存

    沙盒:IOS应用中每个应用均有自己沙盒,用来储存APP自己的数据,每个应用的沙盒均是应用特有的不能交叉访问。 沙盒...

  • iOS 多个APP沙盒数据共享

    我们都知道,APP的沙盒是用来存储这个APP的本地数据的。其实,同一个开发者开发的多个APP的沙盒数据是可以共享,...

  • iOS数据存储总结(数据持久化)

    谈iOS的数据存储的时候要先知道APP沙盒的结构和路径.沙盒的结构为: 沙盒的根目录: 搜索文件夹的方式: 数据存...

  • iOS中的数据存储

    一、本地沙盒沙盒沙盒是什么 沙盒,可以简单理解为App存储数据的地方,所有非代码文件都会存储在其中,例如图像,图标...

  • 导出app本地存储数据

    获取iphone 开发中的App沙盒数据 xcode导出app本地存储数据 获取已经从 app store 下载...

  • 沙盒的原理

    沙盒的原理 NSBundle的理解 app的安装目录 沙盒 app可以保存自己的一些数据(账号密码,下载音频视频,...

  • 学习笔记-应用的沙盒

    在iOS设备中,APP的数据存储采用了SandBox(沙盒)机制。 应用的沙盒 目录结构 每个iOS应用都有自己应...

  • ios开发纪要

    一、ios沙盒机制 应用间数据不能共享,不能访问其他沙盒内的数据,不能把数据写入到其他沙盒中,安全,app间访问使...

网友评论

    本文标题:用shell监控APP沙盒数据

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