求助,谁走安卓手机录屏软件大屏的主题软件,求

&p&每月有超过&a href=&https://link.zhihu.com/?target=https%3A//www.macrumors.com//2-billion-active-android-devices/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&20亿个Android设备&/a&处于活动状态,任何一个都可以使用远程管理工具(通常称为RAT)进行攻击。&a href=&https://link.zhihu.com/?target=https%3A//github.com/AhMyth/AhMyth-Android-RAT& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AhMyth&/a&是这些功能强大的工具之一,可以帮助外部人员监控设备的位置,查看短信,拍摄相机快照,甚至可以在用户不知情的情况下使用麦克风进行录制。&/p&&p&远程管理工具是第一个旨在通过允许管理员直接登录和控制设备来为远程计算机提供技术支持的程序。然而,黑客们很快就看到了这些工具的潜力,并开始利用这些工具进行恶毒行为。先进的RAT经常被用来远程访问和控制各种各样的设备,但是今天我们将把重点放在最流行的设备 – &a href=&https://link.zhihu.com/?target=https%3A//android.gadgethacks.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android上&/a&。&/p&&p&AhMyth是一个新兴、开源的Android RAT,目前还处于开发阶段,它使用简单的GUI界面。此外,AhMyth还可适应多种平台,包括Linux,Windows和MacOS。&/p&&p&RAT由两部分组成:第一个是基于&a href=&https://link.zhihu.com/?target=https%3A//electron.atom.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Electron框架&/a&的服务器端应用程序,在我们的例子中,就是我们的桌面或者笔记本电脑,但是如果需要的话,这个应用程序可以在一定程度上扩展。充当连接到RAT的控制面板;第二部分是客户端,将用作后门受感染的Android应用程序。&/p&&h2&&b&步骤1 下载并安装AhMyth&/b&&/h2&&p&有两种方法可以下载和安装AhMyth。直接使用GitHub的源代码或者使用他们提供的二进制文件。&/p&&p&&b&方法1 源代码&/b&&/p&&p&如果您选择从源代码开始,那么您需要检查是否安装了一些依赖。&/p&&p&Java – 用来生成APK后门&/p&&p&电子 – 用于启动桌面应用程序&/p&&p&电子生成器和&a href=&https://link.zhihu.com/?target=https%3A//github.com/electron-userland/electron-packager& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&电子打包器&/a& – 被用来构建macOS,Windows和Linux的二进制文件&/p&&p&如果已安装这些,那么准备好继续。首先使用以下命令从GitHub中克隆代码。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&git clone
https://github.com/AhMyth/AhMyth-Android-RAT.git
&/code&&/pre&&/div&&p&然后转到下面的AhMyth-Android-Rat目录。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&cd AhMyth-Android-RAT / AhMyth-Server
&/code&&/pre&&/div&&p&一旦你进入,用下面的命令启动AhMyth。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&npm开始
&/code&&/pre&&/div&&p&这个程序还处于测试版开发阶段,因此它并不像以前那样强大。所以难免运行的时候可能会出现错误。如果出现错误,请再次尝试以root身份运行它,如下所示。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo npm start --unsafe-perm
&/code&&/pre&&/div&&p&当您看到GUI启动时,就意味着它已经在工作了。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-5fd8cc517df9a46774c1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&601& data-rawheight=&401& class=&origin_image zh-lightbox-thumb& width=&601& data-original=&https://pic4.zhimg.com/v2-5fd8cc517df9a46774c1_r.jpg&&&/figure&&p&&b&方法2 二进制文件&/b&&/p&&p&源代码是下载它的一种方式,但如果你像我一样懒,有一个更简单的方法 – 使用二进制文件!当你在Windows计算机上工作并且不想乱用命令行时,这是一个很不错的选择的。但是请检查您的计算机上是否更新了Java。&/p&&p&导航到&a href=&https://link.zhihu.com/?target=https%3A//github.com/AhMyth/AhMyth-Android-RAT/releases& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AhMyth发布页面&/a&并下载。目前,他们只支持Linux和Windows文件上传。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bad9c0c1fbfa9b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&680& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/v2-bad9c0c1fbfa9b_r.jpg&&&/figure&&p&下载正确的文件——安装——自动运行。&/p&&h2&&b&第2步 创建一个APK&/b&&/h2&&p&我们已经启动并运行了程序,现在是时候构建一个带有后门的Android应用程序。在屏幕的顶部,选择“APK Builder”。首先要改变的是“源IP”,这是将要发送和接收命令的计算机的IP地址。&/p&&p&出于测试目的,我只是使用我的本地Wi-Fi网络。但是,如果您希望在本地网络之外工作,则需要将计算机端口转到Internet并使用公共IP地址。&/p&&p&AhMyth可以通过两种不同的方式构建一个APK。它可以创建一个独立的APK或用于感染另一个应用程序,以保持隐藏在目标设备上。要做到后者,选择“绑定另一个应用程序”旁边的框,然后浏览并选择你想使用的APK。今天我将创建默认的独立APK,但如果恶意用户正在部署这个APK,他们很可能会将其绑定到另一个APK。&/p&&p&一旦你选择了所有的设置,你就可以开始构建APK,只需点击“Build”。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-6ff840ae15b84ed97a2bc812ecbe728f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&797& data-rawheight=&185& class=&origin_image zh-lightbox-thumb& width=&797& data-original=&https://pic2.zhimg.com/v2-6ff840ae15b84ed97a2bc812ecbe728f_r.jpg&&&/figure&&p&从C:\Users\UserName\AhMyth\Output”目录来查找创建的APK&/p&&h2&&b&步骤3 安装RAT&/b&&/h2&&p&您已经有了一个可用的APK,现在可以将其下载到目标Android设备上进行安装。所有标准的攻击方法都适用 – 任何让用户下载APK的方法。&a href=&https://link.zhihu.com/?target=https%3A//null-byte.wonderhowto.com/how-to/social-engineering/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&社会工程&/a&往往效果最好。例如,如果你认识这个人,那么向他们推荐一个应用程序并感染它。&/p&&p&如果你可以物理访问手机,那么只需几秒钟就能下载和隐藏它。如果您选择此方法,那么简单的方法是将APK保存到云端硬盘并向手机发送链接。在大多数手机上,下载应该只需要一两秒钟。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-38ce37d492c1ae8b12acb3ab6fdf5591_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&749& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&749& data-original=&https://pic1.zhimg.com/v2-38ce37d492c1ae8b12acb3ab6fdf5591_r.jpg&&&/figure&&p&如果Android手机无法安装,他们可能没有在设置中启用允许“未知来源”应用安装。打开设置,然后转到“安全”并选中“未知来源”。&/p&&h2&&b&步骤4 开始监听&/b&&/h2&&p&在AhMyth屏幕的左上角,选择“受害者”选项卡,然后将端口号更改为您正在使用的端口号。您也可以将其保留为空。接下来,点击“Listen”。一旦这样做,被监控受害者的一些基本信息便会出现在屏幕上。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-9ce5fad39d1d8f96a73b31fe9f4eb921_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&832& data-rawheight=&643& class=&origin_image zh-lightbox-thumb& width=&832& data-original=&https://pic1.zhimg.com/v2-9ce5fad39d1d8f96a73b31fe9f4eb921_r.jpg&&&/figure&&h2&&b&步骤5 功能测试&/b&&/h2&&p&现在您已经在目标设备上运行了RAT,可以开始远程管理了。点击“打开实验室”按钮,将出现一个新的弹出窗口。如果您熟悉&a href=&https://link.zhihu.com/?target=https%3A//www.cerberusapp.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cerberus&/a&等其他Android RAT,那么您可能会对某些功能有些失望。它目前拥有的功能非常强大,比如“文件管理器”功能,它可以让你看到设备上的所有东西,查找密码、会话cookie、照片等都不是问题。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a33053dabd7bbcb509e134b7f511b4f0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-a33053dabd7bbcb509e134b7f511b4f0_r.jpg&&&/figure&&p&另一个功能是通过“麦克风”录制音频的功能。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-130df6dab5c1fe9c1e16c5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-130df6dab5c1fe9c1e16c5_r.jpg&&&/figure&&p&你也有一个跟踪功能(“位置”),你不仅可以知道他们说了什么,而且可以知道他们在哪里说的。但是,有一点需要注意的是,它可能被一个简单的GPS欺骗应用程序给困住了。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a5b539e76a0ffe046ddcda_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&653& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic2.zhimg.com/v2-a5b539e76a0ffe046ddcda_r.jpg&&&/figure&&p&现在您可能已经注意到我跳过了“相机”功能。可能是旧Android手机的原因,这个功能无法正常使用。原则上,它应该允许您发送命令,使用前置或后置摄像头拍摄照片,并将其发回给您。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0fcee01c9136f24_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-0fcee01c9136f24_r.jpg&&&/figure&&p&&b&如何保护自己&/b&&/p&&p&一般来说,没人可以做到免受RAT攻击,但是如果你不安装来自Google Play商店以外的Android应用,那你受攻击的几率相对会小一点点。&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//android.gadgethacks.com/how-to/android-basics-enable-unknown-sources-sideload-apps-0161947& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android中默认禁用“未知来源”安装&/a&,但如果您允许,则会大大增加您的风险,因为您将不再获得安全提示。如果您有合法理由从Google Play外部下载APK,请务必点击“仅允许此安装”,否则您可能会意外永久启用“未知来源”。&/p&&p&另一种保护自己的方式是不要把你的电话带到重要的会议或者任何你不想让人听的地方。&/p&&blockquote&如若转载,请注明原文地址: &a href=&https://link.zhihu.com/?target=http%3A//www.4hou.com/tools/8949.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&4hou.com/tools/8949.htm&/span&&span class=&invisible&&l&/span&&span class=&ellipsis&&&/span&&/a&
更多内容请关注“嘶吼专业版”——Pro4hou
更多内容请关注“嘶吼专业版”——Pro4hou&/blockquote&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&
每月有超过处于活动状态,任何一个都可以使用远程管理工具(通常称为RAT)进行攻击。是这些功能强大的工具之一,可以帮助外部人员监控设备的位置,查看短信,拍摄相机快照,甚至可以在用户不知情的情况下使用麦克风进行录制。远程管…
&figure&&img src=&https://pic4.zhimg.com/v2-d04b88ed9e_b.jpg& data-rawwidth=&999& data-rawheight=&561& class=&origin_image zh-lightbox-thumb& width=&999& data-original=&https://pic4.zhimg.com/v2-d04b88ed9e_r.jpg&&&/figure&&p&作者:&a href=&https://link.zhihu.com/?target=http%3A//weibo.com/ttarticle/p/show%3Fid%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&臧智渊&/a&&/p&&p&&br&&/p&&p&什么才是全面屏手机?小米认为,高屏占比直到100%正面全是屏幕,是未来手机的趋势,所以小米创造了“全面屏”这个词(从日小米MIX发布起,互联网上才有了这个词的百度指数)。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d9eed1b8f2a9dc_b.jpg& data-rawwidth=&2048& data-rawheight=&980& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&https://pic4.zhimg.com/v2-d9eed1b8f2a9dc_r.jpg&&&/figure&&p&小米定义了全面屏手机&/p&&p&小米MIX 17比9的屏幕比例以及91.3%的屏占比,以及定制的圆角切割屏幕,极其震撼的视觉效果,充分的诠释了“全面屏”的定义,毫不夸张的说,小米定义了全面屏手机。同时,在做MIX的同时,小米尝试了悬臂梁压电陶瓷、超声波距离传感器、全陶瓷机身等等,甚至找到了工业设计教父斯塔克担任设计指导。此外,小米还申请了关于全面屏手机可能会用到的百余项专利。&/p&&p&做大屏占比,最合理的方式就是将屏幕适当拉长,尽量做好堆叠取消正面多余的区域。所以小米MIX在立项初期就尝试选择17比9,18比9乃至18.5比9。最终选择了17比9和6.44英寸的大屏幕。&/p&&p&小米MIX也是一款安卓深度定制的手机。&/p&&p&每一款安卓手机都要符合对应安卓版本的CDD,即Compatibility Definition Document。谷歌官方的解释是:“Android 兼容性定义文档 (CDD)列举了设备需要满足哪些要求才能与最新的 Android 版本兼容。为了与 Android 兼容,设备实现必须满足此兼容性定义文档(包括以参考资料的形式纳入的任何文档)中列出的要求。对于 Android 平台的每个版本,我们都将提供详细的 CDD。CDD 代表 Android 兼容性的“政策”方向。”&br&&/p&&p&为了保证安卓设备的体验,包括应用程序的兼容性等,安卓6.0 CDD对屏幕的比例要求是介于4比3和16比9之间。不符合CDD的设备无法通过谷歌的CTS测试。&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c4c012eceae43d5af13deefe_b.jpg& data-rawwidth=&2048& data-rawheight=&497& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&https://pic3.zhimg.com/v2-c4c012eceae43d5af13deefe_r.jpg&&&/figure&&p&安卓6.0 CDD对屏幕的比例要求是介于4比3和16比9之间&/p&&p&&br&&/p&&p&作为原Android业务的负责人,虎哥Hugo在看到17比9的分辨率以及定制的圆角切割屏幕时,就提醒需要注意安卓的CDD问题,从2016年初就和谷歌高管开始进行电话沟通。在此基础上,小米和谷歌进行了数月的邮件沟通,下面是概要:&/p&&p&&i&小米工程师: 询问谷歌安卓部门,即将发布新款设备(MIX)的分辨率为,17比9。是否能通过谷歌兼容性CTS测试,或者能否免测。&/i&&/p&&p&&i&谷歌工程师:CDD对屏幕比例有规范,会检查之前是否有通过过类似的分辨率,也会和产品团队咨询,但是不要抱有太大希望。&/i&&/p&&p&&i&20天后…&/i&&/p&&p&&i&小米工程师:有消息了吗?&/i&&/p&&p&&i&谷歌工程师:CDD对屏幕比例有要求,17的9的比例不能通过测试。(当时看到这个邮件,小米工程师的内心是崩溃的...)&/i&&/p&&p&&i&接着,小米带着MIX工程机飞到了硅谷的谷歌总部,与谷歌高管和工程师一起当面继续沟通。&/i&&/p&&p&&i&几个月后,就在小米MIX刚刚发布时…&/i&&/p&&p&&i&谷歌工程师:恭喜小米MIX发布,非常震撼。我们正在制定一个计划支持更大比例的屏幕和圆角切割。&/i&&/p&&p&&i&小米工程师:太好了,我们再一起讨论下细节。&/i&&/p&&p&&i&Hugo接着也给谷歌透露了小米MIX下一代手机会用18比9的分辨率,希望谷歌继续给予支持。&/i&&/p&&p&&i&11月7日:&/i&&/p&&p&&i&谷歌工程师:最终决定来了。更大的屏幕比例和圆角切割都可以,也希望小米和谷歌向开发者一起推动新的比例下App的适配。&/i&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-06c77fc95cd66cd1c5734cbde0110b0d_b.jpg& data-rawwidth=&2048& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&https://pic4.zhimg.com/v2-06c77fc95cd66cd1c5734cbde0110b0d_r.jpg&&&/figure&&p&谷歌最终决定适配全面屏和圆角切割&/p&&p&&br&&/p&&p&&i&11月8日:&/i&&/p&&p&&i&安卓7.0的CDD发布。里面不再强制要求屏幕比例必须在4比3和16比9之间。&/i&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-3f3ffb2c36b770f5fb659a67b287179f_b.jpg& data-rawwidth=&1916& data-rawheight=&790& class=&origin_image zh-lightbox-thumb& width=&1916& data-original=&https://pic3.zhimg.com/v2-3f3ffb2c36b770f5fb659a67b287179f_r.jpg&&&/figure&&p&安卓7.0的CDD不再强制要求屏幕比例必须在4比3和16比9之间&/p&&p&小米用大半年的时间和谷歌沟通,中间无数次越洋通话和Mail,终于改变了安卓CDD的两个要求。不仅为自己的一代二代机型,也为更多的高长宽比友商的手机铺通了路。&br&&/p&&p&在今年三月,谷歌在安卓开发平台呼吁开发者升级自己的App以适应高屏占比旗舰机的屏幕,里面特意提到了小米MIX是2016年10月发布。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-238e2ca6c9a98e17daf59b_b.jpg& data-rawwidth=&1600& data-rawheight=&1168& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&https://pic4.zhimg.com/v2-238e2ca6c9a98e17daf59b_r.jpg&&&/figure&&p&谷歌呼吁开发者升级自己的App适应高屏占比旗舰机屏幕&/p&&p&就在昨天,小米和谷歌再次合作,在印度发布了搭载原生安卓系统的全新Android One手机小米A1。&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-5ad7e87a17e934d0c186_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic4.zhimg.com/v2-5ad7e87a17e934d0c186_r.jpg&&&/figure&&p&小米谷歌一起发布了小米A1&/p&
作者: 什么才是全面屏手机?小米认为,高屏占比直到100%正面全是屏幕,是未来手机的趋势,所以小米创造了“全面屏”这个词(从日小米MIX发布起,互联网上才有了这个词的百度指数)。 小米定义了全面屏手机小米MIX 17比9的屏幕比例以及91…
&figure&&img src=&https://pic4.zhimg.com/v2-ecc5ecb0469_b.jpg& data-rawwidth=&679& data-rawheight=&275& class=&origin_image zh-lightbox-thumb& width=&679& data-original=&https://pic4.zhimg.com/v2-ecc5ecb0469_r.jpg&&&/figure&&h2&1.Java内存分配策略&/h2&&br&Java 程序运行时的内存分配策略有三种:静态分配、栈式分配和堆式分配。对应的存储区域如下:&br&&ul&&li&静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。&/li&&br&&li&栈区 :方法体内的局部变量都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。&/li&&br&&li&堆区 : 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。&/li&&/ul&&h2&2.堆与栈的区别&/h2&&br&栈内存:在方法体内定义的局部变量(一些基本类型的变量和对象的引用变量)都是在方法的栈内存中分配的。当在一段方法块中定义一个变量时,Java 就会在栈中为该变量分配内存空间,当超过该变量的作用域后,分配给它的内存空间也将被释放掉,该内存空间可以被重新使用。&br&&br&堆内存:用来存放所有由 new 创建的对象(包括该对象其中的所有成员变量)和数组。在堆中分配的内存,将由 Java 垃圾回收器来自动管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,这个特殊的变量就是我们上面说的引用变量。我们可以通过这个引用变量来访问堆中的对象或者数组。&br&&br&例子:&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&A&/span& &span class=&o&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span&
&span class=&n&&B&/span& &span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&B&/span&&span class=&o&&();&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&test&/span&&span class=&o&&(){&/span&
&span class=&kt&&int&/span& &span class=&n&&a1&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span&&span class=&o&&;&/span&
&span class=&n&&B&/span& &span class=&n&&b1&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&B&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&n&&A&/span& &span class=&n&&object&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&A&/span&&span class=&o&&();&/span&
&/code&&/pre&&/div&&br&&ul&&li&A类内的局部变量都存在于栈中,包括基本数据类型a1和引用变量b1,b1指向的B对象实体存在于堆中&/li&&br&&li&引用变量object存在于栈中,而object指向的对象实体存在于堆中,包括这个对象的所有成员变量a和b,而引用变量b指向的B类对象实体存在于堆中&/li&&/ul&&h2&3.Java管理内存的机制&/h2&&br&Java的内存管理就是对象的分配和释放问题。内存的分配是由程序员来完成,内存的释放由GC(垃圾回收机制)完成。GC 为了能够正确释放对象,必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。这是Java程序运行较慢的原因之一。&br&&br&释放对象的原则:该对象不再被引用。&br&&br&GC的工作原理:&br&将对象考虑为有向图的顶点,将引用关系考虑为有向图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从 main 进程开始执行,那么该图就是以 main 进程为顶点开始的一棵根树。在有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象与这个根顶点不可达,那么我们认为这个对象不再被引用,可以被 GC 回收。&br&&br&下面举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。以下右图,就是左边程序运行到第6行的示意图。&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-84d3900ddf467c180a27767ddf5d7392_b.jpg& data-rawwidth=&582& data-rawheight=&201& data-thumbnail=&https://pic4.zhimg.com/v2-84d3900ddf467c180a27767ddf5d7392_b.jpg& class=&origin_image zh-lightbox-thumb& width=&582& data-original=&https://pic4.zhimg.com/v2-84d3900ddf467c180a27767ddf5d7392_r.gif&&&/figure&&br&另外,Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象相互引用,但只要它们和根进程不可达,那么GC也是可以回收它们的。当然,除了有向图的方式,还有一些别的内存管理技术,不同的内存管理技术各有优缺点,在这里就不详细展开了。&br&&br&&h2&4.Java中的内存泄漏&/h2&&br&如果一个对象满足以下两个条件:&br&&br&(1)这些对象是可达的,即在有向图中,存在通路可以与其相连&br&(2)这些对象是无用的,即程序以后不会再使用这些对象&br&&br&就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,继续占用着内存。&br&&br&在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄漏。&br&&figure&&img src=&https://pic2.zhimg.com/v2-8ec11ae3ec24b_b.jpg& data-rawwidth=&507& data-rawheight=&231& class=&origin_image zh-lightbox-thumb& width=&507& data-original=&https://pic2.zhimg.com/v2-8ec11ae3ec24b_r.jpg&&&/figure&&h2&&br&5.Android中常见的内存泄漏&/h2&&br&(1)单例造成的内存泄漏&br&&figure&&img src=&https://pic3.zhimg.com/v2-effec08f3a8af05_b.jpg& data-rawwidth=&829& data-rawheight=&226& class=&origin_image zh-lightbox-thumb& width=&829& data-original=&https://pic3.zhimg.com/v2-effec08f3a8af05_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-4abe84fe182aa877d4a324_b.jpg& data-rawwidth=&645& data-rawheight=&402& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&https://pic1.zhimg.com/v2-4abe84fe182aa877d4a324_r.jpg&&&/figure&这是一个普通的单例模式,当创建这个单例的时候,由于需要传入一个Context,所以这个Context的生命周期的长短至关重要:&p&1.如果此时传入的是 Application 的 Context,因为 Application 的生命周期就是整个应用的生命周期,所以没有任何问题。&/p&&p&2.如果此时传入的是 Activity 的 Context,当这个 Context 所对应的 Activity 退出时,由于该 Context 的引用被单例对象所持有,其生命周期等于整个应用程序的生命周期,所以当前 Activity 退出时它的内存并不会被回收,这就造成泄漏了。&br&&br&当然,Application 的 context 不是万能的,所以也不能随便乱用,例如Dialog必须使用 Activity 的 Context。对于这部分有兴趣的读者可以自行搜索相关资料。&br&&br&(2)非静态内部类创建静态实例造成的内存泄漏&br&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&MainActivity&/span& &span class=&kd&&extends&/span& &span class=&n&&AppCompatActivity&/span& &span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&kd&&static&/span& &span class=&n&&TestResource&/span& &span class=&n&&mResource&/span& &span class=&o&&=&/span& &span class=&kc&&null&/span&&span class=&o&&;&/span&
&span class=&nd&&@Override&/span&
&span class=&kd&&protected&/span& &span class=&kt&&void&/span& &span class=&nf&&onCreate&/span&&span class=&o&&(&/span&&span class=&n&&Bundle&/span& &span class=&n&&savedInstanceState&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&kd&&super&/span&&span class=&o&&.&/span&&span class=&na&&onCreate&/span&&span class=&o&&(&/span&&span class=&n&&savedInstanceState&/span&&span class=&o&&);&/span&
&span class=&n&&setContentView&/span&&span class=&o&&(&/span&&span class=&n&&R&/span&&span class=&o&&.&/span&&span class=&na&&layout&/span&&span class=&o&&.&/span&&span class=&na&&activity_main&/span&&span class=&o&&);&/span&
&span class=&k&&if&/span&&span class=&o&&(&/span&&span class=&n&&mManager&/span& &span class=&o&&==&/span& &span class=&kc&&null&/span&&span class=&o&&){&/span&
&span class=&n&&mManager&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&TestResource&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&&span class=&c1&&//...&/span&
&span class=&o&&}&/span&
&span class=&kd&&class&/span& &span class=&nc&&TestResource&/span& &span class=&o&&{&/span&&span class=&c1&&//...&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&br&非静态内部类默认会持有外部类的引用,而该非静态内部类又创建了一个静态的实例,该实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收。&br&&br&(3)匿名内部类造成的内存泄漏&p&匿名内部类默认也会持有外部类的引用。如果在Activity/Fragment中使用了匿名类,并被异步线程持有,如果没有任何措施这样一定会导致泄漏。&br&&figure&&img src=&https://pic4.zhimg.com/v2-485eae92f66b_b.jpg& data-rawwidth=&763& data-rawheight=&516& class=&origin_image zh-lightbox-thumb& width=&763& data-original=&https://pic4.zhimg.com/v2-485eae92f66b_r.jpg&&&/figure&ref1和ref2的区别是,ref2使用了匿名内部类。我们来看看运行时这两个引用的内存:&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-e9ed3d06ce85f_b.jpg& data-rawwidth=&1178& data-rawheight=&578& class=&origin_image zh-lightbox-thumb& width=&1178& data-original=&https://pic3.zhimg.com/v2-e9ed3d06ce85f_r.jpg&&&/figure&&br&可以看到,ref1没什么特别的。但ref2这个匿名类的实现对象里面多了一个引用:&br&this$0这个引用指向MainActivity.this,也就是说当前的MainActivity实例会被ref2持有,如果将这个引用再传入一个异步线程,此线程和此Acitivity生命周期不一致的时候,就会造成Activity的泄漏。&br&&br&例子:Handler造成的内存泄漏&br&&figure&&img src=&https://pic3.zhimg.com/v2-b681e220d60d21a4f09c5c48_b.jpg& data-rawwidth=&793& data-rawheight=&549& class=&origin_image zh-lightbox-thumb& width=&793& data-original=&https://pic3.zhimg.com/v2-b681e220d60d21a4f09c5c48_r.jpg&&&/figure&在该 MainActivity 中声明了一个延迟10分钟执行的消息 Message,mHandler 将其 push 进了消息队列 MessageQueue 里。当该 Activity 被 finish() 掉时,延迟执行任务的 Message 还会继续存在于主线程中,它持有该 Activity 的 Handler 引用,然后又因 为 Handler 为匿名内部类,它会持有外部类的引用(在这里就是指 MainActivity),所以此时 finish() 掉的 Activity 就不会被回收了,从而造成内存泄漏。&br&&br&修复方法:在 Activity 中避免使用非静态内部类或匿名内部类,比如将 Handler 声明为静态的,则其存活期跟 Activity 的生命周期就无关了。如果需要用到Activity,就通过弱引用的方式引入 Activity,避免直接将 Activity 作为 context 传进去。另外, Looper 线程的消息队列中还是可能会有待处理的消息,所以我们在 Activity 的 Destroy 时或者 Stop 时应该移除消息队列 MessageQueue 中的消息。见下面代码:&br&&figure&&img src=&https://pic2.zhimg.com/v2-2d5b9522cada96daf6c4197e47aaa672_b.jpg& data-rawwidth=&781& data-rawheight=&836& class=&origin_image zh-lightbox-thumb& width=&781& data-original=&https://pic2.zhimg.com/v2-2d5b9522cada96daf6c4197e47aaa672_r.jpg&&&/figure&&/p&&br&&p&(4)资源未关闭造成的内存泄漏&br&&br&对于使用了BraodcastReceiver,ContentObserver,File, Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。&br&&br&(5)一些不良代码造成的内存压力&br&&br&有些代码并不造成内存泄漏,但是它们,或是对没使用的内存没进行有效及时的释放,或是没有有效的利用已有的对象而是频繁的申请新内存。比如,Adapter里没有复用convertView等。&br&&br&&/p&&h2&6.Android中内存泄漏的排查与分析&/h2&&br&(1)利用Android Studio的Memory Monitor来检测内存情况&br&&br&先来看一下Android Studio 的 Memory Monitor界面:&br&&figure&&img src=&https://pic3.zhimg.com/v2-5c54d21fc837dedbca5ba69b1d053087_b.jpg& data-rawwidth=&1658& data-rawheight=&563& class=&origin_image zh-lightbox-thumb& width=&1658& data-original=&https://pic3.zhimg.com/v2-5c54d21fc837dedbca5ba69b1d053087_r.jpg&&&/figure&最原始的内存泄漏排查方式如下:&br&&br&重复多次操作关键的可疑的路径,从内存监控工具中观察内存曲线,看是否存在不断上升的趋势,且退出一个界面后,程序内存迟迟不降低的话,可能就发生了严重的内存泄漏。&br&&br&这种方式可以发现最基本,也是最明显的内存泄漏问题,对用户价值最大,操作难度小,性价比极高。&br&&br&下面就开始用一个简单的例子来说明一下如何排查内存泄漏。&br&&br&首先,创建了一个TestActivity类,里面的测试代码如下:&br&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&nd&&@Override&/span&
&span class=&kd&&protected&/span& &span class=&kt&&void&/span& &span class=&nf&&processBiz&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&mHandler&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&Handler&/span&&span class=&o&&();&/span&
&span class=&n&&mHandler&/span&&span class=&o&&.&/span&&span class=&na&&postDelayed&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&Runnable&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&nd&&@Override&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&run&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&MLog&/span&&span class=&o&&.&/span&&span class=&na&&d&/span&&span class=&o&&(&/span&&span class=&s&&&------postDelayed------&&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&o&&},&/span& &span class=&mi&&800000L&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&br&运行项目,并执行以下操作:进入TestActivity,然后退出,再重新进入,如此操作几次后,最后最终退出TestActivity。这时发现,内存持续增高,如图所示:&br&&figure&&img src=&https://pic4.zhimg.com/v2-0d727dbbe8f542da601cf7cc_b.jpg& data-rawwidth=&1436& data-rawheight=&513& class=&origin_image zh-lightbox-thumb& width=&1436& data-original=&https://pic4.zhimg.com/v2-0d727dbbe8f542da601cf7cc_r.jpg&&&/figure&&br&好了,这时我们可以假设,这里可能出现了内存泄漏的情况。那么,如何继续定位到内存泄漏的地址呢?这时候就得点击“Dump java heap”按钮来收集具体的信息了。&br&&br&(2)使用Android Studio生成Java Heap文件来分析内存情况&p&&br&注意,在点击 Dump java heap 按钮之前,一定要先点击Initate GC按钮强制GC,建议点击后等待几秒后再次点击,尝试多次,让GC更加充分。然后再点击Dump Java Heap按钮。&br&&br&这时候会生成一个Java heap文件并在新的窗口打开:&br&&figure&&img src=&https://pic1.zhimg.com/v2-9dae82d44bc1a0a3e84e1f4b0dd90bd2_b.jpg& data-rawwidth=&1430& data-rawheight=&695& class=&origin_image zh-lightbox-thumb& width=&1430& data-original=&https://pic1.zhimg.com/v2-9dae82d44bc1a0a3e84e1f4b0dd90bd2_r.jpg&&&/figure&这时候,点击右上角的“Analyzer Task”,再点击出现的绿色按钮,让Android studio帮我们自动分析出有可能潜在的内存泄漏的地方:&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-ca1f1ae3730_b.jpg& data-rawwidth=&1425& data-rawheight=&686& class=&origin_image zh-lightbox-thumb& width=&1425& data-original=&https://pic4.zhimg.com/v2-ca1f1ae3730_r.jpg&&&/figure&&br&如上图所示,Android studio提示有3个TestActivity对象可能出现了内存泄漏。而且左边的Reference Tree(引用树),也大概列出了该实体类被引用的路径。如果是一些比较简单的内存泄漏情况,仅仅看这里就大概能猜到是哪里导致了内存泄漏。&br&但如果是比较复杂的情况,还是推荐使用MAT工具(Memory Analyzer)来继续分析比较好。&br&&br&(3)使用Memory Analyzer(MAT)来分析内存泄漏&br&&br&MAT是Eclipse出品的一个插件,当然也有独立的版本。下载链接:&a href=&http://link.zhihu.com/?target=http%3A//www.eclipse.org/mat/downloads.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MAT下载地址&/a&&br&&br&在这里先提醒一下:MAT并不会准确地告诉我们哪里发生了内存泄漏,而是会提供一大堆的数据和线索,我们需要根据自己的实际代码和业务逻辑去分析这些数据,判断到底是不是真的发生了内存泄漏。&br&&br&MAT支持对标准格式的hprof文件进行内存分析,所以,我们要先在Android Studio里先把Java heap文件转成标准格式的hprof文件,具体步骤如下:&br&&br&点击左侧的capture,选择对应的文件,并右键选择“Export to standard .hprof”导出标准的hprof文件:&br&&figure&&img src=&https://pic2.zhimg.com/v2-d4d1b387c3b_b.jpg& data-rawwidth=&1062& data-rawheight=&721& class=&origin_image zh-lightbox-thumb& width=&1062& data-original=&https://pic2.zhimg.com/v2-d4d1b387c3b_r.jpg&&&/figure&&br&导出标准的hprof文件后,在MAT工具里导入,则看到以下界面:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d37cf82af2b_b.jpg& data-rawwidth=&1312& data-rawheight=&814& class=&origin_image zh-lightbox-thumb& width=&1312& data-original=&https://pic3.zhimg.com/v2-d37cf82af2b_r.jpg&&&/figure&&br&&p&MAT中提供了非常多的功能,这里我们只要学习几个最常用的就可以了。上图那个饼状图展示了最大的几个对象所占内存的比例,这张图中提供的内容并不多,我们可以忽略它。在这个饼状图的下方就有几个非常有用的工具了。&br&&br&Histogram:直方图,可以列出内存中每个对象的名字、数量以及大小。&br&&br&Dominator Tree:会将所有内存中的对象按大小进行排序,并且我们可以分析对象之间的引用结构。&br&&br&1)Dominator Tree&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-f11f0d90cafe9_b.jpg& data-rawwidth=&872& data-rawheight=&757& class=&origin_image zh-lightbox-thumb& width=&872& data-original=&https://pic4.zhimg.com/v2-f11f0d90cafe9_r.jpg&&&/figure&&br&从上图可以看到右边存在着3个参数。Retained Heap表示这个对象以及它所持有的其它引用(包括直接和间接)所占的总内存,因此从上图中看,前两行的Retained Heap是最大的,分析内存泄漏时,内存最大的对象也是最应该去怀疑的。&br&&br&另外大家应该可以注意到,在每一行的最左边都有一个文件型的图标,这些图标有的左下角带有一个红色的点,有的则没有。带有红点的对象就表示是可以被GC Roots访问到的,&br&可以被GC Root访问到的对象都是无法被回收的。那么这就可以说明所有带红色的对象都是泄漏的对象吗?当然不是,因为有些对象系统需要一直使用,本来就不应该被回收。&br&如果发现有的对象右边有写着System Class,那么说明这是一个由系统管理的对象,并不是由我们自己创建并导致内存泄漏的对象。&br&&br&根据我们在Android studio的Java heap文件的提示,TestActivity对象有可能发生了内存泄漏,于是我们直接在上面搜TestActivity(这个搜索功能也是很强大的):&br&&br&左边的inspector可以查看对象内部的各种信息:&br&&figure&&img src=&https://pic4.zhimg.com/v2-8af972cb92a81ea20ab40d70c47da9c9_b.jpg& data-rawwidth=&1246& data-rawheight=&695& class=&origin_image zh-lightbox-thumb& width=&1246& data-original=&https://pic4.zhimg.com/v2-8af972cb92a81ea20ab40d70c47da9c9_r.jpg&&&/figure&&br&当然,如果你觉得按照默认的排序方式来查看不方便,你可以自行设置排序的方式:&br&&/p&&ul&&li&Group by class&/li&&li&Group by class loader&/li&&li&Group by package&/li&&/ul&&br&&figure&&img src=&https://pic1.zhimg.com/v2-11f1f3b3c0fa8eb8a8718_b.jpg& data-rawwidth=&882& data-rawheight=&603& class=&origin_image zh-lightbox-thumb& width=&882& data-original=&https://pic1.zhimg.com/v2-11f1f3b3c0fa8eb8a8718_r.jpg&&&/figure&从上图可以看出,我们搜出了3个TestActivity的对象,一般在退出某个activity后,就结束了一个activity的生命周期,应该会被GC正常回收才对的。通常情况下,一个activity应该只有1个实例对象,但是现在居然有3个TestActivity对象存在,说明之前的操作,产生了3个TestActivity对象,并且无法被系统回收掉。&p&接下来继续查看引用路径。&br&&br&对着TestActivity对象点击右键 -& Merge Shortest Paths to GC Roots(当然,这里也可以选择Path To GC Roots) -& exclude all phantom/weak/soft etc. references&br&&br&为什么选择exclude all phantom/weak/soft etc. references呢?因为弱引用等是不会阻止对象被垃圾回收器回收的,所以我们这里直接把它排除掉&br&&figure&&img src=&https://pic4.zhimg.com/v2-e9efee3ec4fb9c5d0811cc1_b.jpg& data-rawwidth=&1000& data-rawheight=&519& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic4.zhimg.com/v2-e9efee3ec4fb9c5d0811cc1_r.jpg&&&/figure&&br&接下来就能看到引用路径关系图了:&br&&figure&&img src=&https://pic3.zhimg.com/v2-f0ae35efcb7cce1ff3c1e227c255ea2b_b.jpg& data-rawwidth=&906& data-rawheight=&490& class=&origin_image zh-lightbox-thumb& width=&906& data-original=&https://pic3.zhimg.com/v2-f0ae35efcb7cce1ff3c1e227c255ea2b_r.jpg&&&/figure&从上图可以看出,TestActivity是被this$0所引用的,它实际上是匿名类对当前类的引用。this$0又被callback所引用,接着它又被Message中一串的next所引用...到这里,我们就已经分析出内存泄漏的原因了,接下来就是去改善存在问题的代码了。&br&&br&2)Histogram&br&&figure&&img src=&https://pic4.zhimg.com/v2-cb8ee3cade_b.jpg& data-rawwidth=&702& data-rawheight=&712& class=&origin_image zh-lightbox-thumb& width=&702& data-original=&https://pic4.zhimg.com/v2-cb8ee3cade_r.jpg&&&/figure&这里是把当前应用程序中所有的对象的名字、数量和大小全部都列出来了,那么Shallow Heap又是什么意思呢?就是当前对象自己所占内存的大小,不包含引用关系的。&br&&br&上图当中,byte[]对象的Shallow Heap最高,说明我们应用程序中用了很多byte[]类型的数据,比如说图片。可以通过右键 -& List objects -& with incoming references来查看具体是谁在使用这些byte[]。&br&&br&当然,除了一般的对象,我们还可以专门查看线程对象的信息:&br&&figure&&img src=&https://pic1.zhimg.com/v2-36c0204104cfc6f63e115f0d5cbba459_b.jpg& data-rawwidth=&1240& data-rawheight=&548& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic1.zhimg.com/v2-36c0204104cfc6f63e115f0d5cbba459_r.jpg&&&/figure&Histogram中是可以显示对象的数量的,比如说我们现在怀疑TestActivity中有可能存在内存泄漏,就可以在第一行的正则表达式框中搜索“TestActivity”,如下所示:&/p&&p&&figure&&img src=&https://pic2.zhimg.com/v2-b55c0a4fc8d49f0a8ad72_b.jpg& data-rawwidth=&610& data-rawheight=&336& class=&origin_image zh-lightbox-thumb& width=&610& data-original=&https://pic2.zhimg.com/v2-b55c0a4fc8d49f0a8ad72_r.jpg&&&/figure&&br&接下来对着TestActivity右键 -& List objects -& with outgoing references查看具体TestActivity实例&br&&br&注:&br&List objects -& with outgoing references :表示该对象的出节点(被该对象引用的对象)&br&List objects -& with incoming references:表示该对象的入节点(引用到该对象的对象)&br&&br&如果想要查看内存泄漏的具体原因,可以对着任意一个TestActivity的实例右键 -& Merge Shortest Paths to GC Roots(当然,这里也可以选择Path To GC Roots) -& exclude all phantom/weak/soft etc. references,如下图所示:&br&&figure&&img src=&https://pic3.zhimg.com/v2-2d23ac496e2d07edd66a462dbabe238d_b.jpg& data-rawwidth=&1198& data-rawheight=&587& class=&origin_image zh-lightbox-thumb& width=&1198& data-original=&https://pic3.zhimg.com/v2-2d23ac496e2d07edd66a462dbabe238d_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-ed5e431a1e2a9b490bb032_b.jpg& data-rawwidth=&918& data-rawheight=&445& class=&origin_image zh-lightbox-thumb& width=&918& data-original=&https://pic1.zhimg.com/v2-ed5e431a1e2a9b490bb032_r.jpg&&&/figure&&/p&&p&从这里可以看出,Histogram和Dominator Tree两种方式下操作都是差不多的,只是两种统计图展示的侧重点不太一样,实际操作中,根据需求选择不同的方式即可。&br&&br&3)两个hprof文件的对比&br&为了排查内存泄漏,经常会需要做一些前后的对比。下面简单说一下两种对比方式:&br&&br&1.直接对比&br&&br&工具栏最右边有个“Compare to another heap dump”的按钮,只要点击,就可以生成对比后的结果。(注意,要先在MAT中打开要对比的hprof文件,才能选择对比的文件):&br&&figure&&img src=&https://pic3.zhimg.com/v2-f4e72d2a6c5db544b36b1aa_b.jpg& data-rawwidth=&661& data-rawheight=&704& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&https://pic3.zhimg.com/v2-f4e72d2a6c5db544b36b1aa_r.jpg&&&/figure&&br&2.添加到campare basket里对比&br&&br&在window菜单下面选择compare basket:&br&&figure&&img src=&https://pic4.zhimg.com/v2-e489acc0bff9a27acf61d_b.jpg& data-rawwidth=&784& data-rawheight=&503& class=&origin_image zh-lightbox-thumb& width=&784& data-original=&https://pic4.zhimg.com/v2-e489acc0bff9a27acf61d_r.jpg&&&/figure&&br&在文件的Histogram view模式下,在navigation history下选择add to compare basket:&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-bfbabd93a93_b.jpg& data-rawwidth=&392& data-rawheight=&274& class=&content_image& width=&392&&&/figure&&br&然后就可以通过 Compare Tables 来进行对比了:&br&&figure&&img src=&https://pic7.zhimg.com/v2-d3411f46affd6_b.jpg& data-rawwidth=&721& data-rawheight=&270& class=&origin_image zh-lightbox-thumb& width=&721& data-original=&https://pic7.zhimg.com/v2-d3411f46affd6_r.jpg&&&/figure&&/p&&br&&h2&7.总结&/h2&&p&最后,还是要再次提醒一下,工具是死的,人是活的,MAT也没有办法保证一定可以将内存泄漏的原因找出来,还是需要我们对程序的代码有足够多的了解,知道有哪些对象是存活的,以及它们存活的原因,然后再结合MAT给出的数据来进行具体的分析,这样才有可能把一些隐藏得很深的问题原因给找出来。&/p&&br&参考资料:&br&(1)&a href=&http://link.zhihu.com/?target=http%3A//www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/%3Fspm%3D.blogcontcEc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java的内存泄漏&/a&&br&(2)&a href=&http://link.zhihu.com/?target=http%3A//ju.outofmemory.cn/entry/172684& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android内存优化之一:MAT使用入门&/a& &br&(3)&a href=&http://link.zhihu.com/?target=http%3A//ju.outofmemory.cn/entry/172685& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android内存优化之二:MAT使用进阶&/a& &br&(4)&a href=&http://link.zhihu.com/?target=http%3A//bugly.qq.com/bbs/forum.php%3Fmod%3Dviewthread%26tid%3D21%26highlight%3D%25E5%E5%25AD%%25B3%%259C%25B2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&内存泄漏从入门到精通三部曲之基础知识篇&/a&&br&(5)&a href=&http://link.zhihu.com/?target=http%3A//bugly.qq.com/bbs/forum.php%3Fmod%3Dviewthread%26tid%3D125%26highlight%3D%25E5%E5%25AD%2598& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&内存泄漏从入门到精通三部曲之常见原因与用户实践&/a&
1.Java内存分配策略 Java 程序运行时的内存分配策略有三种:静态分配、栈式分配和堆式分配。对应的存储区域如下: 静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。 栈…
&figure&&img src=&https://pic2.zhimg.com/v2-23bc372fcbbd_b.jpg& data-rawwidth=&980& data-rawheight=&653& class=&origin_image zh-lightbox-thumb& width=&980& data-original=&https://pic2.zhimg.com/v2-23bc372fcbbd_r.jpg&&&/figure&嗨~~各位玩机多年的老司机们,今天,我来向大家,介绍一番,自己搞机多年的经历,和有关Xposed与Magisk的故事吧。&br&&br&&br&&p&刚开始接触智能手机,是我高三毕业的时候。那年暑假,有许多空闲,和同学们去KTV、开Party、回去探望班主任,我经历过,每一个高考过后的学生,都该经历的疯狂时光。&/p&&br&&br&&p&玩得久了,心也有点累了,除了陪妈妈逛商场,买上大学穿的裙子、鞋、挑化妆品;我还央求妈妈,给我买一部「智能手机」。&/p&&br&&br&&p&于是,那部「诺基亚E6」,就随着亚马逊快递的小盒子,送到了我的手中。&/p&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-715ff98bacf642d32ea57_b.jpg& data-rawwidth=&500& data-rawheight=&332& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic3.zhimg.com/v2-715ff98bacf642d32ea57_r.jpg&&&/figure&&br&&p&当时的诺基亚,虽然处在「燃烧的平台」之势,但余威还是有的,这部E6,触控屏,搭载Symbian 3 Anna,后来被我升级成了Bella,既能装S60 V5版的微信,还能装飞信呢!&/p&&br&&br&&p&我们辅导员,都用飞信群发短信,可以省点短信费,她非要让我们用移动号,但联通给我的流量多,本宫才不用移动呢!&/p&&br&&br&&p&就这样开心地用到大一下,我发现,Symbian 3,真得越来越不中用了~~&/p&&br&&br&&p&眼巴巴地望穿,Android 和 iOS 版微信,一个月更新两三次,而Symbian 3的微信,永远停留在4.2,再也不更新了,不能和朋友们耍「表情包」,也不能「打飞机」啦~~&/p&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-f20bc7550bbf49dbc142_b.jpg& data-rawwidth=&279& data-rawheight=&180& class=&content_image& width=&279&&&/figure&&br&&p&我想,不能再这么「非主流」下去了,精挑细选,在狗东上换了部Samsung Glaxy S4,果然还是白色,我更喜欢一些~~&/p&&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-d7ac04e1b862e1cc7cb5a1bdd76d7394_b.jpg& data-rawwidth=&722& data-rawheight=&112& class=&origin_image zh-lightbox-thumb& width=&722& data-original=&https://pic4.zhimg.com/v2-d7ac04e1b862e1cc7cb5a1bdd76d7394_r.jpg&&&/figure&&br&&p&起初,对Android的操作,还是不太熟悉,但是经过不断的摸索,终于也用的比较溜了,S4可以换电池,就是可拆卸的大塑料卫生巾后盖,有些low。&/p&&br&&br&&p&大概用了三、四个月吧,电池好像有些不太中用了,然后又买了第二块电池,每天充满电,带着手机去上课,包里肯定是要放一个备用的。&/p&&br&&br&&p&刷刷微信,看一集《破产姐妹》,就得换一块了。&/p&&br&&br&&p&当时还是个萌新,啥也不懂,正好迎来周五,电脑社的活动时间,问了下学长大佬,为什么手机电池,消耗得这么快呢?&/p&&br&&br&&p&&i&嗯,电池应该是老化了;还有,你的手机,从来没「优化」过,后台的东西太多,让你的手机,白白掉了好多电&/i&&/p&&br&&br&&p&听着大佬的「告诫」,一只萌新,在瑟瑟发抖,感觉自己的手机,就这么废了。&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-362fa3e29eac322cb35eba5_b.jpg& data-rawwidth=&250& data-rawheight=&210& class=&content_image& width=&250&&&/figure&&br&&p&大佬就是大佬,有他的气度在,他告诉我,在手机上,装一个360安全卫士,然后感觉手机发热了,就点一下「一键清理」,世界就清净啦!&/p&&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-84bd57cbe56eb470f6a4afe_b.jpg& data-rawwidth=&440& data-rawheight=&440& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&https://pic4.zhimg.com/v2-84bd57cbe56eb470f6a4afe_r.jpg&&&/figure&&br&&p&听从了大佬的建议,我就整天和「发热」作斗争,刚开始,效果还是有的,不过后遗症也很明显:&/p&&br&&br&&p&&i&手机变得更热,还变卡了!&/i&&/p&&br&&br&&p&我尝试过重置手机,重复大佬告诉的方法,问题依旧。于是,我只能请求Google了!&/p&&br&&br&&p&那段时间,课也不怎么好好上,没课的时候,饭全是让舍友带上来的,头发乱得像鸡窝。&/p&&br&&br&&p&如果非要出门,必是:素颜+清水蘸梳子理下头。宿舍里的其他姑娘,以为我沉迷「网恋」了呢,哈哈~~&/p&&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-6e0e69cb80cea_b.jpg& data-rawwidth=&200& data-rawheight=&200& class=&content_image& width=&200&&&/figure&&br&&p&感谢那段疯狂的时光,我终于弄明白了Android的「后台」、「前台」、「唤醒」等概念,也顺便利用舍友的iPhone 4s,弄清楚了「墓碑机制」、「推送」、「伪后台」到底是什么玩意儿。&/p&&br&&br&&p&PC玩了多年,自然还是很熟悉的,不但有一台自用的Thinkpad T400,&b&还有一台高三暑假时,自己组的台式机。&/b&&/p&&br&&br&&p&原来,自由开放的Android 系统,和Windows有好多相似的地方呀!&br&&/p&&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-ebf5af94fe55d66_b.jpg& data-rawwidth=&310& data-rawheight=&237& class=&content_image& width=&310&&&/figure&&br&&p&它们的应用,都是有「自启」机制,而且,Android还赋予了开发者,「退出」和「回主屏」按钮,不同的切换机制。&/p&&br&&br&&p&按理来说,用户按「退出」键,应用就应该完全退出后台了(这个时候,应该给「知乎」的App点个赞哦!),按「回主屏」键,应用也不能像在前台那样,活跃的那么明显。&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-fea3ee5e96ba7_b.jpg& data-rawwidth=&1240& data-rawheight=&857& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic2.zhimg.com/v2-fea3ee5e96ba7_r.jpg&&&/figure&&br&&p&可惜,国内的这些「毒瘤」们,Google也管不着,它们厚颜无耻地,想方设法地,将自己留驻在后台,不但争抢用户们的使用时间,还消耗着我手机的后台资源!&/p&&br&&br&&p&甚至,有好长时间,我都没有打开过的应用,它们也在后台,持续「作死」~~&/p&&br&&br&&p&&figure&&img src=&https://pic3.zhimg.com/v2-60ead86a3bcb614e95eea4d2d4749611_b.jpg& data-rawwidth=&309& data-rawheight=&237& class=&content_image& width=&309&&&/figure&&i&我离学长越来越远,最后走向一个「无人的深渊」…………&/i&&/p&&br&&br&&p&当我慢慢地从深坑里,爬出来的时候,我知道了一些,本不该属于Android系统自身的缺陷。&/p&&br&&br&&p&我学会了「刷机」、「Root」、「冻结应用(就是钛备份啦)」、「自启控制(Boot Manager)」,终于,到了最后一刻,我有些手足无措:&/p&&br&&br&&p&&i&预装的 App,全被「冻结」了,但常用的微信、支付宝之流,总不能为了省电流畅,每次不用的时候就「冻结」,用的时候再「解冻」吧?&/i&&br&&/p&&br&&br&&p&这个时候,我仿佛听到了上帝的声音:&/p&&br&&br&&p&&i&老妹儿 ~~~
你听说过「绿色守护」吗?&/i&&/p&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-4fce8dd84f9e656f9ffb8b_b.jpg& data-rawwidth=&440& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&https://pic3.zhimg.com/v2-4fce8dd84f9e656f9ffb8b_r.jpg&&&/figure&&br&&p&于是,「绿色守护」就成了我的得力玩机伙伴,「绿色守护」可以强制让各种应用,「遵循」Google公布的标准,在前台,就老老实实地工作,切换到后台,就让应用们「睡着」,让国内的Android 手机,重新找回iPhone的丝滑体验,感谢 &a href=&https://www.zhihu.com/people/7b204cdff0d2dafcfd81b9a9f2350ea9& data-hash=&7b204cdff0d2dafcfd81b9a9f2350ea9& class=&member_mention& data-editable=&true& data-title=&@Oasis Feng& data-hovercard=&p$b$7b204cdff0d2dafcfd81b9a9f2350ea9&&@Oasis Feng&/a& 的无私付出!&/p&&br&&br&&p&后来我才知道,「绿色守护」里,有一整套高级「组合拳」,来彻底整治「毒瘤」们,既然要装App提示的模块,那就先安装好了:&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-0ee89cac7d00c_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-0ee89cac7d00c_r.jpg&&&/figure&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-bcdde9bad946fdd6b49f_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-bcdde9bad946fdd6b49f_r.jpg&&&/figure&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-b430eaef0d1e287cc34f3eef8f2c5c3d_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-b430eaef0d1e287cc34f3eef8f2c5c3d_r.jpg&&&/figure&&br&&p&当时,S4 搭载的是,基于Android 4.4.2定制的TouchWiz UI,只需要一个Xposed.apk安装包就行,不像Android 5.0以后的版本,还要在Recovery里,刷对应系统版本的zip包,再在系统里,安装GUI 的Xposed 。&/p&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-1e29a50c4c7afbb29f5daf_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic3.zhimg.com/v2-1e29a50c4c7afbb29f5daf_r.jpg&&&/figure&&br&&p&开启 Xposed 高级功能的「绿色守护」,果然变得比以前给力多了,手机不发热,不卡,换了新电池,就像换了一部新手机一样!&/p&&br&&br&&p&「绿色守护」、「Xposed」相伴我许久,渐渐地,我也知道了,Xposed是一款替换Android 系统 /system/bin 目录下,底层文件的框架,可以直接替代系统,接管Android 的各种底层功能。&br&&/p&&br&&br&&p&基于Xposed框架开发出的模块有很多,Xposed,为Android App 和系统底层,提供了一个桥梁:&/p&&br&&br&&p&用户可以在App里,直接实现各种高级功能,比如:替换微信UI风格、绿色守护的高级休眠、用「重力工具箱」,微调系统状态栏,锁屏界面等,真是相当强大啊!&/p&&br&&br&&p&&figure&&img src=&https://pic3.zhimg.com/v2-2e003faeb1a071e19fbf1ef_b.jpg& data-rawwidth=&1000& data-rawheight=&854& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic3.zhimg.com/v2-2e003faeb1a071e19fbf1ef_r.jpg&&&/figure&&i&锤子 Smartisan OS的独家功能——Bigbang(句子分词),可以完美移植到其他手机上,安装对应的Xposed模块,即可使用&/i&&/p&&br&&br&&p&说的再底层一点呢,Xposed Hook 了Android 的Java虚拟机,让支持Xposed的每一个插件,可以直接操纵系统里的每一个核心进程。&/p&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-f97a686ad_b.jpg& data-rawwidth=&353& data-rawheight=&383& class=&content_image& width=&353&&&/figure&&br&&br&&p&&i&&u&Root 是赋予用户最高权限的 Root 操作,而刷入Xposed,则是针对 Android Java 虚拟机底层的 Root&/u&&/i&&/p&&br&&br&&p&从陌生,到了解、熟悉、迷恋,充分利用好Xposed,为我的玩机经验,提升了很多。&/p&&br&&br&&p&那部2G运存的S4,用到大三,真的是有些不行了,然后,我又跳入了Windows Phone 的坑。&/p&&br&&br&&p&一部「骚黄」色的 Lumia 1520,满足了我对手机,所有美的追求:&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-f4fca13f2cc281ecdaf1f_b.jpg& data-rawwidth=&952& data-rawheight=&631& class=&origin_image zh-lightbox-thumb& width=&952& data-original=&https://pic2.zhimg.com/v2-f4fca13f2cc281ecdaf1f_r.jpg&&&/figure&&p&&i&我待微软如初恋,微软虐我千百遍!&/i&&/p&&br&&br&&p&Android 和 iOS应用,要多少,有多少;UWP应用,要多「少」,有多「少」~~(卖弄文字,是我的老本行(o`ε?o) )&/p&&br&&br&&p&Windows Phone(Win 10 Mobile的前身)系统的优势是,兼容并包了「部分」Android 的「开放」,和iOS较为严厉的App权限控制。&/p&&br&&br&&p&&figure&&img src=&https://pic1.zhimg.com/v2-27bac0e1dcad073378aca6e41fa87a09_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/v2-27bac0e1dcad073378aca6e41fa87a09_r.jpg&&&/figure&&i&这部 Lumia 1520,被我从 Windows Phone 8.1升级到 Win 10 Mobile( Version:10586)后,就雪藏在柜子里了&/i&&/p&&br&&br&&p&就这么晃荡到毕业,找了工作,分期买了一部魅族Pro 5,解锁了BootLoader,从XDA论坛,Down了一个基于AOSP源码,开发的 Lineage Android 7.1.1刷机包,重新拥抱Android !&/p&&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-c240c4b7efe075e23d26_b.jpg& data-rawwidth=&944& data-rawheight=&501& class=&origin_image zh-lightbox-thumb& width=&944& data-original=&https://pic4.zhimg.com/v2-c240c4b7efe075e23d26_r.jpg&&&/figure&&p&&i&我不喜欢 Flyme,我是原生党~~~&/i&&/p&&br&&br&&p&&figure&&img src=&https://pic4.zhimg.com/v2-82be5aed7b_b.jpg& data-rawwidth=&643& data-rawheight=&382& class=&origin_image zh-lightbox-thumb& width=&643& data-original=&https://pic4.zhimg.com/v2-82be5aed7b_r.jpg&&&/figure&&i&作为一名合格的玩机党,TWRP Recovery可不能没有&/i&&i&哦~~~&/i&&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-e617e9dcf46c8ca54d7666_b.jpg& data-rawwidth=&1088& data-rawheight=&547& class=&origin_image zh-lightbox-thumb& width=&1088& data-original=&https://pic2.zhimg.com/v2-e617e9dcf46c8ca54d7666_r.jpg&&&/figure&&br&&p&&i&感谢来自俄罗斯 &a href=&https://link.zhihu.com/?target=https%3A//github.com/faust93& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&faust93 (Vlad)&/a&大神的辛勤开发&/i&&br&&/p&&br&&br&&p&从Android 4.4.2直接跳到Android 7.1.1,Android这几年发生的巨大变化,令我深为咂舌:&/p&&br&&br&&p&Android 再也不是当年那个,界面丑陋、依靠各种第三方UI,来提升颜值的「卡卓(卡顿的安卓)」了。&/p&&br&&br&&p&我刷的底包,是ResurrectionRemix,定制性很强,支持Pro 5的mback、双击唤醒、双击顶部栏锁屏。&/p&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-36efd07db_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-36efd07db_r.jpg&&&/figure&&br&&br&&figure&&img src=&https://pic4.zhimg.com/v2-32bc4db68d0a933afee431_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic4.zhimg.com/v2-32bc4db68d0a933afee431_r.jpg&&&/figure&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-aadc0f6f6e16cf0e9aa6bd6f_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-aadc0f6f6e16cf0e9aa6bd6f_r.jpg&&&/figure&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-b167e696b1d41ce8b5562d_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-b167e696b1d41ce8b5562d_r.jpg&&&/figure&&br&&br&&p&刷成「准原生」Android 7.1.1后,第一时间,我就去XDA论坛的&a href=&https://link.zhihu.com/?target=https%3A//forum.xda-developers.com/xposed& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Xposed主页&/a&,找对应的zip和apk包!&br&&/p&&br&&br&&p&&figure&&img src=&https://pic2.zhimg.com/v2-8cf0dd7abe69dd24cdbc8e13ede1db49_b.jpg& data-rawwidth=&760& data-rawheight=&70& class=&origin_image zh-lightbox-thumb& width=&760& data-original=&https://pic2.zhimg.com/v2-8cf0dd7abe69dd24cdbc8e13ede1db49_r.jpg&&&/figure&&i&纳尼?不支持 Android 7.1,好桑我心~~~&/i&&/p&&br&&br&&p&顺带为大家介绍一下,Android虚拟机的进化简史,Google的举动,方便了用户,却为难了大神更新Xposed:&/p&&br&&br&&p&Android 5.0以后的版本,采用全新的ART编译方式:ART编译器,可以在App首次安装的时候,将通用的代码,「解释」成能被机器直接识别的「二进制代码」,无须每次运行的时候,都要「解释」一番,加快了应用的启动速度、提升了应用的运行效率。&br&&/p&&br&&br&&p&通用的,待「解释」的代码,理论上,可以适配所有机型。当App每次「立即运行时」,各种机型,各自再做相应的「解释」。&/p&&br&&br&&p&Android 5.0以前的旧虚拟机,用户打开→退出→再打开App,这个「解释」的过程,周而复始。&/p&&br&&br&&p&知道为什么「一键清理」不但不中用,还更费电了吧?(360「极客版」,「借鉴」了绿色守护的休眠机制)&/p&&br&&br&&p&不同机型的二进制代码,是根据不同的硬件平台(Soc)和系统内核,「解释」而成的,彼此并不通用,牺牲了效率,增强了兼容性。&/p&&br&&br&&p&凭借残存的「英语四级」经验,我明白了Xposed 的作者,&a href=&https://link.zhihu.com/?target=https%3A//forum.xda-developers.com/member.php%3Fu%3D4419114& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&rovo89&/a& 大神的苦衷:&br&&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-e742aeddac11c416db0c5bfb_b.jpg& data-rawwidth=&980& data-rawheight=&269& class=&origin_image zh-lightbox-thumb& width=&980& data-original=&https://pic2.zhimg.com/v2-e742aeddac11c416db0c5bfb_r.jpg&&&/figure&&p&&i&ART模式,尤其是Android 7.0以后,进化成 &a href=&https://link.zhihu.com/?target=http%3A//www.infoq.com/cn/news/2016/04/android-n-aot-jit& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Jit 即时编译模式&/a&,Android 按需要,将 App必要运行的部分,「解释」成二进制代码,剩余不常运行的部分,在用户日常打开 App时,继续「解释」,&u&加快了 App的安装速度,对应版本的 Xposed 框架开发,也变得更困难了&/u&&/i&&br&&/p&&br&&br&&p&Android 4.4及以前的虚拟机,是一套;Android 5.0/5.1/6.0 的虚拟机,换了一套;Android 7.0 以后的虚拟机,哇哦!又是更新过后的一套!!&/p&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-5bee5ce41ed5f8e917c47_b.jpg& data-rawwidth=&240& data-rawheight=&240& class=&content_image& width=&240&&&/figure&&br&&p&rove89 大神,应该很?塞塞吧~~ Google,你可别「作」啦!&/p&&br&&br&&p&rove89 表示:Android 7.0版的Xposed,还在开发中,但缺乏人手(所有工作全由他一个人完成),他在通读Android 7.0源码的同时,一周只有5个小时,着手相关开发,导致进度十分缓慢。&/p&&br&&br&&p&天呐,大神竟是如此敬业!甘愿放弃陪女友逛街、去看电影(但愿他有女朋友吧,阿门!)的时间,开发这么一个给力的、又不来钱的框架。&/p&&br&&br&&p&一般的女孩,要是做他的Girl Friend,早就不乐意,他这么「乱搞」了;换做我,当然是滋瓷他啦,哈哈~~&/p&&br&&br&&p&我不但「折腾」自己的S4,还折腾&b&爸爸妈妈的红米Note 4、LG G4,还有亲戚朋友们的小米4、华为、联想,以及闺蜜们的OPPO、vivo、iPhone(啊咧,混进来个iOS,其实就是关闭后台应用程序刷新,来做省电优化啦,嘻嘻~~),身经百战,我是见得多了。&/b&&/p&&br&&br&&p&&b&可是,到现在,我才明白:&/b&&/p&&br&&br&&blockquote&&p&&b&手机的本质,终究是拿来用的。&/b&&/p&&/blockquote&&br&手机壁纸也懒得换了,装了个Smalite的图标包,很喜欢这种,扁平化的设计风格呢~~酷安有下载。各位伸手党,别找姐姐要了,请自寻吧:&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-04125f4aec2bb05fdcdf_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-04125f4aec2bb05fdcdf_r.jpg&&&/figure&&br&&br&顺便安利一个Android启动器:Nova,长按部分App,可弹出高级功能。&br&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-e6b772e94fe1589c99ceb_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-e6b772e94fe1589c99ceb_r.jpg&&&/figure&&br&&br&但这种交互,还是不如iOS的3D Touch,带有Taptic Engine那样的回馈比较好,不要往「震动」上想歪了哦~~&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-d7a4ea9e68bc46f3e6cb9_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-d7a4ea9e68bc46f3e6cb9_r.jpg&&&/figure&&br&&p&从短暂的挣扎中苏醒,我只求,能让这些国产毒瘤们,按需「冻结」、按需「唤醒」,「绿色守护」的 Root 且非 Xposed 模式,虽然可以用,但效果不是太好。&/p&&br&&figure&&img src=&https://pic2.zhimg.com/v2-fbd2d191e836b4a6e555d1_b.jpg& data-rawwidth=&380& data-rawheight=&334& class=&content_image& width=&380&&&/figure&&br&&p&强烈的求知欲,促使我找到了「&a href=&https://link.zhihu.com/?target=http%3A//www.coolapk.com/apk/me.piebridge.brevent& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&黑域&/a&」,当得知「黑域」的运行原理后,我激动的跳了起来,&b&不小心碰倒了桌上的香水,没合盖,全撒到小裤裤、腿上了!香水好贵好贵的,差点儿要泪奔了~~~&/b&&br&&/p&&br&&br&&p&天气愈发的热了。平时,下身只喜欢穿着一条,草莓、圆圈花色的小裤裤,在房间里跑来跑去。&/p&&br&&br&&p&这下可好,迈着湿哒哒的双腿跑去浴室,洗了好几遍澡,还是「馨香扑鼻」,&b&那几天去上班的时候,同事看我,都是一副关爱傻子的眼神&/b&:&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-a92bd6fe266bf83_b.jpg& data-rawwidth=&360& data-rawheight=&310& class=&content_image& width=&360&&&/figure&&p&&i&脸可以不要,好工具可不能不要!&/i&&/p&&br&&br&&p&安装、配置「黑域」的教程,以后我再细讲。&/p&&br&&br&&p&有了「黑域」的强力控制,我逐渐适应了,没有Xposed 的日子,系统UI,用原生的就好,特别喜欢,Android 7.0 Pixe l界面,底下的实心、纯白的「三大金刚」按钮!&br&&/p&&br&&br&&p&安顿下来几天后,我在系统自带的应用里,找到一个这个图标:&/p&&br&&br&&figure&&img src=&https://pic2.zhimg.com/v2-077fad4fa8_b.jpg& data-rawwidth=&225& data-rawheight=&225& class=&content_image& width=&225&&&/figure&&br&&p&好奇地点开看了,界面似曾相识:&/p&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-485310abf435fe4680f0fddd_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-485310abf435fe4680f0fddd_r.jpg&&&/figure&&br&&p&竟然有「模块」功能区,简直Xposed附体,还顺带「超级用户」!&/p&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-a62c748fbd3_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-a62c748fbd3_r.jpg&&&/figure&&br&&br&&figure&&img src=&https://pic3.zhimg.com/v2-34fa7f92b6_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-34fa7f92b6_r.jpg&&&/figure&&br&&p&Xposed老矣,来了个新生代——「Magisk」,我很喜欢「Magisk」的图标,像是一个京剧脸谱(是中国台湾人开发的)&br&&/p&&br&&br&&p&目前,有关Magisk的资料、模块资源,还不是太多,我大概了解了一下:Magisk,可以在不修改Android系统 /system/bin 文件的情况下,提供深度定制的效果。Magisk自带开源的Root,不用再装Super SU了(Super SU已被国内厂商CCMT收购,未来有可能作恶)。&br&&/p&&br&&br&&p&Magisk毕竟很年轻,其模块数量,当然不如老牌的Xposed上万个那么丰富,到现在为止,只有几十个。不少模块的功能,还是针对特定机型开发的。&br&&/p&&br&&br&&p&Xposed作者rovo89,对Magisk的作者:topjohnw寄予厚望,他协助topjohnwu,开发了基于 Magisk 的 Xposed 框架,理论上可以支持所有的 Xposed 模块,但也仅限于Android 5.0/5.1/6.0 。&br&&/p&&br&&br&&p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/topjohnwu& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&topjohnwu&/a&的GitHub主页:&br&&/p&&br&&br&&p&&figure&&img src=&https://pic2.zhimg.com/v2-9f5ede20af0d94_b.jpg& data-rawwidth=&1280& data-rawheight=&833& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/v2-9f5ede20af0d94_r.jpg&&&/figure&&i&真的挺为这个,和我们同宗同族的年轻人,而感到骄傲!&/i&&/p&&br&&br&&p&&figure&&img src=&https://pic4.zhimg.com/v2-561af9a308b93ad0f1d8eb84387bee79_b.jpg& data-rawwidth=&468& data-rawheight=&149& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic4.zhimg.com/v2-561af9a308b93ad0f1d8eb84387bee79_r.jpg&&&/figure&&i&topjohnwu是一位,来自中国台湾的 Android开发者&/i&&/p&&br&&br&&p&&i&&figure&&img src=&https://pic2.zhimg.com/v2-dae183b60f853ad1d0c71d15bf44a282_b.jpg& data-rawwidth=&952& data-rawheight=&644& class=&origin_image zh-lightbox-thumb& width=&952& data-original=&https://pic2.zhimg.com/v2-dae183b60f853ad1d0c71d15bf44a282_r.jpg&&&/figure&Magisk,应该是通过修改,Android系统的 build.prop文件参数,来提供定制吧&/i&&/p&&br&&br&&p&以上,就是我,作为一个宅女,玩机的大致经历,老司机谈不上,只是懂得比大部分人要多一些。&/p&&br&&br&&p&在这个「基友遍地走,妹子从没有」的玩机圈。我只想,满足自己的求知欲。不想背负,「性别歧视」的压力;更不想因此,受到大神们,怀揣着「爱意」的特殊关怀。&br&&/p&&br&&br&&p&所以,这条路,这条实属歪门邪道的折腾之路。从一开始,我就决定了,要这样独自走下去。最后,就这么磕磕绊绊地,从懵懂,到略懂,摸爬滚打,一直走到了今天。&br&&/p&&br&&br&&p&为了不屈从自己的倔强,我放弃了一切「求助」和「伸手」的机会:只「泡」论坛,不「混」论坛;更不想以「大姐大」为自居,故作高深,误导小白。&/p&&br&&br&&p&吾何德何能?尝自娱自乐罢~大丈夫だ,問題ない!&br&&/p&&br&&br&&p&吃过很多亏,也为许多次黑屏后,荧幕重新亮起,而欢欣不已。&/p&&br&&br&&p&那种漫长的等待,像是忍着剧痛,迎来自己的骨肉,啼哭的那一刻。她/他/它们身上,烙印着我的心血与付出,更是我精神的延续。&/p&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-de_b.jpg& data-rawwidth=&275& data-rawheight=&183& class=&content_image& width=&275&&&/figure&&br&&p&或许,女性天生的,坚韧、细致,和认真的品质,是我「搞机」以来,小有所成的支柱吧~~
虽然,以这样的性别,做这些举动,世人看我,实在「异类」。&/p&&br&&br&&p&这就是我,一个女司机,一个散养的女司机:&/p&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-0cadaef0db71_b.jpg& data-rawwidth=&438& data-rawheight=&453& class=&origin_image zh-lightbox-thumb& width=&438& data-original=&https://pic1.zhimg.com/v2-0cadaef0db71_r.jpg&&&/figure&&br&&blockquote&&p&&i&你恰好喜欢美妆、香水、手包;&/i&&br&&/p&&br&&br&&br&&p&&i&我恰好喜欢手机、数码,和电脑;&/i&&/p&&br&&br&&br&&p&&i&爱好没有高上低下,有愿意付之一生的,就好&/i&&/p&&/blockquote&
嗨~~各位玩机多年的老司机们,今天,我来向大家,介绍一番,自己搞机多年的经历,和有关Xposed与Magisk的故事吧。 刚开始接触智能手机,是我高三毕业的时候。那年暑假,有许多空闲,和同学们去KTV、开Party、回去探望班主任,我经历过,每一个高考过后的学…
&p&我要说一下我的中心思想,就是必须有一个强制性、严格审核、规范化的应用市场,才能让应用程序规范化,后台不费电、手机不卡顿,我并不反对应用后台运行,只是国产流氓们后台运行不是为了干正事,而是为了耍流氓,对付这些流氓,靠绿色应用公约是没有用的,只有一个强行所有人都去用的规范化的应用市场才能办得到。&/p&&br&&p&大家都知道国内Android手机的卡顿,都是因为大流氓造成的,绿色应用公约顶多对付一下小流氓,而小流氓可取代性很强,大不了换个别不流氓的用就是了,而大流氓会听你的么?&/p&&p&==========================================&/p&&p&先说结论,没有用。&/p&&br&&p&我早就看清楚Android系统为什么卡顿的本质了,这个问题要从两个方面来看。第一个方面,是操作系统的设计逻辑,第二个方面,涉及到一些非技术的原因。&/p&&br&&p&我先问你,如果你买了一台Android手机,你什么软件都不安装,你认为会卡吗?&/p&&br&&p&答案当然是不会卡了,那为什么iOS系统软件装多了,不卡,Android手机装多了,会卡?&/p&&br&&p&这就涉及到系统的设计逻辑,因为Android系统允许应用程序在后台运行,那么如果每个应用程序都在后台运行的话,系统资源不是无限的,内存不是无限大,CPU不是无限快,所以肯定就会导致系统卡顿。而且在中国,所有的大厂应用全部都会后台运行,如果你装了100个应用,那么后台就会运行100个,这样多大的内存多快的处理器都不好使。&/p&&br&&p&而iOS系统是不允许应用程序在后台运行的,所以无论你装多少个,他顶多占用空间而已,不允许的程序怎么会占系统资源呢。iOS系统是墓碑机制的,当你按下Home键之后,应用程序就暂停运行,只保留一些系统允许他做的在运行,如果切换回去,就会唤醒那个墓碑,应用开始运行,当打开了足够多的应用之后,墓碑空间不够用了,就会被挤出去,再打开就会重新启动应用。&/p&&br&&p&另外iOS系统是沙盒机制,每个应用程序,只能访问自己的数据,一个程序他也只能自己启动,不能干}

我要回帖

更多关于 安卓手机录屏软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信