当前位置: 移动技术网 > IT编程>移动开发>Android > android 无须root截图方案的实现

android 无须root截图方案的实现

2019年07月23日  | 移动技术网IT编程  | 我要评论

湖人vs尼克斯视频直播,陈乔希,浴室征婚视频

通过反射了截取屏

public class encoderfeeder {
   public static bitmap screenshot() {
      string surfaceclassname;
      if (version.sdk_int <= 17) {
        surfaceclassname = "android.view.surface";

      } else {
        surfaceclassname = "android.view.surfacecontrol";
      }
      class<?> classname;
      bitmap bm = null;
      try {
        classname = class.forname(surfaceclassname);
        method method = classname.getdeclaredmethod("screenshot",
              new class[] { int.class, int.class });
        bm = (bitmap) method.invoke(
              null,
              new object[] { integer.valueof(device.x),//分辨率
                   integer.valueof(device.y) });
      } catch (exception e) {
        e.printstacktrace();
      }

      return bm;
   }
  
}

这是我们反射调用surfacecontrol.screenshot()和surface.screenshot(),他们都是系统提供的截屏方法,可是这个方法被@hide的了,无法调用,我们可是使用反射的方式调用,可是我们普通用户通过代码反射调用,方法会返回null,原因是surfacecontrol这个类也被google隐藏了, 我们知道通adb shell 命令可以调用screencap或者screenshot来截屏adb shell具有截屏截屏的权限也就是说adb shell能够调用到surface和surfacecontrol这个两个类。 怎么通过adb shell来调用到这两个类呢,这里的主角是app_process,app_process可以直接运行一个普通的java类。 小结一下:

1.通过adb shell 命令来启动一个app_process程序

export classpath=/data/app/com.test.syscreen-1.apk",
"exec app_process /system/bin com.test.syscreen.main '@@'

2.使用app_process程序来启动一个java程序,在java程序中可访问到surface和surfacecontrol这两个类,就可以绕过root,反射截屏。 更进一步的分析,为什么app_precess程序会有普通用户访问不到的东西呢,查了一下(app_process其实就是zygote进程,zygote是由app_process“改名”而来),android中应用程序的进程都是由zygote进程孵化而来的,zygote进程启动时会创建一个dalvik虚机实例,每当有新的应用用进程产生,zygote会将虚拟机实例复制到它里面,并且zygote启动时会将java运行库加载进来,所以一个新的应用有zygote创建出来,不仅拥有从zygote拷贝来的虚拟机,还会和zygote共享java运行库。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网