【性能优化】安卓性能优化之CPU优化
【性能优化】安卓性能优化之CPU优化
- CPU优化及常用工具
- 原理与文章参考
- 常用ADB
- 常用原理、监控手段
- 原理
- 监控手段
- 多线程并发解决耗时
- UI相关
- 常见场景
- 排查CPU占用过高
- 常用系统/开源分析工具
- AndroidStudio Profiler
- Systrace
- Btrace
- Perfetto
- TraceView和 Profile
- ANR相关
- ANR原理及常见场景
- ANR/卡顿检测
- 卡顿检测
- CPU 优化案例
CPU优化及常用工具
原理与文章参考
- 编舞者、looper、JankStats方法
常用ADB
含义 | 命令 | 备注 |
---|---|---|
查看CPU状态 | adb shell top -H -d 1 -p pid -O cpu | -O cpu 查看对应在那个核心 ;修改采样间隔为1s |
导出当前进程所有线程状态到tombstoned | adb shell run-as kill -3 | 实际上是以一个异常状态导出了,利用了墓碑机制 |
查看进程的所有线程 | adb shell "ps -T | grep pid" |
查看进程占用cpu情况 | adb shell dumpsys cpuinfo | grep [进程名] |
查看进程内线程占用cpu的情况 | adb shell top -n 1 -d 0.5 | grep proc_ id |
获取设备cpu信息 | adb shell cat /proc/cpuinfo | 或者查看 /sys/devices/system/cpu 目录下的文件夹 |
常用原理、监控手段
原理
- 普通手机默认60帧刷新率,相当于每帧16.6ms
- 利用系统预留接口 对每个帧率/handler消息等 进行统计
监控手段
- 设置looperPrinter
- 字节码插桩检测慢函数(martix dokit)
- 编舞者获取frame帧率
- jetpack JankStats,获取丢帧信息
多线程并发解决耗时
线程池/数量参考
- CPU密集:线程数设置为CPU核心数 + 1
- IO密集:线程数设置为CPU核心数 * 2
UI相关
- 利用
<font style="color:rgb(77, 77, 77);">IdelHandler</font>
对一些常用view进行预绘制 - 通过排查布局,减少过度绘制
常见场景
- 过度绘制
- 频繁IO
- 主线程耗时任务
排查CPU占用过高
- 规范线程命名,定位线程
- 抓取top数据,查看具体哪个线程占用高
- cpu指标含义解释
- 线程各参数详解
常用系统/开源分析工具
AndroidStudio Profiler
- 抓取CPU火焰图,卡顿/ANR 主要监测主线程,是否会出现耗时操作
Systrace
- 官方指令参考
- 官方推荐指令
$ python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
- 要求环境
python2.7 安装
python six 模块,命令 :pip install six
“No module named win32con” 问题,安装相关:pip install pypiwin32
- 拉取到信息后用perfetto 打开即可 但是这个主要是针对系统的 对应用开发帮助不大,分析自己应用可以用btrace
Btrace
- 官方链接
Perfetto
- 官方-快速开始
- 工具界面
- 入门使用
- 线程状态
TraceView和 Profile
- traceview官方参考
- traceview使用
- 导出的日志分析
- 使用DDMS查看
新版路径:Sdk\tools\monitor.bat
- Incl Cpu Time:方法在CPU中执行所有时间(包含其调用的方法所消耗的时间)
- Excl Cpu Time: 方法在CPU中执行的时间(不包含其调用的方法所消耗的时间)
- Incl Real Time:方法运行消耗的所有时间(包含子方法)
- Excl Real Time:方法运行消耗的时间(不包含子方法)
- Calls + Recur Calls/Total :方法调用、递归次数(重要指标,防止死循环)
- Cpu Time/Call :该方法平均占用 CPU 的时间(重要指标,可以看出单个方法占用CPU的平均时间,但是要防止在个别调用处出现长时间占用,然后被平均了)
- Real Time/Call :平均执行时间,包括切换、阻塞的时间(重要指标,可以看出单个方法执行的平均时间值,但是要防止在个别调用处出现长时间调用,然后被平均了)
- TraceView优势
可以精确埋点
Debug.startMethodTracing("sample");...
Debug.stopMethodTracing();
ANR相关
ANR原理及常见场景
- 原理
ANR(Application Not Responding)的监测原理本质上是消息机制,设定一个delay消息,超时未被移除则触发ANR。具体逻辑处理都在system server端,包括发送超时消息,移除超时消息,处理超时消息以及ANR弹框展示等;对于app而言,触发ANR的条件是主线程阻塞。
- 常见场景
- Service ANR:前台20s,后台200s;startForeground超时10s
- Broadcast ANR:前台10s,后台60s
- Input ANR:按键或触摸事件在5s内无响应
- ContentProvider ANR:10s,少见
ANR/卡顿检测
- 通过设置Looper的printer可以检测耗时
- WatchDog机制,子线程发送消息自增,休眠后检查
- 参考
- ANR日志导出
// 安卓21以下有权限可以获取到 anr 日志
private FileObserver fileObserver = null;
void initialize(....){// 实例化FileObserver ,监控路径"/data/anr/",监听文件被写入fileObserver = new FileObserver("/data/anr/", CLOSE_WRITE) {public void onEvent(int event, String path) {try {if (path != null) {String filepath = "/data/anr/" + path;// 写入的文件是否有关键字 “trace”if (filepath.contains("trace")) {// 处理anr异常handleAnr(filepath);}}} catch (Exception e) {XCrash.getLogger().e(Util.TAG, "AnrHandler fileObserver onEvent failed", e);}}};try {// 启动FileObserver 监控fileObserver.startWatching();} catch (Exception e) {fileObserver = null;XCrash.getLogger().e(Util.TAG, "AnrHandler fileObserver startWatching failed", e);}
}private void handleAnr(String filepath) {...// 读取anr文件 /data/anr/trace*.txt。返回文件内容String trace = getTrace(filepath, anrTime.getTime());//删除其他的anr异常日志文件if (!FileManager.getInstance().maintainAnr()) {return;}//获取 tombstone 的文件头String emergency = null;try {emergency = getEmergency(anrTime, trace);} catch (Exception e) {XCrash.getLogger().e(Util.TAG, "AnrHandler getEmergency failed", e);}// 创建anr异常日志保存文件File logFile = null;try {String logPath = String.format(Locale.US, "%s/%s_%020d_%s__%s%s", logDir, Util.logPrefix, anrTime.getTime() * 1000, appVersion, processName, Util.anrLogSuffix);logFile = FileManager.getInstance().createLogFile(logPath);} catch (Exception e) {XCrash.getLogger().e(Util.TAG, "AnrHandler createLogFile failed", e);}if (logFile != null){// 根据配置将日志文件头,traces,logcat日志保存在文件中。}
}// 高版本通过AMS获取日志
public class ANRMoniter implements Runnable {private final String TAG = "ANRMoniter";private HandlerThread handlerThread = new HandlerThread("WatchMainHandler");private ILog logImpl;private Application app;private Handler watchHandler;private Handler mainHandler;private ScheduleCheckTask scheduleCheckTask;private int CHECK_INTERVAL = 5_000;public ANRMoniter(Application app, ILog logImpl) {this.app = app;this.logImpl = logImpl;init();}private void init() {handlerThread.start();Looper looper = handlerThread.getLooper();watchHandler = new Handler(looper);mainHandler = new Handler(Looper.getMainLooper());scheduleCheckTask = new ScheduleCheckTask();}public void start() {watchHandler.post(this);}@Overridepublic void run() {mainHandler.post(scheduleCheckTask);long endTime = System.currentTimeMillis() + CHECK_INTERVAL;long sleepTime = endTime - System.currentTimeMillis();while (sleepTime > 0) {try {Thread.sleep(sleepTime);} catch (InterruptedException e) {e.printStackTrace();}sleepTime = endTime - System.currentTimeMillis();}if (scheduleCheckTask.isBlocking()) {logImpl.Loge(TAG,"main handler blocking");checkRealANR(mainHandler.getLooper().getThread().getStackTrace());}scheduleCheckTask.reset();watchHandler.post(this);}private void checkRealANR(StackTraceElement[] stack) {ThreadPool.getInstance().execute(new Runnable() {@Overridepublic void run() {ActivityManager.ProcessErrorStateInfo processErrorStateInfo = getANRInfo(app);if (processErrorStateInfo != null) {logImpl.Loge(TAG,"ANR action");//real ANRRuntimeException e = new RuntimeException(processErrorStateInfo.shortMsg);e.setStackTrace(stack);e.printStackTrace();logImpl.Loge(TAG,e.getMessage());}}});}private ActivityManager.ProcessErrorStateInfo getANRInfo(Application app) {try {final long sleepTime = 500L;final long loop = 20;long times = 0;do {ActivityManager activityManager = (ActivityManager) app.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.ProcessErrorStateInfo> processesInErrorState = activityManager.getProcessesInErrorState();if (processesInErrorState != null) {for (ActivityManager.ProcessErrorStateInfo proc : processesInErrorState) {if (proc.condition == ActivityManager.ProcessErrorStateInfo.NOT_RESPONDING) {return proc;}}}Thread.sleep(sleepTime);} while (times++ < loop);} catch (Exception e) {e.printStackTrace();}return null;}private class ScheduleCheckTask implements Runnable {private boolean isBlocking;ScheduleCheckTask() {isBlocking = true;}@Overridepublic void run() {isBlocking = false;}public boolean isBlocking() {return isBlocking;}public void reset() {isBlocking = true;}}
}
- 自定义线程WatchDog参考
package com.aispeech.util;import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;import com.aispeech.common.ThreadNameUtil;
import com.aispeech.lite.BaseKernel;import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;/**
* Description: 检测Kernel层 是否阻塞的工具类
* Author: junlong.huang
* CreateTime: 2023/8/21
*/
public class KernelWatchDog {private static final String TAG = "KernelWatchDog";HandlerThread innerThread;Handler innerHandler;long timeoutMillis = 2000;static final int MSG_INCREMENT = 0x01;private static volatile KernelWatchDog mInstance;private ConcurrentHashMap<BaseKernel, AtomicInteger> monitorMap;private Vector<BaseKernel> removeList;public static KernelWatchDog getInstance() {if (mInstance == null) {synchronized (KernelWatchDog.class) {if (mInstance == null) {mInstance = new KernelWatchDog();}}}return mInstance;}private KernelWatchDog() {init();}private void init() {monitorMap = new ConcurrentHashMap<>();removeList = new Vector<>();innerThread = new HandlerThread(ThreadNameUtil.getSimpleThreadName("watchdog-k"));innerThread.start();innerHandler = new InnerHandler(innerThread.getLooper());innerHandler.sendMessage(innerHandler.obtainMessage(MSG_INCREMENT));}public void addChecker(BaseKernel baseKernel) {Log.i(TAG, "addChecker:" + baseKernel.getInnerThreadName());monitorMap.put(baseKernel, new AtomicInteger(baseKernel.getTick()));}public void removeChecker(BaseKernel baseKernel) {if (monitorMap.containsKey(baseKernel)) {Log.i(TAG, "removeChecker: " + baseKernel.getInnerThreadName());monitorMap.remove(baseKernel);}}class InnerHandler extends Handler {public InnerHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (innerHandler == null) return;switch (msg.what) {case MSG_INCREMENT:if (monitorMap == null || monitorMap.size() == 0) {innerHandler.sendMessageDelayed(innerHandler.obtainMessage(MSG_INCREMENT), timeoutMillis);break;}for (BaseKernel baseKernel : monitorMap.keySet()) {if (baseKernel.getInnerThread() != null &&!baseKernel.getInnerThread().isAlive()) {Log.i(TAG, "Detected thread quit,Add to list to be removed");removeList.add(baseKernel);continue;}AtomicInteger lastTick = monitorMap.get(baseKernel);if (lastTick == null) lastTick = new AtomicInteger(baseKernel.getTick());if (lastTick.get() != baseKernel.getTick()) {Log.w(TAG, "Detected target thread may blocked,export thread stack");Thread innerThread = baseKernel.getInnerThread();if (innerThread != null) {Log.w(TAG, getThreadStack(innerThread.getStackTrace()));}}lastTick.incrementAndGet();baseKernel.tick();}for (BaseKernel baseKernel : removeList) {monitorMap.remove(baseKernel);}removeList.clear();innerHandler.sendMessageDelayed(innerHandler.obtainMessage(MSG_INCREMENT), timeoutMillis);break;}}}public void release() {innerHandler.removeMessages(MSG_INCREMENT);innerThread.quit();monitorMap.clear();removeList.clear();}private String getThreadStack(StackTraceElement[] elements) {StringBuilder stackTraceString = new StringBuilder();for (StackTraceElement element : elements) {stackTraceString.append(element.toString()).append("\n");}return stackTraceString.toString();}}
卡顿检测
- matrix 字节码插桩,慢函数检测
- 采样率法,通过一个外置的工作线程Handler,按一段时间采样,如果大部分都是某个方法,则这个方法可能存在风险点
/**
* 按照一定频率采样
* 目标是找到卡顿时刻前后的堆栈,做大致定位,无法做到精准定位
* 原则上采样越高,定位越精准
* 还有,目前只采样了java层的堆栈,c层的需要另外实现,这个后续补充
*/
public class CallstackSampler {private static final String TAG = "CallstackSampler";private final Thread thread;private final Handler mHandler;private final long sThreshold = 1000;private final Runnable mRunnable = new Runnable() {@Overridepublic void run() {doSample();mHandler.postDelayed(this, sThreshold);}};public CallstackSampler(Thread thread) {this.thread = thread;HandlerThread mWorkThread = new HandlerThread("StackSampler" + thread.getName());mWorkThread.start();mHandler = new Handler(mWorkThread.getLooper());}private void doSample() {// 采集指定线程当前堆栈信息StackTraceElement[] stackTrace = thread.getStackTrace();String stackTraceString = Arrays.toString(stackTrace);if (!stackTraceString.contains("nativePollOnce")) {Log.d(TAG, thread.getName() + " Callstack sample taken at time: " + System.currentTimeMillis() + " " + stackTraceString);}}public void startSampling() {mHandler.postDelayed(mRunnable, sThreshold);}public void stopSampling() {mHandler.removeCallbacks(mRunnable);}
}
- 主线程耗时检测:设置一个printer
CPU 优化案例
- 线程池复用,减少CPU调度开销
- 资源拷贝优化,减少读取IO时间
- 线程命名,方便定位问题
- 非必要内容,延迟初始化
- 初始化任务优先级分配,削峰填谷
相关文章:
【性能优化】安卓性能优化之CPU优化
【性能优化】安卓性能优化之CPU优化 CPU优化及常用工具原理与文章参考常用ADB常用原理、监控手段原理监控手段多线程并发解决耗时UI相关 常见场景排查CPU占用过高常用系统/开源分析工具AndroidStudio ProfilerSystraceBtracePerfettoTraceView和 Profile ANR相关ANR原理及常见场…...
springboot二手图书交易系统-计算机设计毕业源码88413
目 录 摘要 1 绪论 1.1研究背景 1.2研究意义 1.3论文结构与章节安排 2 二手图书交易系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 二手…...
解决ElasticSearch启动成功却无法在浏览器访问问题
目录 前言: 问题复现 : 解决问题: 1、修改sysctl.conf文件 2、在sysctl.conf文件增加这段东西 3、 然后保存退出,输入以下命令使其生效 结语: 前言: 这篇文章是小白我今天突然启动es,发现e…...
稀土有色包芯线良好的导电性
稀土有色包芯线是一种结合了稀土元素和有色金属(如铜、铝、镁等)的特殊线材。以下是对稀土有色包芯线的详细介绍: 一、组成与结构 芯线:由稀土元素和有色金属组成的合金制成。稀土元素(如镧、铈、镁等)的添加量在一定范围内,以确保合金性能的…...
SIP 业务举例之 Call Forwarding Unconditional(无条件呼转)
目录 1. Call Forwarding Unconditional 简介 2. RFC5359 的 Call Forwarding Unconditional 信令流程 PS:Dialog 建立条件 Dialog 会话完全建立 3. Call Forwarding Unconditional 过程总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识…...
基于stm32的esp8266的WIFI控制风扇实验
实验案例WIFI控制风扇 项目需求 电脑通过esp8266模块远程遥控风扇。 项目框图 风扇模块封装 #include "sys.h" #include "fan.h"void fan_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟…...
java中的ScheduledExecutorService介绍和使用案例
ScheduledExecutorService 是 Java 并发包 java.util.concurrent 中的一个接口,它提供了一种机制,允许我们安排一个任务在给定的延迟后运行,或者定期地执行。 主要特点 单次调度:可以安排任务在一定的延迟后执行一次。周期性调度…...
4天涨粉14万!这个AI小众赛道粉丝涨疯了吧?保姆级教程免费教会你!
测一下你的搞钱灵敏度有多高,看下面两张截图,有没有发现什么异常值? 发现了吧? 第一张是10月17号截的,第二张是21号,4天时间粉丝从2.8万飙到16.6万,涨粉14万! 这个号我几天之前就发…...
RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测
随着人工智能和大数据时代的到来,传统嵌入式处理器中的CPU和GPU逐渐无法满足日益增长的深度学习需求。为了应对这一挑战,在一些高端处理器中,NPU(神经网络处理单元)也被集成到了处理器里。NPU的出现不仅减轻了CPU和GPU…...
itext 转换word文档转pdf
itext 转换word文档转pdf <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version><scope>compile</scope></dependency> <dependency><groupId>org.a…...
WSL-默认root登录
WSL-默认root登录 使用管理员,打开powershell PS C:\WINDOWS\system32> wsl -l 适用于 Linux 的 Windows 子系统分发版: Ubuntu-22.04 (默认) PS C:\WINDOWS\system32> ubuntu2204.exe config --default-user root PS C:\WINDOWS\system32>修改之后&…...
ASIO网络调试助手之四:浅谈QTcpServer性能
网络上有些质疑Qt Network模块性能的声音,本文将从理论和压测两个方面对比ASIO tcp server和QTcpServer在Windows上的性能,最后给出结论。 一.理论 QTcpServer在Windows上的实现是基于select模型,源码位置:5.12.6\Src\qtbase\src\network\socket\qnativesocketengine_win…...
快手 日常实习一面面经
官网投递,三天约面 线上面试 (60mins): 1. 自我介绍 2. 问实习 介绍自己做的业务上一段实习的公司框架和开源的 RPC 框架的区别负责的业务与核心业务的依赖关系场景题 -> 设计高并发下的负载均衡 3. 项目拷打 手写 双检锁…...
Cursor零基础小白教程系列 - 创建你的第一个Cursor 项目
最适合小白零基础的Cursor教程 网站lookai.top相同作者,最新文章会在网站更新,欢迎收藏书签 创建你的第一个Cursor 项目 实操视频 概述 开始使用Cursor进行编程的第一步是创建或导入一个项目。本指南将帮助您了解如何在Cursor中创建新项目、导入现有项…...
通用序列化和反序列化实现思路
本文简单的记录一下采用模板来实现序列化与反序列的思路, 同时采用C20标准的concept和requires来简化模板函数的选择。 首先了解一下自定义类支持序列化的两种方式: 一、序列化自定义类型(侵入式) struct Test {std::string na…...
书生营第四期L0G2000 Python 基础知识
闯关任务 Leetcode 383(笔记中提交代码与leetcode提交通过截图) class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:note [0]*26maga [0]*26for s in ransomNote:note[ord(s)-ord(a)] 1for s in magazine:maga[ord(s)-ord(a)] 1for i in…...
Day12-数据库服务冗余架构
Day-12-数据库服务高可用集群 1、数据库MGR组复制实践2、数据库高可用MHA应用介绍3、数据库高可用MHA环境准备4、数据库高可用MHA原理机制5、数据库高可用MHA功能配置 1、数据库MGR组复制实践 (强一致性主从同步) 2、数据库高可用MHA应用介绍 3、数据库高可用MHA环境…...
js监听div尺寸,ResizeObserver
示例: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><style>.observedDiv {width: 40vw;height: 50vh;background-color: lightblue;}</style></head><body><div id"…...
STM32与openmv的串口通信
OpenMV与STM32的通信是嵌入式系统和物联网领域中的一项重要技术。OpenMV是一种开源的微型机器视觉模块,基于ARM Cortex-M7微控制器,支持多种图像处理功能,如颜色识别、形状检测等。而STM32是STMicroelectronics公司推出的基于ARM Cortex内核的…...
C#基于SkiaSharp实现印章管理(11)
PdfSharpCore支持类似GDI方式在PDF页面绘制文字、矩形、圆形、多边形、路径、图片等内容,本文学习基于PdfSharpCore将结构化印章数据导出为PDF文件的基本用法,评估其使用可行性。 PdfSharpCore创建PDF文件很方便,调用PdfDocument类创建实…...
Spring使用@Async出现循环依赖原因以及解决方案
场景复现 1、首先项目需要打开spring的异步开关,在application主类上加EnableAsync 2、创建一个包含了Async方法的异步类MessageService: Service public class MessageService {Resource private TaskService taskService; Async public void…...
如何训练 RAG 模型
训练 RAG(Retrieval-Augmented Generation)模型涉及多个步骤,包括准备数据、构建知识库、配置检索器和生成模型,以及进行训练。以下是一个详细的步骤指南,帮助你训练 RAG 模型。 1. 安装必要的库 确保你已经安装了必…...
鸿蒙网络编程系列34-Wifi热点扫描及连接示例
1. Wifi热点简介 Wifi热点是移动设备接入网络的重要形式,特别是在不具备固定网络接入点的情况下,可以通过Wifi热点灵活方便的接入网络,因此在日常生活中具有广泛的应用。鸿蒙系统也提供了方便的Wifi管理API,支持热点扫描…...
LVS三种模式工作原理
常用负载均衡设备 实现负载均衡的技术的方式有哪些:硬件层面有F5负载均衡器,网络层层面有LVS(Linux Virtual Server),应用层层面就是nginx、Haproxy等。 lvs工作在网络层,nginx工作在应用层。 LVS有三种工作模式 lvs是由章文崇…...
【二轮征稿启动】第三届环境工程与可持续能源国际会议持续收录优质稿件
第三届环境工程与与可持续能源国际会议(EESE 2024)由中南林业科技大学主办,湖南农业大学协办,将于2024年12月20日-22日在湖南长沙召开。 大会邀请到国家杰出青年科学基金获得者、华中科技大学能源与动力工程学院冯光教授…...
网络安全——防火墙技术
目录 前言基本概念常见防火墙技术防火墙的主要功能防火墙的不足之处相关题目1.组织外部未授权用户访问内部网络2.DMZ区3.包过滤防火墙和代理服务防火墙 前言 这是在软件设计师备考时编写的资料文章,相关内容偏向软件设计师 基本概念 防火墙技术是网络安全领域中的…...
Missing classes detected while running R8报错解决方案
Android 打包release版本时报错如下: > Task :printlib:minifyReleaseWithR8 FAILED AGPBI: {"kind":"error","text":"Missing classes detected while running R8. Please add the missing classes or apply additional ke…...
智能指针
目录 1. 为什么需要智能指针? 2. 内存泄漏 2.1 什么是内存泄漏,内存泄漏的危害 2.2 内存泄漏分类(了解) 堆内存泄漏(Heap leak) 系统资源泄漏 2.3 如何检测内存泄漏(了解) 2.4如何避免内存泄漏 3.…...
通过DevTools逃离Chrome沙盒(CVE-2024-6778和CVE-2024-5836)
介绍 这篇博文详细介绍了如何发现CVE-2024-6778和CVE-2024-5836的,这是Chromium web浏览器中的漏洞,允许从浏览器扩展(带有一点点用户交互)中进行沙盒逃逸。 简而言之,这些漏洞允许恶意的Chrome扩展在你的电脑上运行…...
手持无人机飞手执照,会组装调试入伍当兵有多香!
手持无人机飞手执照,并具备组装调试技能,在入伍当兵时确实会具有显著的优势和吸引力。以下是对这一情况的详细分析: 一、无人机飞手执照的优势 1. 法规遵从与安全保障: 根据《民用无人驾驶航空器系统驾驶员管理暂行规定》等相关…...
苏州做网站公/seo系统推广
Action参数绑定功能提供了URL变量和操作方法的参数绑定支持,这一功能可以使得你的操作方法定义和参数获取更加清晰,也便于跨模块调用操作方法了。这一新特性对以往的操作方法使用没有任何影响,你也可以用新的方式来改造以往的操作方法定义。 …...
如何用织梦做网站详细教程/谷歌推广技巧
我们给出了一个(轴对齐的)矩形列表 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标,(x2,y2)是该矩形右上角的坐标。 …...
一个人做公司管理网站/公关公司一般收费标准
Emacs之魂(一):开篇Emacs之魂(二):一分钟学会人界用法Emacs之魂(三):列表,引用和求值策略Emacs之魂(四):标识符࿰…...
写作兼职网站/门户网站有哪些
F12后,切换到手机模式,方向没有鼠标,这对于调试前端页面来说无疑是一大难题,看不见只能盲点, 以为是浏览器问题,清理缓存,升级浏览器,清除插件等都不好使。 后来查到资料说是显卡问题…...
电子商务网站建设管理答案/深圳网络营销推广外包
--------------------------------------------- 未能创建 Mutex。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Inval…...
大连城乡建设委员会网站/网页设计素材网站
构建代码Jeff Mott , Dan Prince和Sebastian Seitz对本文进行了同行评审。 感谢所有SitePoint的同行评审员使SitePoint内容达到最佳状态! 以功能性方式考虑JavaScript的优势之一是能够使用小型,易于理解的单个功能来构建复杂的功能。 但是有…...