【AI问答】【IPC】《安卓开发艺术探索》第二章 IPC机制 阅读解惑——序列化、mmap、inout关键字

RK3572-Android16-记录一次OTA升级失败解决方案 这里记录一次解决RK3576 Android16 OTA 用Recovery 升级失败的一次解决案例,将部分经验作为总结。本次OTA升级耗时了几天,最终是RK给出的解决方案,再加上经验来解决了其它部分问题新平台,高一点的Android版本,可能本身有bug,多请教平台来,不要蒙着干,干不出来的。 阅读详情

问题速看


前言:
阅读过程中往往有一些相关或联想到的疑问,但此类我自己好奇或者说想整理的小众问题,从官方文档或者博客去看又效率稍低。

这时通过向问答类AI(预留广告位 )提问,是个高效方法,问完还可以快速整理出自己需要的内容(虽然偶尔担心它胡编乱造骗你 )

故而这系列叫【AI问答】

不完全是copy AI回答的,会裁剪修改。


【1】 为什么说,比起需要进行I/O的Serializable,在Android中 parcelable 是更适合序列化方式,它不需要吗

在Android开发中,Parcelable相较于Serializable确实是更高效的序列化方式,主要原因在于其设计目标和实现机制的差异。以下是详细的对比分析:

1. 性能差异的核心原因

  • Serializable:
    是Java原生的序列化接口,使用反射机制实现对象的序列化和反序列化。它会递归遍历对象的所有字段,并通过I/O流将其写入字节流。这个过程涉及大量的反射调用和临时对象创建,因此效率较低。

  • Parcelable:
    是Android特有的序列化接口,通过手动实现writeToParcel()和createFromParcel()方法来直接操作底层的Parcel对象。Parcel是Android系统内部的高效数据容器,使用内存映射文件技术(mmap)避免了传统I/O操作的开销,因此速度更快。

2. 是否需要I/O操作?

两者都涉及数据的传输,但方式不同:

  • Serializable:
    依赖Java的ObjectOutputStream/ObjectInputStream,这是基于传统I/O流的实现,需要频繁的内存拷贝和文件操作,性能开销大。

  • Parcelable:
    直接操作内存中的Parcel对象,数据存储在共享内存区域,无需通过传统I/O流进行数据传输。虽然最终可能会将Parcel数据写入文件或通过Binder传输,但中间过程避免了多次内存拷贝,效率更高。

3. 适用场景对比

特性SerializableParcelable
性能低(反射+I/O开销)高(直接内存操作)
代码复杂度低(自动生成)高(需手动实现接口)
适用场景数据持久化(如文件存储) 、网络传输跨进程通信(IPC)、Intent传递对象

5. 总结

  • Serializable:适合简单、对性能要求不高的场景(如本地文件存储),但不适合频繁的跨进程通信。
  • Parcelable:适合需要高效传输数据的场景(如Intent传递对象、Binder通信),虽然实现复杂,但性能显著优于Serializable。

因此,在Android开发中,若需序列化对象用于IPC或Intent传递,优先选择Parcelable。

【2】 Parcelable使用mmap,Binder也涉及mmap,两者有什么关联或相通之处吗

Parcelable 和 Binder 跨进程通信中涉及的 mmap 机制,本质上是共享内存技术在 Android 系统中的协同应用,两者的关联和相通之处主要体现在对“高效数据传输”的共同依赖上,具体可从以下角度理解:

1. mmap 的核心作用:避免传统 I/O 的“内存拷贝”开销

mmap(内存映射文件)是一种将磁盘文件直接映射到进程虚拟内存的技术,其核心优势是减少数据传输过程中的内存拷贝次数:

  • 传统 I/O 传输数据时,需要经过“用户空间 → 内核空间 → 用户空间”的多次拷贝(如读写文件时),效率低。
  • 而 mmap 让进程可以直接操作映射到内存的文件数据,相当于“共享”了一块内存区域,数据传输时无需反复拷贝,只需修改内存指针即可。

2. Parcelable 与 mmap 的关联

Parcelable 序列化的数据最终会存入 Parcel 对象,而 Parcel 内部的数据存储依赖于 Android 系统的“共享内存缓冲区”,这个缓冲区正是通过 mmap 机制创建的。

  • 当使用 Parcelable 序列化对象时,数据会直接写入这块共享内存(而非通过传统 I/O 流),序列化和反序列化过程本质上是对这块内存的直接读写。
  • 这种设计让 Parcelable 避免了 Serializable 中基于 I/O 流的多次内存拷贝,因此效率更高。

3. Binder 与 mmap 的关联

Binder 是 Android 跨进程通信(IPC)的核心机制,其高效性的关键也依赖 mmap:

  • 跨进程通信时,数据需要从一个进程(客户端)传递到另一个进程(服务端),而进程间内存是隔离的,传统方式需要通过内核中转(多次拷贝)。
  • Binder 通过 mmap 在客户端进程和内核之间创建一块共享内存区域:客户端将数据写入这块共享内存,内核无需拷贝数据,只需通知服务端读取即可,仅需 1 次内存拷贝(传统 IPC 需 2 次),极大提升了效率。

4. 两者的协同关系

Parcelable 和 Binder 的 mmap 应用是“配套设计”:

  • Parcelable 负责将对象高效序列化为可传输的二进制数据,并存入基于 mmap 的 Parcel 内存缓冲区;
  • Binder 则利用 mmap 创建的共享内存,将 Parcel 中的数据快速传递到目标进程。
  • 简单说:Parcelable 是“数据打包的高效格式”,Binder 是“数据传输的高效通道”,两者都通过 mmap 避免冗余的内存拷贝,共同实现了 Android 中跨进程通信的高效性。

总结

两者的相通之处在于:都依赖 mmap 技术实现“共享内存操作”,核心目标是减少数据传输中的内存拷贝和 I/O 开销;而关联之处在于:Parcelable 序列化的数据通过 Binder 的 mmap 通道进行跨进程传输,形成“高效打包 + 高效传输”的完整链路,这也是 Android 系统在 IPC 场景中性能优化的关键设计。

【3】 那mmap是如何保障共享内存的数据安全性的,不被篡改、不被窃取

mmap(内存映射文件)技术本身并不直接提供数据加密或复杂的安全策略,但其安全性依赖于操作系统层面的内存保护机制和上层框架的权限控制。在Android中,mmap在共享内存场景下的安全性主要通过以下多层机制保障,避免数据被未授权篡改或窃取:

一、操作系统级内存保护:进程隔离与访问权限控制

  1. 内存访问权限控制(PROT标志)
    在Linux(Android基于Linux)中,使用mmap时可通过PROT_READ、PROT_WRITE、PROT_EXEC等标志限制内存区域的访问权限。例如:

    • 若共享内存被映射为PROT_READ,则进程只能读取数据,无法修改;
    • 若仅允许特定进程拥有PROT_WRITE权限,则其他进程无法篡改数据。
      这种机制从底层确保只有授权进程能以指定方式(读/写)访问共享内存。
  2. 进程地址空间隔离
    每个Android应用运行在独立的进程空间中,系统通过Linux的虚拟内存机制将不同进程的地址空间隔离。即使多个进程映射了同一块物理内存(共享内存),也需通过操作系统的页表映射控制访问权限,非授权进程无法直接访问其他进程的内存地址。

二、Android特有的IPC框架:Binder的权限验证机制

在Parcelable和Binder通信场景中,mmap的安全性与Binder的权限管理深度绑定:

  1. Binder的进程身份验证
    Binder通信时,系统会验证调用方的进程身份(如UID、PID),确保只有符合权限要求的进程才能发起通信。例如:
    • 应用A通过Binder向系统服务B发送数据时,系统会检查A是否拥有访问B的权限(如通过AndroidManifest.xml中的权限声明)。
    • 若身份验证失败,即使共享内存存在,未授权进程也无法通过Binder获取或修改数据。

Binder 权限验证机制举例:

系统服务访问:应用调用TelephonyManager.getDeviceId()时,需在AndroidManifest.xml中声明READ_PHONE_STATE权限。若未声明,Binder 通信时系统会拒绝调用,抛出SecurityException。
自定义 Binder 服务:开发者自定义IBinder服务时,可通过checkCallingOrSelfPermission()校验调用方权限,例如:

@Override
public void someMethod() {
    if (checkCallingPermission(Manifest.permission.CUSTOM_PERMISSION)
        throw new SecurityException("Permission required");
    // 权限通过后执行操作
}
  1. 共享内存的定向访问
    Binder在使用mmap创建共享内存时,会将内存区域与特定的Binder连接绑定。例如:
    • 客户端进程通过Binder请求服务端分配共享内存时,服务端可指定该内存仅允许当前Binder连接的进程访问,其他进程无法通过地址偏移等方式访问该内存区域。

三、SELinux(安全增强型Linux)的上下文控制

Android通过SELinux为进程和资源分配安全上下文(Security Context),进一步限制共享内存的访问:

  1. 标签化访问控制
    每个进程和内存区域都有对应的SELinux标签(如u:r:app_zygote:s0),系统会检查进程的标签是否有权限访问特定内存区域。例如:
    • 系统服务进程的标签可能允许访问核心共享内存,而普通应用的标签则被限制在沙盒内。
  2. 强制访问控制(MAC)
    SELinux通过策略文件(如sepolicy)定义“谁可以访问什么”,即使进程拥有物理内存的访问权限,若SELinux策略禁止,也无法操作数据。

四、数据传输与存储的上层安全措施

虽然mmap本身不加密数据,但Android系统或应用可在以下环节增强安全性:

  1. 数据加密传输
    在将数据写入共享内存前,应用可对数据进行加密(如AES),读取时再解密。例如:
    • 金融类应用通过Binder传输敏感数据时,可先加密再存入Parcel,避免共享内存中的明文数据被窃取。
  2. 临时内存与生命周期管理
    共享内存通常用于临时数据传输(如IPC过程中),数据处理完成后会被释放或覆盖,减少被攻击的窗口。

五、风险场景与限制

尽管有多层保护,仍需注意以下潜在风险:

  1. 内核漏洞风险
    若Linux内核存在漏洞(如内存映射机制的漏洞),可能被恶意程序利用突破权限限制,但这类风险属于系统级安全问题,需通过系统升级修复。
  2. 应用层逻辑漏洞
    若应用在使用mmap时未正确实现权限验证(如Binder服务未校验调用方身份),可能导致数据被非法访问。例如:
    • 第三方应用开发的Binder服务若未限制调用方,可能被其他应用利用来篡改共享内存数据。

总结

mmap技术在Android中的安全性并非单一机制实现,而是通过Linux内存保护、Binder权限验证、SELinux上下文控制及应用层安全策略的多层协同。在Parcelable和Binder场景下,由于数据传输全程受系统级IPC框架管控,共享内存的访问被严格限制在授权进程范围内,从而有效避免了数据篡改和窃取问题。但需注意:底层机制的安全性依赖于系统实现的完整性,应用开发时仍需遵循安全规范(如正确声明权限、校验调用方身份),以避免上层逻辑漏洞带来的风险。

【4】 Binder跨进程通信中,我们可以通过in 和 out限定参数流向,这和你说的内存访问权限限制有关联吗?

in/out参数与内存访问权限的关联
有关联但不等同。in/out(如AIDL中的方向限定符)是上层接口对数据流向的约定,而内存访问权限是底层实现。

一、in/out参数的本质:进程间的数据修改权限分配

可以这样理解。in/out是AIDL(Android Interface Definition Language)中的方向限定符,本质上是通过Binder机制实现的跨进程数据访问权限分配:

  • in参数:客户端将数据写入共享内存,服务端获得只读权限(PROT_READ),无法修改客户端原始数据。
    例如:客户端传递UserInfo对象给服务端,服务端只能读取其中的字段,修改操作不会影响客户端内存。
  • out参数:客户端分配内存空间,服务端获得只写权限(PROT_WRITE),用于向客户端回写数据。
    例如:客户端传递空的UserInfo对象,服务端填充数据后,客户端可读取修改结果。
  • inout参数:双方均有读写权限(PROT_READ | PROT_WRITE),但需通过Binder同步操作顺序(见下文)。

二、inout通过Binder同步操作顺序的机制

当使用inout参数时,Binder需确保双方对共享内存的读写操作不会冲突,主要通过以下方式实现:

1. 操作原子性

Binder驱动在传输数据时,会将共享内存的访问封装为原子操作。例如:

// AIDL接口定义
interface IDataService {
    void processData(inout Data data);
}
  • 客户端:
    1. 将Data对象写入共享内存;
    2. 通过Binder发送请求,此时客户端对内存的写操作被冻结;
    3. 等待服务端处理完成后,才能读取修改结果。
  • 服务端:
    1. 接收请求时,获得对共享内存的独占写权限;
    2. 修改数据后,通过Binder通知客户端操作完成;
    3. 释放写权限,无法再修改数据。
2. 同步锁机制

Binder在底层使用内核级同步锁(如futex)保证操作顺序。例如:

  • 当服务端正在写入inout数据时,客户端的读操作会被阻塞,直到服务端释放锁;
  • 服务端写入完成后,需通过Binder发送SYNC信号,唤醒客户端线程继续执行。

三、示例:inout参数的典型场景

假设我们有一个AIDL接口用于处理用户信息:

// IUserService.aidl
interface IUserService {
    void updateUserInfo(inout UserInfo info);
}

客户端代码:

UserInfo info = new UserInfo("Alice", 20);  // 创建初始对象
service.updateUserInfo(info);  // 发送给服务端处理
// 此时客户端被阻塞,直到服务端返回
Log.d("Client", "Updated age: " + info.getAge());  // 读取服务端修改后的值

服务端实现:

@Override
public void updateUserInfo(UserInfo info) {
    // 服务端获得读写权限
    int newAge = info.getAge() + 1;  // 读取原始数据
    info.setAge(newAge);  // 修改数据(直接写回共享内存)
    // 方法返回时,Binder自动通知客户端数据已更新
}

执行流程:

  1. 客户端将UserInfo对象写入共享内存(年龄=20);
  2. Binder驱动将内存访问权移交给服务端,并阻塞客户端线程;
  3. 服务端读取年龄(20),加1后写回内存(年龄=21);
  4. 服务端返回时,Binder唤醒客户端线程,客户端读取到更新后的年龄(21)。

四、关键点总结

  • inout的核心:通过Binder的同步原语(如锁、信号量)确保双方对共享内存的操作顺序,避免数据竞争。
  • 与多线程同步的类比:可将Binder视为“跨进程的synchronized块”,不同进程通过Binder驱动实现原子性操作。
  • 性能代价:由于涉及内核级同步,inout参数的开销略高于in或out,但仍远低于多次IPC调用。

【5】 在哪些场景下适合使用inout参数?

inout参数的适用场景与典型案例

一、需要双向数据交互的场景

当数据需要在客户端和服务端之间双向传递并修改时,inout是最佳选择。例如:

1. 复杂对象的状态更新
  • 场景:客户端传递一个包含用户配置的对象给服务端,服务端根据业务逻辑修改配置后返回给客户端。
  • 示例:
    interface IConfigService {
        void updateSettings(inout AppConfig config);
    }
    
    • 客户端传递初始配置(如主题模式、通知开关);
    • 服务端根据系统资源(如电量、内存)调整配置(例如低电量时关闭动画),并将修改后的配置回传给客户端。
2. 大型数据的分段处理
  • 场景:处理大文件或数据流时,避免多次IPC传输,通过inout在单次调用中完成读写。
  • 示例:
    interface IFileProcessor {
        void processLargeData(inout DataBuffer buffer);
    }
    
    • 客户端传递包含部分数据的缓冲区;
    • 服务端处理数据(如压缩、加密)后,将结果写入同一缓冲区并返回,减少内存拷贝。
二、需复用对象以优化性能的场景

inout可避免对象的重复创建和序列化开销,适合以下场景:

1. 频繁交互的实时通信
  • 场景:即时通讯应用中,消息对象需要在发送端和接收端之间反复修改状态(如已发送、已读)。
  • 示例:
    interface IMessageService {
        void sendMessage(inout Message msg);
    }
    
    • 客户端传递消息对象(内容、发送时间);
    • 服务端发送消息后,修改消息状态(如添加消息ID、时间戳)并返回给客户端,避免多次序列化。
2. 数据库事务的跨进程操作
  • 场景:跨进程操作数据库时,通过inout传递事务对象,减少多次SQL指令的传输。
  • 示例:
    interface IDbService {
        void executeTransaction(inout DbTransaction tx);
    }
    
    • 客户端构建事务(包含SQL语句、参数);
    • 服务端执行事务并返回结果(如受影响的行数、错误信息),复用同一对象传递双向数据。
三、需保持对象引用一致性的场景

当跨进程操作需要维持对象的引用关系(如集合、嵌套对象)时,inout可避免对象重建导致的引用失效。

1. 跨进程的集合操作
  • 场景:客户端传递一个列表给服务端,服务端添加元素后返回,客户端直接使用更新后的列表。
  • 示例:
    interface IListService {
        void processList(inout List<String> data);
    }
    
    • 客户端传递["A", "B"];
    • 服务端添加"C"后返回,客户端得到["A", "B", "C"],无需重新解析列表。
2. 嵌套对象的递归修改
  • 场景:复杂数据结构(如树状对象)需要跨进程修改深层属性。
  • 示例:
    interface IDataProcessor {
        void updateDeepData(inout ComplexData data);
    }
    
    • 客户端传递包含多层嵌套的ComplexData对象;
    • 服务端直接修改深层字段(如data.child.child.value),避免因对象重建导致的引用断裂。
四、注意事项:inout的性能与安全权衡
  1. 性能优势:

    • 减少IPC次数:单次调用完成双向数据交互,避免多次in+out调用的开销。
    • 降低序列化成本:复用对象内存,无需反复序列化/反序列化。
  2. 潜在风险:

    • 内存竞争:若双方同时操作inout数据(如多线程场景),需额外同步机制(如AIDL的oneway关键字配合锁)。
    • 安全漏洞:服务端需校验inout数据的合法性(如避免恶意客户端传入非法对象),可通过Parcelable.Creator或自定义校验逻辑实现。
五、总结:优先选择inout的场景特征
  • 数据需双向修改且包含复杂状态;
  • 追求性能优化,需减少IPC次数或序列化开销;
  • 对象引用关系需跨进程保持一致。
    若数据仅需单向传递(如客户端传参给服务端),优先使用in;若仅需服务端返回结果,优先使用out。

【5.1】 使用inout关键字,假设服务器数据处理过久,是否会引发客户端ANR

1. oneway关键字的作用

核心功能:将AIDL接口调用改为单向异步通信,客户端调用后无需等待服务端返回结果,直接继续执行。

典型场景:

  • 无需响应的指令发送:如通知服务端“开始下载文件”,客户端不关心下载结果,直接返回。
  • 避免跨进程死锁:当客户端和服务端互相调用对方接口时,oneway可打破同步调用的等待链。

实现原理:

  • 跳过Binder通信的响应等待阶段,调用方transact()方法立即返回,不阻塞线程。

2. inout是否会引发客户端ANR

可能引发ANR的情况:

  • 若服务端处理inout数据的时间过长(超过5秒),且客户端在主线程(UI线程) 发起调用,则会触发ANR(Application Not Responding)。

原因:

  • Binder的同步调用(非oneway)会阻塞调用线程,若服务端处理耗时超过系统阈值(Android默认5秒),主线程无法响应UI事件,导致ANR。

解决方案:

  • 客户端在子线程中调用AIDL接口,避免阻塞主线程;
  • 对耗时操作使用oneway或拆分任务,减少单次调用的处理时间。
第4章 Stata参数检验 目录 4.1单一样本T检验 案例延伸 4.2独立样本T检验 案例延伸 1.改变置信水平 2.在异方差假定条件下进行假设检验 4.3配对样本T检验 案例延伸 1.改变置信水平 4.4单一样本方差的假设检验 案例延伸 4.5双样本方差的假设检验 参数检验(Parameter Test)是指对参数的平均值、方差、比率等特征进行的统计检验。参数检验一般假设统计总体的具体分布为已知,但是其中一些参数或者取值范围不确定,分析的主要目的是估计这些未知参数的取值,或者对这些参数进... 阅读详情

相关推荐

生信实战|EffectorP3.0在植物病原菌效应子预测中的高效应用

本文详细介绍了EffectorP 3.0在植物病原菌效应子预测中的高效应用。通过机器学习模型,该工具能快速从海量分泌蛋白中批量预测胞质与质外体效应子,显著提升研究效率。文章提供了从环境配置、RNA-seq数据处理到批量预测的完整实战流程,并分享了结果解读与避坑指南,是生信研究人员进行病原物效应子鉴定的必备利器。

weixin_29195615的博客 302

Android Visualizer 实战:把声音画出来

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

Android的专栏 293

电压比较器---滞回比较器(施密特触发器)

当输入电压从小电压开始增加,当其大于VT+时,电压比较器输出低电平,此时阈值电压变成下门限电压(VT-);当输入电压从大电压开始减小,当其小于VT-时,电压比较器输出高电平,此时阈值电压变成上门限电压(VT+);只有当第一次超过上门限电压或者下门限电压值,电压比较器的输出才会翻转变化;Uo为比较输出电压,有两种电压状态VoH(高电平)和VoL(低电平);当Uo输出为高时,电压比较器的阈值电压是上门限电压(VT+);当Uo输出为低时,电压比较器的阈值电压是下门限电压(VT-);Vref为比较参考电压;

weixin_69076249的博客 1万+

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

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

Easyhood的博客 331

QMT量化交易桥接方案深度对比:从MiniQMT淘汰说起

量化交易系统中的API桥接,本质是解决本地终端与底层交易引擎之间的通信瓶颈。其核心原理在于绕过GUI封装、直连确定性执行层,从而获得低延迟、高可靠、可监控的指令通路。技术价值体现在策略实盘一致性提升、毫秒级响应保障及运维可控性增强。典型应用场景包括打板策略、T+0套利、高频网格等对时效与稳定性双敏感的自动化交易。本文聚焦国金证券QMT专业版生态,系统剖析DLL注入、HTTP反向代理、IPC共享内存与官方HTTP API四大桥接路径的性能边界、合规风险与工程落地成本,尤其深入解析qmt终端 client is

weixin_33892359的博客 457

【CAPL实用开发】--- 使用VN1640A测试Busoff快慢恢复

使用VN1640A测试Busoff快慢恢复,包含具体的CAPL代码实现。

LabVIEW、CAPL、python、车载以太网等学习分享,文章正在写 2096

Android Message源码阅读

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

u012116089的博客 201

英雄联盟(MOBA)完整制作教程

这是一份从零到上线、可落地的 LOL 风格 MOBA 游戏开发全流程教程,覆盖策划、美术、程序、测试、运营全环节,适合独立团队或学习参考。

qq_35779316的博客 542

Android Laya 与 Native Bridge:页面识别、双向通信、协议设计和崩溃定位

Laya 与 Native 通信的难点不在于某个或的写法,而在于边界:页面来源是否可信、协议是否明确、线程是否正确、请求是否幂等、页面是否仍然存在、日志是否能关联一次完整请求。建立这些边界后,才能把“页面白屏”“按钮无响应”“重复消息”和“Native 崩溃”拆成可验证的层次,并沿着真实调用链找到根因。

路在脚下,幸福在手中,莫贪!!!!! 152

CodeBuddy Code CLI 常用工作流:17个实战场景全解析

CodeBuddy Code CLI 17个实战场景解析 本文详细介绍了CodeBuddy Code CLI在17个开发场景中的高效应用,包括: 快速理解新代码库 高效修复Bug 安全重构代码 使用子代理系统处理专业任务 Plan Mode安全分析 自动化测试处理 创建合并请求 文档生成与维护 图片内容分析 文件目录快速引用 每个场景都配有具体命令示例和最佳实践,帮助开发者提升工作效率。

简简单单Onlinezuozuo 1079

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4027

安卓部署Linux性能实测:一颗移动处理器,能否胜任日常 Linux 开发?

本文通过在一加Ace5上部署NimoteCode的ARM64 Linux环境,测试了其在CoreMark、SQLite编译及并行构建中的表现。结果显示,尽管单核性能约2.34GHz,多核扩展比达6.15×,但优化编译耗时仍高达35秒,反映移动处理器虽具备一定开发能力,却受限于文件系统开销与运行环境(如PRoot)。实际开发中,非优化构建效率较高,而并行编译可显著提速。结论:安卓手机可作为轻量级开发辅助工具,但无法替代桌面环境,真正价值在于便携性与即时响应,而非全功能替代。

一个不知名码农的专栏 325

ROS2 CANopen 使用教程

第一步是定义一个结构,用于保存有关接头和相关 CANopen 数据的信息。该结构是 CANopen 网络的基础,可确保存储所有相关数据并在需要时进行访问。

机器人控制与仿真应用 3691

BUUCTF-菜刀流量-MISC-学习笔记

从 1970-01-01 00:00:00 UTC 起算的秒数,——Wireshark 直接告诉你它回答的是谁;由表可知道,96帧返回了flag.rar。, 代表删除键,先删了4次,又删了1次。所以密码是:SuperMaster。解析128帧的响应,即133帧。所以这是一个标准抓包文件,用。解压压缩包拿到html代码。:选中 128 帧,展开。:128 和 131 的。能把一问一答放在一起看;是八进制(Oct)的数字。(或 TCP 层)看到。对比一下ASCii 码表。

晓梦林的博客 64

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

云手机私有化部署完整方案:基于ARM服务器搭建私有安卓云集群

ARM 服务器是私有化安卓云集群最优硬件底座,原生架构匹配 Android,高密度、低损耗,非常适合企业内网场景。整套私有化方案的核心,从来不是 “跑起来安卓”,而是隔离可控、可审计、可运维、可扩容。两条路线各有取舍:开源自建灵活、门槛高;商用私有化交付开箱即用、安全能力完备,是当前企业生产环境主流方案。六边云手机私有化方案,补齐了自建方案在驱动适配、管控平台、审计合规、信创适配上的短板,适合对数据主权、内网隔离有强需求的政企、自研 App、垂直行业客户。

a598652的博客 343

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android 17 全栈性能分析关键字与源码手册

FrameTimeline 找异常帧,ATrace 找阶段,thread_state 找等待类型,ftrace 找内核原因,Simpleperf 找 CPU 热点,驱动源码找最终触发条件;任何根因结论都必须回到同一对象、同一时间窗口和同一条依赖链。

weixin_43228946的博客 375

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

CTF 命令执行题学习笔记:终端特殊字符 $IFS 与 %09 的用法(HelloCTF RCE-labs)

空格被过滤时:用%09(TAB)或$IFS代替空格关键词被过滤时:用通配符?或字符类[f]拼出被禁的词,让 WAF 在原始字符串里看不到它,shell 在执行时再展开这类技巧在后续的命令执行题里会反复用到,建议亲手在靶机上敲一遍感受一下。

YY888888_的博客 543

Android 开发入门实践(九):把新闻数据与页面状态交给 ViewModel

本文记录第110—117课学习成果:将页面标题、新闻列表及选中编号逐步迁移至NewsViewModel,通过ViewModelProvider获取实例并读取数据。页面调用ViewModel方法处理选择与返回,实现状态管理解耦。过程中纠正了对Activity重建机制的误解,并厘清mutableStateOf的可观察性与ViewModel对象生命周期的区别,深化了对Compose状态更新机制的理解。

Easyhood的博客 221

谷歌相机9.2下载(GCam 安卓通用版 安装与使用说明)

谷歌相机9.2版移植自Pixel原生相机,支持Camera2 API的Android 10+设备安装,凭借多帧合成技术在夜景、HDR+与人像模式表现优异。可提升暗光画质、优化动态范围与背景虚化效果,支持视频防抖及配置文件自定义。安装需确认机型兼容性,建议备份原相机,避免冲突。资源可通过kuake链接获取,仅限学习测试使用。

2611_96675819的博客 174

Android 系统启动与调试中的日志抓取方式全解析

│ 用户操作/系统事件 ││ │▼ ▼│ (驱动/硬件/内存管理) │ │ (App/SystemServer) ││ │ │ ││ │▼ ▼│ dmesg 命令 │ │ logd daemon ││ cat /proc/kmsg │ │ (分类存储到分区) ││ │▼ ▼│ 串口 UART │ │ logcat 命令 ││ (硬件直连,最早输出) │ │ adb logcat ││ │▼│ (汇总所有日志+系统状态) │工具最佳用途关键优势主要局限dmesg。

zhaoshuzhaoshu的专栏 269

Android 开发入门实践(十):用 Kotlin 协程完成模拟加载、取消与异常处理

本文记录第118—125课对NewsApp的协程改造:从viewModelScope.launch启动协程,逐步加入delay模拟等待、suspend函数封装、withContext(Dispatchers.IO)切换线程并观察上下文恢复机制。通过日志验证withContext完成后恢复原执行上下文(非自动回主线程),纠正了初始理解偏差。引入Job管理任务,实现加载取消与重复点击防护,结合异常处理与状态管理,完成可观察、可中断的异步流程。

Easyhood的博客 398

【Android】听写播放器改版:中英文书写速度拆项与「正在读」高亮

现象:把播放页主体抽成后,里面给LazyColumn加想让它占满剩余高度,编译报错(weight 不可用)。原因weight不是通用修饰符,是RowScope的扩展函数。是个普通函数,函数体里没有接收者,自然调不到。解决private fun ColumnScope.PlaybackBody(...) { /* 这里就能用 Modifier.weight(1f) */ }调用处仍在原来的Column { }里,无需改动。预防:Compose 的布局修饰符都是作用域绑定。

木头大左的博客 246

go消息推送之极光推送 (JPush REST API + SDK,覆盖安卓与iOS)

使用 gorush有个绕不开的问题:国内安卓设备上 FCM 基本不可达,华为、小米、OPPO、vivo 各自为政——此时可用极光推送(JPush)作解决方案。它的思路和前面几家都不一样:App 集成极光 SDK 后拿到统一的 RegistrationID,服务端发一条 REST 请求,极光云端自动把消息路由到 APNs、各家厂商通道或极光自有长连接。这里给出了:一个用纯标准库直接调用极光的;另一个用社区维护的,类型化参数,接口注释与官方文档逐条对应。两个功能相同,可放在一起对比学习。

qq_40467670的博客 192

工业智能体:从Codex/Claude到项目实战~系列文章11:Codex 批量重构老系统:激活历史 DCS/PLC 存量代码

本期提出规模化重构工业老系统(如DCS/PLC代码)的可执行方法论:通过AST静态分析量化风险,按“盘点评估→样板重构→批量迁移→回归灰度”四阶段推进;利用Codex实现模块级批量重构,并以“金标准样本”确保数值一致性;接入CI流水线实现自动化守护。强调“小步改、保语义、可回滚”,结合绞杀者模式渐进替代,实现存量代码的安全激活。来自华北理工大学段一凡的博客文章

段一凡的博客 382

android 动画掉帧

动画

yeshen.org 243

MySQL 数据库账户及授权

MySQL 8.0默认使用caching_sha2_password认证插件,可通过show variables like '%password%'查看密码策略。通过validate_password插件可设置密码强度,策略等级包括LOW、MEDIUM、STRONG,支持长度、大小写、数字、特殊字符及字典检查。密码策略可临时或永久配置。用户需先创建账户再授权,遵循最小权限原则,避免root账户远程访问。常用权限如CREATE、DROP、SELECT、INSERT、UPDATE等按级别分配,确保安全与管理规范

Y_P_W的博客 189
上一篇: 【恍然一悟】用递归过程思考 [辗转相除法|欧几里得算法] 原理,附代码(leetCode1979 找出数组的最大公约数)
case:break;
博客等级 码龄7年 45粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值