问题

最近有个小需求,能通过自动化对app进行GC回收

对于app的处理无外乎主动调用System.gc()或者使用adb命令直接进行GC回收

解决方法

方法一

在代码里的某个方法调用System.gc(),如我申明一个receiver,然后通过接受外不广播,去调用System.gc()完成gc回收的触发,如

public class GCReceiver extends BroadcastReceiver {private static final String TAG = "GCReceiver";private static final String ACTION_GC = "com.tomes.ACTION_GC";@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();Log.i(TAG, "onReceive: " + action);if (ACTION_GC.equals(action)) {System.gc();}}
}
        <receiverandroid:name="com.tomes.GCReceiver"><intent-filter><action android:name="com.tomes.ACTION_GC" /></intent-filter></receiver>

需要触发的时候,只需要执行adb命令

adb shell am broadcast -a com.tomes.ACTION_GC -f 0x01000000 --es configs 0xCF0400

方法二

有没有不要额外给app编码的方法去触发gc回收呢?有的

直接上答案,adb shell进入手机的shell环境

kill -10 应用pid

触发结果如下:

2022-03-31 14:42:43.750 13997-14011/com.tomes.gctest I/.tomes.gctest: SIGUSR1 forcing GC (no HPROF) and profile save
2022-03-31 14:42:43.782 13997-14011/com.tomes.gctest I/.tomes.gctest: Explicit concurrent copying GC freed 44(32KB) AllocSpace objects, 0(0B) LOS objects, 79% free, 1577KB/7721KB, paused 92us total 31.781ms

有些小伙伴在执行kill -10 时可能会提示

sh: kill: 13997: Permission denied

这时,你需要权限,root手机可以切换到root用户,非root手机的,在app是debug模式时

则可以执行run-as命令去拿到权限

run-as 包名

kill -10 GC的原理探究

查看as如何强制触发gc的

源码如下(由于源码很清晰,所以不再做额外的解释):

//bionic/libc/kernel/uapi/asm-x86/asm/signal.h
//定义信号量
#define SIGUSR1 10
//art/runtime/signal_catcher.cc
void* SignalCatcher::Run(void* arg) {SignalCatcher* signal_catcher = reinterpret_cast<SignalCatcher*>(arg);CHECK(signal_catcher != nullptr);Runtime* runtime = Runtime::Current();CHECK(runtime->AttachCurrentThread("Signal Catcher", true, runtime->GetSystemThreadGroup(),!runtime->IsAotCompiler()));Thread* self = Thread::Current();DCHECK_NE(self->GetState(), ThreadState::kRunnable);{MutexLock mu(self, signal_catcher->lock_);signal_catcher->thread_ = self;signal_catcher->cond_.Broadcast(self);}// Set up mask with signals we want to handle.SignalSet signals;signals.Add(SIGQUIT);signals.Add(SIGUSR1);while (true) {int signal_number = signal_catcher->WaitForSignal(self, signals);if (signal_catcher->ShouldHalt()) {runtime->DetachCurrentThread();return nullptr;}switch (signal_number) {case SIGQUIT:signal_catcher->HandleSigQuit();break;//处理接收到的信号量10case SIGUSR1://强制GC回收signal_catcher->HandleSigUsr1();break;default:LOG(ERROR) << "Unexpected signal %d" << signal_number;break;}}
}
//art/runtime/signal_catcher.cc
void SignalCatcher::HandleSigUsr1() {//这里我们能看到系统里打印出来的日志,作为佐证LOG(INFO) << "SIGUSR1 forcing GC (no HPROF) and profile save";Runtime::Current()->GetHeap()->CollectGarbage(/* clear_soft_references= */ false);ProfileSaver::ForceProcessProfiles();
}

Android 自动化触发GC相关推荐

  1. android定时调用gc,Android性能:远程触发GC

    一.远程触发GC原理 我们都知道 GC 是java虚拟机释放内存的机制. 一般的在当前进程触发GC有两种方式: 主动触发.调用System.gc() 被动触发.预分配的内存不足 or OOM之前 有没 ...

  2. Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放

    MonkeyRunner 系列文章 MonkeyRunner简介 MonkeyRunner 三大模块 MonkeyRunner API MonkeyDevice API MonkeyImage API ...

  3. Android自动化的一般方法

    1 背景 https://mp.weixin.qq.com/s/B7o3JSkYI_9c4RivatsZKQ Android自动化包含自动化测试和第三方App的自动化运行,这里的自动化测试主要指的是纯 ...

  4. Android自动化框架对比

    简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的"变", 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是 ...

  5. Android自动化大讲堂34--终极自动化框架UIAutomator使用详解

    <深入理解Android自动化测试> 又双叒叕重印咯!!! 无以为报,只能改版得更漂亮一点来答谢各位的厚爱! 好了,废话少说,咱们开始吧! 终极自动化框架UIAutomator使用详解 注 ...

  6. Android R常见GC类型与问题案例

    前言 Android系统的APP运行需要依赖ART虚拟机(Android Runtime),ART虚拟机的主要作用是给APP的java代码提供运行环境,其中编译.执行.垃圾回收(GC)模块是ART虚拟 ...

  7. [转] android自动化之MonkeyRunner测试环境配置(一)

    Android自动化测试之MonkeyRunner 一.Android自动化测试之环境搭建 1.1  Android-sdk介绍 ¢ SDK(Software development kit)软件开发 ...

  8. [Android]手动触发OnClick事件

    一.实现代码 1.1 将下面代码写在类中,注意不是方法内部!     OnClickListener OnClickEvent = new OnClickListener(){             ...

  9. Android自动化测试之MonkeyRunner录制和回放脚本

    Android自动化测试之MonkeyRunner录制和回放脚本(十一) 分类: 自动化测试 Android自动化 2013-02-22 10:57 7346人阅读 评论(2) 收藏 举报 andro ...

最新文章

  1. Cordova+jQuery Mobile+Spring REST
  2. setDAta 字符串拼接
  3. 集合框架源码分析一(接口篇)
  4. maven开发工具安装
  5. ITK:轮廓空间对象
  6. 封神-核心功能 | 钉钉告警+数据网关
  7. C,C++中使用可变参数
  8. C#实现ByteBuffer类 .
  9. 了解Linux操作系统发展阶段
  10. Linux中的软件源详解,linux软件管理构建本地源实例详解
  11. Part 1——使用 Go Modules
  12. *与**在python中的使用
  13. 一步一步 ITextSharp Anchor Image Chapter Section使用
  14. 用mysecureshell搭建sftp
  15. 电工学习笔记————稳压二极管伏安特性
  16. JDK11下载与安装 win10 64位
  17. Java JDBC学习
  18. Cterm里面自动发帖的Python脚本
  19. 文献笔记(9)(2019ISSCC)
  20. 2022年3月份报告合集(共353份)

热门文章

  1. 【Linux】查看二进制文件内容
  2. php 模板 头部 尾部,网站头部尾部模板
  3. 用html和js编写黑洞数,黑洞数及其简单理论
  4. img/input等部分标签是行内标签,为什么也可以设置宽和高
  5. Glide加载动态图片
  6. linux之sudo apt-get install **** 是到哪里下载软件以及下载到哪里去了
  7. 二叉树的遍历及解题思路
  8. r语言 matlab 函数定义,R语言-编写自定义函数 ZZ
  9. mysql去重合并字符串_Mysql将近两个月的记录合并为一行显示
  10. 网络舆情监测是干嘛的?