干货分享:sf中Layer泄露问题分析修复实战方法--直播总结

大模型与AI编程大全:旗舰档案、梯队分级与选型避坑指南 2025 年 5 月,雷军在小米 15 周年发布会上讲造芯十二年,说过一句:"后来者一开始肯定不完美,总会被嘲笑、被怀疑,但后来者总有机会。"第二天他补了一条微博:“这个世界不会永远是强者恒强,后来者总有机会!那句话原本说的是芯片。但放在大模型的牌桌上,过去两年发生的一切几乎是它的逐帧复刻:DeepSeek 从"中国二线"到 R1 时刻只用了几个月;Qwen 用 30 亿次下载把开源话语权抢到手里;GLM 一路开源追到与最强闭源只差 6 分; 阅读详情

背景

图层泄露的复现步骤和前置知识,请看这里:
https://mp.weixin.qq.com/s/yiQH4iPJKTH153Pn40Xu0A

昨天晚上也对壁纸的泄露问题进行详细的直播讲解,今天把这部分进行相关的直播过程总结,方便各位学员们进行后续查看阅读。
直播讲解壁纸ImageWallpaper图层泄露问题,主要就以下几个点来进行:

1、遇到这种layer泄漏的问题,请问你是如何排查的,说出你的流程

2、为啥会有ImageWallpaper的layer泄漏呢?请剖析出原因

3、请问为啥就ImageWallpaper有泄漏,其他正常的窗口没泄漏呢?

4、给出相关的优化修复方案,并进行验证

在这里插入图片描述

排查壁纸图层OffScreen泄露问题流程

具体流程如下:

在这里插入图片描述1、通过dumpsys SurfaceFlinger 查看OffScreen数据,看是否存在某些layer只增不减情况,如果有这个Layer就很可能泄漏,需要根据Layer名字推测出SurfaceControl名字,寻找到相关SurfaceControl创建代码位置

2、寻找到了SurfaceControl,然后要分析业务,注意排查看看是否在窗口业务结束后进行了正常的release

3、如果发现没有release,则可以考虑加上进行复现看看是否还有

4、上面3步对于一个Layer只有一个SurfaceControl持有都一般可以解决,但是有可能一个Layer有多个SC的情况,这种就要多个地方加入日志排查。(相关案例后续考虑给vip学员们再分享)

在这里插入图片描述
定位ImageWallpaper的泄漏原因:
创建ImageWallpaper对于的SurfaceControl

   void updateSurface(boolean forceRelayout, boolean forceReport, boolean redrawNeeded) {
       //省略
       //可以看到这里调用wms的relayout会对mSurfaceControl进行赋值
                        relayoutResult = mSession.relayout(mWindow, mLayout, mWidth, mHeight,
                                View.VISIBLE, 0, mWinFrames, mMergedConfiguration,
                                mSurfaceControl, mInsetsState, mTempControls, mSyncSeqIdBundle);
                    }

正常要释放的方法detach没有看到mSurfaceControl.release()


        void detach() {
           //省略
           //在detach代码没有对mSurfaceControl.release()进行调用
                mSurfaceHolder.mSurface.release();
                if (mBlastBufferQueue != null) {
                    mBlastBufferQueue.destroy();
                    mBlastBufferQueue = null;
                }
                if (mBbqSurfaceControl != null) {
                     new SurfaceControl.Transaction().remove(mBbqSurfaceControl).apply();
                    mBbqSurfaceControl = null;
                }
                mCreated = false;
            }
        }

所以修改方案就是在detach方法中加入mSurfaceControl.release()既可以。

对比查看为啥就ImageWallpaper泄漏

这里主要对比2个场景

1、同样aosp13版本Wallpaper壁纸窗口有泄漏,为啥普通窗口没有泄漏?

这里就只需要检测普通的窗口创建相关的SurfaceControl是在ViewRootImpl中进行的,可以看看ViewRootImpl中对SurfaceControl看看是否有进行release
relayout中会对mSurfaceControl进行赋值

frameworks/base/core/java/android/view/ViewRootImpl.java

 private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
            boolean insetsPending) throws RemoteException {
    //省略
    //这里和Wallpaper一样都是relayout进行的操作,赋值mSurfaceControl
            relayoutResult = mWindowSession.relayout(mWindow, params,
                    requestedWidth, requestedHeight, viewVisibility,
                    insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0,
                    mTmpFrames, mPendingMergedConfiguration, mSurfaceControl, mTempInsets,
                    mTempControls, mRelayoutBundle);
  
            }

但是在壁纸WallpaperService中是没有看到有release调用,ViewRootImpl中是有对这里的mSurfaceControl进行release。

frameworks/base/core/java/android/view/ViewRootImpl.java



    private void destroySurface() {
        if (mBoundsLayer != null) {
            mBoundsLayer.release();
            mBoundsLayer = null;
        }
        mSurface.release();
        mSurfaceControl.release();//明显ViewRootImpl在这里有对SurfaceControl进行了release

        if (mBlastBufferQueue != null) {
            mBlastBufferQueue.destroy();
            mBlastBufferQueue = null;
        }

        if (mAttachInfo.mThreadedRenderer != null) {
            mAttachInfo.mThreadedRenderer.setSurfaceControl(null);
            mAttachInfo.mThreadedRenderer.setBlastBufferQueue(null);
        }
    }

所以这里源码就解答为啥正常窗口没有泄漏,只有WallpaperService有,就因为正常窗口ViewRootImpl是有调用这release。

对比aosp15壁纸为啥又没有泄露呢?

同样的壁纸切换操作在aosp15上操作若干次都没有看到有任何ImageWallpaper图层放入到OffScreen中

test@test:~$ adb shell dumpsys SurfaceFlinger | grep Offscreen -A 20 | grep ImageWallpaper

那么为啥aosp15没有呢?
需要回答这个问题,就需要查看官方对于WallpaperService这块的修改。
在这里插入图片描述在aosp15的代码中可以看到实际上是有调用SurfaceControl的release方法。

官方修复相关git log

上面问题分析清楚后,那么为啥新版本没有
aosp官方修复方法:

test@test:~/aosp15/frameworks/base$ git show 9c1d6b45920a4
commit 9c1d6b45920a402d35f18057151e78cad1ccf0b4
Author: Robin Lee <rgl@google.com>
Date:   Thu Feb 9 14:41:37 2023 +0100

    Release WallpaperService SurfaceControl directly
    
    The SurfaceControl is created with the engine and filled in later after
    the first time attachging. It can be released as soon as the engine is detached, since wallpaper engines are never reused after detaching.
    
    Test: atest WallpaperManagerTest # after which, check dumpsys surfaceflinger for leftover offscreen wallpaper layers
    Test: adb shell su root kill -10 `adb shell pidof system_server` # and then take a heap dump to ensure the IWindow is also gone.
    Bug: 261358202
    Change-Id: I86f0a3ee9b8272d61bbc8f9c5f80ee3f0ddac96f

diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 12cd5236017c..f53abce1d1ea 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -2198,6 +2198,11 @@ public abstract class WallpaperService extends Service {
                 }
                 mCreated = false;
             }
+
+            if (mSurfaceControl != null) {
+                mSurfaceControl.release();
+                mSurfaceControl = null;
+            }
         }
 
         private final DisplayListener mDisplayListener = new DisplayListener() {

看可以从官方链接看出已经针对这个ImageWallpaper图层泄露问题进行了修复。

原文参考:
https://mp.weixin.qq.com/s/PgAmwjeGYLaQbfuVWUXeWg

AI编程IDE 以及。它们各有侧重,适合不同的开发习惯和场景。 阅读详情

相关推荐

M2DGR数据集在一些SLAM框架上的配置与运行:ORB-SLAM系列、VINS-Mono、LOAM系列、FAST-LIO系列、hdl_graph_slam

为了说明以上这些SLAM框架的测试与数据集适配,以M2DGR数据集为例进行各自的配置与运行,方便我以后适配自己的数据集,运行的SLAM框架包括:ORB-SLAM2、ORB-SLAM3、VINS-Mono、A-LOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、FAST-LIO2、FAST-LIVO、Faster-LIO、hdl_graph_slam。实验基于Ubuntu20.04,其中ORB、VINS-Mono、和LOAM系列的安装参考我以前的博客,有详细的安装方法,其他的框架在后面会简单介绍一下

zardforever123的博客 1万+

【AI编程】AI⼯具链全景

✌全网粉丝24W+,优快云博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌。

No8g攻城狮的博客 226

PX4代码解析(1)

前言 做pixhawk飞控有一段时间了,但在学习过程中遇到许多困难,目前网上找不到比较完整的PX4学习笔记,我打算结合自己理解,写写自己对PX4源码的理解,不一定对,只是希望与各位大佬交流交流,同时梳理一下无人机知识。 目前打算分享以下几个内容:代码架构;通信协议;姿态解算算法,控制算法。先这样,后面想到再加。本章先来聊聊px4代码结构 一、代码整体结构 既然要聊px4代码结构,那就先把px4代码结构图放出来,因为px4源码仍然在不断更新迭代,因此老版本与新版本目录结构可能有些不同,我的代码解析参考版本为V

qq_36903625的博客 1万+

主流AI编程智能体算力架构实测:8大平台模型费率分析与本地配置避坑指南

本文深度评测华为云、智谱、商汤等8大AI编程平台,剖析其算力配额、模型费率与获取路径。核心结论:构建多平台算力储备池可实现低成本高吞吐开发。推荐策略包括:利用免费模型(如GLM-5.3-Flash)、完成三端协同领9000积分、夜间低峰调用3亿Token、通过学生认证获额外奖励,并善用零费率通道与每日签到积分。实测显示,合理配置可使算力成本降低70%以上,显著提升开发效率。

艺杯羹的博客 204

VL53L0X测距不准?手把手教你做RefSPAD校准与环境补偿(附Arduino/STM32代码)

本文详细解析了VL53L0X激光测距传感器精度不足的原因,并提供了RefSPAD校准与环境补偿的完整解决方案。通过Arduino和STM32代码示例,手把手教你实现毫米级测距稳定性,适用于机器人避障、工业检测等场景。

weixin_28744423的博客 258

全志平台Sensor驱动移植实战:从点亮到调优的完整指南

本文详细介绍了在全志平台上进行Sensor驱动移植的全过程,从硬件引脚配置到软件参数调优,涵盖点亮、出图和调优三大阶段。重点解析了OV02B10传感器的I2C通信建立、上电时序调试和初始化参数配置等关键技术点,并提供了实用的调试技巧与问题排查指南,帮助开发者高效完成全志平台Sensor驱动移植工作。

weixin_28727975的博客 218

AI编程技术拆解(11月8日)|昨天下午聊到第十六轮,四十张待确认单混进对账单,多算18640块

昨天下午三点,我在改一个对账单导出。前面已经聊了十五轮,口径攒了六条:金额四舍五入到分、空值填零、跨月拆两行、客户名去空格、日期只留到天、只汇已确认的单。第十六轮,我让它加一栏"按客户汇总"。它回了一句:对话较长,较早的内容已压缩。我没当回事,接着改,导出后翻了头一页,看着都对,就发给了财务。今天上午九点,财务说总额比系统里多了 18640 元。三个人查到中午,翻出四十张待确认的单,全被算进了汇总。那六条口径是我一条一条说过的,怎么就少了一条?

李文慧 中国开源充电桩平台第一人;李文慧 国内知名开源工作者 全栈工程师 华为云最具价值专家 26

国产系统(统信 UOS )漏洞修复方式

2.1 服务器版(单漏洞更新):服务器标准版:yum upgrade-minimal --cve “CVE编号”服务器 D 版:sudo apt update&&sudo apt install “受影响的软件包”1 统信 UOS 漏洞修复方式在线升级修复桌面专业版:通过以下步骤打开在线升级:控制中心–>更新–>更新设置–>打开系统更新、安全更新。安装过程中,请勾选“我已阅读并知晓”,然后点击“开始升级”。2 点击“检查更新”–“全部下载”,如果不想进行系统更新,可以选择只下载“安全更新”。

Reyn_观极 5023

AI编程技术拆解(11月9日)|同一句话问五个工具,四份一样,偏挑了不一样那份,三个用例白写

昨天下午三点,测试前一天。手机号校验这块还空着,他懒得一个个工具试,就把同一句话在五个工具里各问了一遍:写个函数,校验手机号。一句话,五个答案。四份一模一样:11 位数字,开头是 1,空格当没看见。第五份多认了一种,带 +86 的 13 位也放过。他看那份多认了一种,觉得更周全,就用了它。第二天跑那 8 条用例,3 条红,因为需求写的是只收 11 位本地号。改回、重跑、重写用例花掉 91 分钟,他盯着那五行字看了半天,想不通:同一句话,五个工具,怎么会给出不一样的答案?

李文慧 中国开源充电桩平台第一人;李文慧 国内知名开源工作者 全栈工程师 华为云最具价值专家 31

自定义Usecase/Pipeline

Summary of Custom Usecase and Pipeline Configuration in SA8650 QCX Framework This article elaborates on the complete process of customizing a new Usecase and Pipeline based on the SA8650 QCX framework to meet OEM and Tier1 customization requirements, with

qq_39257814的博客 930

经典的YOLOv3和YOLOV5算法详解及代码复现

yolov3和yolov5算法详解及代码复现

hasakie的博客 771

AI编程技术拆解(11月12日)|一天按一千五百次补全,发出去一千二百万字,是项目总量的十倍

上周四上午十点,做仓储软件的老周被安全那边叫去填一张表。表上只有一行要回答:你们有没有把代码发给公司以外的 AI 服务。他在"没有"那一栏打了勾,理由写得很干脆:五个人的工具都装在自己电脑上,代码都在硬盘里。下午有人追问了一句:那你们一天敲那么多下补全,发出去的是什么。老周回工位拿计算器按了一遍:一次补全,光标前面四千字、后面四千字,八千字;一天一千五百次,一千二百万字。他们那个项目三万行,一行四十个字,总共一百二十万字。一天发出去的字,是这个项目的十倍。

李文慧 中国开源充电桩平台第一人;李文慧 国内知名开源工作者 全栈工程师 华为云最具价值专家 14

【制作100个unity实战之2】实现一款简单的FPS游戏

你将学到: fps武器脚本 基础瞄准功能 僵尸敌人AI 巡逻范围 攻击间 搜寻半径 追击 枪声吸引周围的僵尸 击中僵直效果

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3553

团队AI编程落地第16篇|AI 时代规则治理:按变化半衰期分三层 + 给每条规则写过期条件(含模板)

模型一更新规则就失效,病根不在写得慢,在于把 Why 和 How 写在了同一层。本文给三层分法、快变层三样载体、归因路由表、过期条件模板与四个坑,附 CAIN 2024 实测与 QECon 2026 一线案例。

Derekjiang的笔记簿 201

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

以人为主导的Ai编程Harness

本文介绍开源项目 human-led-gate,通过在 Claude Code 中实现 PreToolUse 拦截机制,强制执行人类审批流程,防止 AI 在未授权情况下修改代码。核心原理是基于 .humanled/approvals.json 严格限制编辑范围,即使开启 bypass 模式也拒绝越权操作。项目配套九阶段人主导开发流程,确保每一步均有明确人工确认,提供可复现的、技术强制的“说不”能力,真正实现人对 AI 编码的控制权。

探索者李小白的博客 194

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AI编程与手搓编程的本能差异

人败在累、烦、漏,AI 胜在不累、不烦、不漏,但唯独无法判断与担责。AI 可稳定执行重复任务、穷举检查、守流程,却依赖清晰指令,易因模糊需求出错;人虽会疲劳、回避,却具备直觉、权衡与责任担当。真正的高效不是替代,而是分工:让 AI 承担“做”的部分,人专注“判”的核心——决定该不该做、能否担责。

麦哲思科技 165

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

AI编程助手Skills机制解析:从原理到前端开发实战

装上 skills 的 AI 编程助手为什么像换了个人?讲清技能包设计、文件结构与加载机制,Claude Code 配置实操与 React 组件库实战,附错误速查表和避坑经验。

w807139809的博客 77

2026最新6款AI编程软件基础版免费深度实测

花了两个周末,我把主流的几款 AI 编程工具挨个装了一遍,同一个项目用不同的工具写,记录下了各自的真实表现。我的测试项目是一个 Flask REST API 用户查询服务,需要对接 PostgreSQL、处理分页和异常。字节跳动出品的 TRAE 让我最意外——基础版免费,内置 Doubao 和 DeepSeek 等多款主流大模型,据 优快云 评测,中文需求理解准确率行业领先这个标签不是白给的。

2601_96719634的博客 162

团队AI编程落地第15篇|AI 编程能力边界实战:从 LoLBench / LoopsBench 到四个工程动作(含文件树、规则与回归门禁配置)

最好的 coding agent 在 240 万行真实系统里只解决 14%,在依赖 DAG 长周期任务里只解决 25%。本文拆解两个基准的失败分析,给出四个可立刻执行的工程动作:给文件树、给 API 规格、设回归门禁、任务拆成 DAG。

Derekjiang的笔记簿 144

【愚公系列】《微信小程序项目实战(AI编程+视频图解)》020-测试

💎【行业认证·权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:优快云博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者🏆【荣誉殿堂】 🎖 连续三年蝉联"华为云十佳博主"(2022-2024) 🎖 双冠加冕优快云"年度博客之星TOP2"(2022&2023) 🎖 十余个技术社区年度杰出贡献奖得主📚【知识宝库】 覆盖全栈技术矩阵: ◾

愚公智库 234

AI编程工具怎么读取设计稿?Cursor、Codex接入Pixso MCP实战

很多人第一次用 Cursor 或 Codex 做 UI 页面时,。颜色可能接近,但间距不对;页面结构看着差不多,按钮和卡片却没有复用;设计稿里已经有组件和变量,代码里又重新写了一套。等到设计师提出修改,开发者还要重新解释页面结构。不是 AI 不会写前端,是它没有拿到设计稿里的真实上下文。即使你给出截图,AI只能根据像素猜布局;只描述一句“做一个简洁的后台页面”,AI也不知道项目里已经有哪些组件。

ndsc_d的博客 279

Android Visualizer 实战:把声音画出来

是系统提供的音频效果(AudioEffect)之一。它挂在音频链路上,,把数据回吐给你——画波形、画频谱、做响度表。

Android的专栏 311

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 341

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 207

RK-RK3572-Android16- 编译打包优化-OTA整包-差分包打包

这里主要记录一下 RK3572 在Android16 上面进行OTA升级的整包和差分包制作经验的一个分享,整理知识点,方便后续自己和其它同事开发提高工作效率、直接使用。不管哪一个平台,MTK 也好、RK也好 基本上都是不同Android版本各个子系统之间还是有一点点区别的,所以有必要记录整理知识点,方便提高开发效率、生产效率。针对OTA升级问题 ,再一次说明还是要看官方提供的文档,按照文档来。

十年饮冰,难凉热血 197
上一篇: 直播通知:AI时代程序员竞争力探讨 + Layer泄漏作业剖析
下一篇: AI工具为啥可以分析Perfetto性能?手把手教你常用SQL分析性能问题
千里马学框架
博客等级 码龄6年 1万+粉丝 651原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值