android 如何采取截图的其他应用程序编程没有根权限,像截图UX试用?

dddzy1tm  于 2022-12-28  发布在  Android
关注(0)|答案(3)|浏览(147)

如何采取截图的其他应用程序编程没有根权限,像截图UX试用?
1.我知道我可以在应用中捕获根视图的位图。但当我的应用在后台运行时,我无法获取其他应用的根视图
第一个月

  1. Manifest中有捕获当前帧缓冲区的权限:android.permission.READ_FRAME_BUFFER。但是一些网站说它只适用于签名应用。
    Check Android Permissions - Protection Levels
    在尝试Screenshot UX试用版后,我阅读了许可:
  • INTERNET:用于连接到根电话的localhost屏幕截图服务器。
  • 系统警报窗口:用于最上面的相机按钮。
  • VIBRATE:用于振动反馈。
  • 写入外部存储:以保存屏幕截图。
  • GET_TASKS:用于检测前台开发人员为非根和非预加载的捕获方法设置活动。

看起来SYSTEM_ALERT_WINDOWGET_TASKS允许应用程序截图。我有两个猜测它是如何工作的:
1.它可以访问前台活动的Activity,获取Activity的根视图,捕获其屏幕截图。
1.呼叫glreadpixels
如果你试试我的猜测,请告诉我结果.

4xy9mtcn

4xy9mtcn1#

这是非常困难的。我花了几年时间来尝试。我最终成功了,但任何解决方案都将涉及商业和技术方面的努力。
2015年3月更新
下面的大部分东西已经过时了,经过这么多年,现在有一个android.media.projectionhttps://developer.android.com/reference/android/media/projection/package-summary.html,它终于可以满足你的需要了!

捕获您自己的应用程序的屏幕图像

为了完整起见,我希望包括您自己的评论,您可以使用Bitmap.createBitmap(rootview.getDrawingCache());和类似的机制捕获您自己的应用程序的映像。

在后台捕获另一个应用程序的屏幕

使用READ_FRAMEBUFFER权限

首先,你说得对,普通应用程序不能使用READ_FRAMEBUFFER权限,因为它是“签名”级别的,这意味着你必须使用与Android系统ROM相同的密钥进行签名,才能拍摄这样的截图。
我觉得这有点可悲,所以在2009年,我提交了一个Android开源项目,要求开放它1。Android架构师Dianne Hackborn的回应是:
呃,不。绝对不行。
所以,一切都很顺利!所以这个权限直到今天仍然是signature级别的。
但是,如果您拥有此权限,则可以调用ISurfaceComposer 2的captureScreen成员。您需要使用Android NDK和一些未公开的API编写一些本机代码来访问此函数。
在Android图形子系统内部,它使用glReadPixels调用将像素从GPU检索回CPU。(GPU用于Android上的大部分合成。事实上,Android 4.0+支持额外的硬件合成器,Surface Flinger必须做更多的工作才能将这些像素拉回到CPU。
除了一些小问题外,这个调用工作得很好:

  • 使用不受支持的API的风险,该API可能随时崩溃;
  • 在C++中调用它的麻烦
  • 它会导致GPU管道停顿,这可能会让GPU设计人员感到不安,但实际上并不会造成问题
  • 它依赖于从GPU back 到CPU的大带宽。这有时会有问题,因为内存架构被设计成以相反的方向发送数据。然而,我似乎记得所有现代Android芯片组架构都直接在GPU和CPU之间共享内存,除了一个(可能是Broadcom?-我不记得了),这可能会导致这种机制非常慢。

...还有一个大问题...

  • 最重要的是,作为一个普通的应用程序编写者,由于需要签名级别的权限,您甚至不能调用这个API。

不过,在大多数Android设备上,你可以获得每秒10帧的速度。更棒的是,这个API实际上支持在GPU* 上的硬件中缩放生成的图像 *,所以如果你聪明的话,你可以在像素到达CPU之前将图像预缩放到你需要的大小。所以它可以有极高的性能。
当然,请注意,作为应用程序编写者,您不能调用glReadPixels,因为您没有访问相关OpenGL上下文的权限,它属于surface flinger。

使用/dev/graphics/fb0和类似方法

有些人试图读取这些代表帧缓冲区的Linux设备文件。然而,有三个问题:

  • 你需要根。
  • 有时候他们根本不存在。
  • 通常,它们并不代表真实的的屏幕图像。请记住,在Android上,图形是在GPU上合成的。因此,CPU没有理由访问完整的合成屏幕图像的副本,而且通常也不会。这个文件有时包含撕裂(最多)和垃圾图像(最坏的情况)。有趣的是,一些root手机的工具确实使用了这种方法,我认为这是一个错误。如果你有root,根据定义,您拥有所有Android权限,因此可以调用上面的captureScreen API来获取正确的映像。

使用硬件合作伙伴

现在我们进入需要商业行动的解决方案。
与Android芯片组制造商交谈通常会提出一个解决方案。由于他们设计硬件,他们可以访问帧缓冲区-他们通常能够提供完全避免Android权限模型的库,只需直接访问他们的自定义内核驱动程序。
如果你的目标是一款特定的手机型号,这通常是一个很好的前进方向。当然,你可能需要与手机制造商以及硅制造商合作。
有时候这能提供出色的效果。例如我听说在一些硬件上可以将手机硬件帧缓冲区直接传输到手机硬件的H.264视频编码器中,然后检索手机屏幕上任何内容的预编码视频流。非常出色。(不幸的是,我只 * 知道 * 这在TI OMAP芯片上是可能的,这些芯片正在逐渐退出手机市场3)。

利用安全漏洞

Android严格执行其权限模型,几乎没有安全漏洞。然而,Android OEM有时可能更粗心。

例如,一家以S开头的主要OEM厂商实现了一种通过按键捕捉屏幕的方法。它将其保存到SD卡上的一个世界可读的文件中。假设您可能能够找到拦截这些按键的东西,看看它是如何工作的。也许您可以做类似的事情。
也许有一个方法,为另一个主要的原始设备制造商的名字也开始与S。
不,我不打算在这一节中详细介绍。为了解决如何做这些事情,我需要逆向工程软件,而这可能是非法的。祝你好运。
与手机制造商合作
如前所述,手机制造商已经准备好访问一个API,该API * 确实有效 *。而且手机制造商拥有所需的signature级别权限。
所以,所有你需要做的是安排让你的软件签署的电话制造商。
然而,这很难做到。手机制造商在软件上签名,就是在保证软件的质量--所以他们应该想对你的源代码进行审计。此外,由于安卓的本质--如果他们在软件上签名,他们就必须是软件的发布者。如果软件是由别人签名的,你就不能把它投放市场。
然而,OEM不需要将其包含在ROM中--他们仍然可以在Android市场上发布它。
一个好的解决方案是如果每个供应商签署了一个小库,然后可以访问一个共同的SDK。

与已经解决此问题的软件合作伙伴合作

我知道很多关于这方面的事情,因为我曾经在RealVNC工作过。我们与所有主要的Android手机厂商合作,以获得这些签名级API。我不能过分强调实现这一目标所需的许多人年的努力(商业和技术)。一些OEM已经公布了这项工作-例如4
我不再在RealVNC工作了,所以我从他们的软件广告中没有得到任何好处。但是如果你真的真的想在多个Android设备上捕捉屏幕,你可能希望和他们接触,重新使用他们的远程控制服务或Android VNC SDK 5。它不是开源的,所以你应该期望付费。相信我,考虑到与所有这些Android OEM合作所涉及的史诗般的努力,这是足够公平的。
为了平衡起见,我应该指出,其他供应商也与手机制造商在这方面进行了合作--例如Soti。但我相信他们都提供了特定的设备管理解决方案,而不是通用的远程控制/事件注入SDK。

通过USB

另一个选择-adb守护进程监听USB调试连接,比普通应用程序拥有更多的权限,这就是为什么它能够抓取屏幕(你可以使用ddms工具查看它的图像)。如果你能够使用adb运行任何命令,那么你也可以获得这些权限(根据前面链接的android-screenshot-library)。

为Android开源项目贡献力量

最终这个问题把我变成了灰尘,我去了更好的地方,那里不需要试图从Android手机中挤出像素。
在我离开RealVNC之前,我们再次尝试将这些API贡献给Android开源项目。这一次我们得到了更积极的React6。简而言之,我们的安全方法几乎是正确的,但是图形系统太混乱了,无法接受我们的补丁。好消息是图形系统不再混乱-事实上它现在有了captureScreen API,这意味着无论如何都不需要对图形系统进行更改。因此,可以围绕该API向AOSP提交新的安全机制,从而最终解决该问题。

1hdlvixo

1hdlvixo2#

也许android-screenshot-library可以帮上忙,但是在他们的使用页面上说它需要一个用ADB(来自Android SDK)启动的本地服务。
PS:请记住,截图UX并不适用于每一款未root的手机。

9udxz4iz

9udxz4iz3#

我不认为Android会允许你访问其他应用的帧缓冲区。这只是Android安全性的一部分。每个应用都应该保留自己的资源。
如果你真的需要获取任何应用程序的屏幕捕捉,我建议使用本机屏幕捕捉“手势”。以Nexus 7为例,只需“...同时按住电源键和音量降低键约2秒钟。”
谷歌搜索通常会找到你的设备的窍门。

相关问题