Android 自动化触发GC
问题
最近有个小需求,能通过自动化对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相关推荐
- android定时调用gc,Android性能:远程触发GC
一.远程触发GC原理 我们都知道 GC 是java虚拟机释放内存的机制. 一般的在当前进程触发GC有两种方式: 主动触发.调用System.gc() 被动触发.预分配的内存不足 or OOM之前 有没 ...
- Android自动化测试之MonkeyRunner MonkeyDevice MonkeyImage API使用详解 脚本编写 脚本录制回放
MonkeyRunner 系列文章 MonkeyRunner简介 MonkeyRunner 三大模块 MonkeyRunner API MonkeyDevice API MonkeyImage API ...
- Android自动化的一般方法
1 背景 https://mp.weixin.qq.com/s/B7o3JSkYI_9c4RivatsZKQ Android自动化包含自动化测试和第三方App的自动化运行,这里的自动化测试主要指的是纯 ...
- Android自动化框架对比
简介 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的"变", 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动化测试的应该是 ...
- Android自动化大讲堂34--终极自动化框架UIAutomator使用详解
<深入理解Android自动化测试> 又双叒叕重印咯!!! 无以为报,只能改版得更漂亮一点来答谢各位的厚爱! 好了,废话少说,咱们开始吧! 终极自动化框架UIAutomator使用详解 注 ...
- Android R常见GC类型与问题案例
前言 Android系统的APP运行需要依赖ART虚拟机(Android Runtime),ART虚拟机的主要作用是给APP的java代码提供运行环境,其中编译.执行.垃圾回收(GC)模块是ART虚拟 ...
- [转] android自动化之MonkeyRunner测试环境配置(一)
Android自动化测试之MonkeyRunner 一.Android自动化测试之环境搭建 1.1 Android-sdk介绍 ¢ SDK(Software development kit)软件开发 ...
- [Android]手动触发OnClick事件
一.实现代码 1.1 将下面代码写在类中,注意不是方法内部! OnClickListener OnClickEvent = new OnClickListener(){ ...
- Android自动化测试之MonkeyRunner录制和回放脚本
Android自动化测试之MonkeyRunner录制和回放脚本(十一) 分类: 自动化测试 Android自动化 2013-02-22 10:57 7346人阅读 评论(2) 收藏 举报 andro ...
最新文章
- Cordova+jQuery Mobile+Spring REST
- setDAta 字符串拼接
- 集合框架源码分析一(接口篇)
- maven开发工具安装
- ITK:轮廓空间对象
- 封神-核心功能 | 钉钉告警+数据网关
- C,C++中使用可变参数
- C#实现ByteBuffer类 .
- 了解Linux操作系统发展阶段
- Linux中的软件源详解,linux软件管理构建本地源实例详解
- Part 1——使用 Go Modules
- *与**在python中的使用
- 一步一步 ITextSharp Anchor Image Chapter Section使用
- 用mysecureshell搭建sftp
- 电工学习笔记————稳压二极管伏安特性
- JDK11下载与安装 win10 64位
- Java JDBC学习
- Cterm里面自动发帖的Python脚本
- 文献笔记(9)(2019ISSCC)
- 2022年3月份报告合集(共353份)