android 无须root截图方案的实现

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了android 无须root截图方案的实现脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

通过反射了截取屏

 public class EncoderFeeder {    public static BITmap screenshot() {       String Surfaceclassname;       if (VERSION.SDK_INT <= 17) {         surfaceClassName = "andROId.view.Surface";        } else {         surfaceClassName = "android.view.SurfaceControl";       }       Class<&#63;> 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运行库。

android教程
脚本网站
android studio

脚本宝典总结

以上是脚本宝典为你收集整理的android 无须root截图方案的实现全部内容,希望文章能够帮你解决android 无须root截图方案的实现所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。