自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 收藏
  • 关注

原创 Android开发者转型AI架构师路线

这是一份为你量身定制的‌Android 资深开发者转型 AI 工程化学习路径图‌。基于你深厚的 Android 架构功底(特别是对 AGP、构建系统、ARM 架构及车规级 MCU 的理解),你的核心优势不在于从头训练大模型,而在于‌“端侧落地”‌与‌“工程化闭环”‌。未来的高价值岗位是‌AI 应用架构师‌或‌端侧推理专家‌,即解决“如何让大模型在资源受限的手机上跑得快、稳、省”的问题。核心定位:从“应用构建者”到“智能系统架构师”不要试图去卷算法层的数学推导,那是算法工程师的战场。

2026-03-12 15:23:30 421

原创 AGP、Gradle和Jdk之间的关系

Android Gradle Plugin(AGP)是 Android 项目构建系统中的核心组件,它与 Gradle 和 JDK 之间存在紧密的依赖关系。这三者必须保持特定版本组合才能确保项目顺利构建。

2026-03-12 11:21:50 390

原创 Function<T, R> 中 apply,compose, andThen 方法总结

在正常使用中,我们平时定义方法都是类似这样,case 1:default:然后通过在其他代码中引用该方法来使用,例如,Stream 中的 Function 实际上解决了一个简单的问题,那就是我们在实际书写代码的时候,一个方法一般只能作为代码中的某一行函数,用于处理里面的数值,但是并不能将一个方法作为一个参数,将方法以参数的形式,将方法传递到下一个方法中继续使用。源码以及使用示例/***//***/super V,?/***/

2026-01-21 11:51:54 385

原创 基于btrace的Perfetto的函数耗时监控

BTrace是一个开源项目。旨在为 java 提供安全可靠的动态跟踪分析工具。Btrace基于动态字节码修改技术 (Hotswap) 来实现运行时 java 程序的跟踪和替换,基于该思想,兼容到Perfetto采集trace文件后,进行性能分析。相比于Perfetto自身抓取的trace文件,btrace主要能量化分析函数运行时间,方便进行卡顿等分析。

2025-12-29 10:50:17 258

原创 System.setProperty vs adb setprop (Android SystemProperties)

特性底层机制JVM 内存 MapAndroid OS 共享内存 (Property Service)作用范围仅当前进程全局 (所有进程可见)持久化否 (进程重启即失效)persist.开头可持久化,其他重启失效权限要求无 (进程内随意设置)严格 (设置通常需 System/Root 权限)典型用途库配置、进程内全局变量系统开关、跨进程标志、调试开关。

2025-12-23 11:40:14 525

原创 Memory Analyzer Tools(MAT)内存分析工具

就是当前对象自己所占内存的大小,不包含引用关系的,比如说上图当中,byte[]对象的Shallow Heap最高,说明我们应用程序中用了很多byte[]类型的数据,比如说图片。好了,这大概就是MAT工具最常用的一些用法了,当然这里还要提醒大家一句,工具是死的,人是活的,MAT也没有办法保证一定可以将内存泄漏的原因找出来,还是需要我们对程序的代码有足够多的了解,知道有哪些对象是存活的,以及它们存活的原因,然后再结合MAT给出的数据来进行具体的分析,这样才有可能把一些隐藏得很深的问题原因给找出来。

2025-12-15 11:18:06 997

原创 Android内存泄露综合治理

即ML(Memory Leak)指程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给 程序的现象内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。通常少次数的内存无法及时回收并不会到程序造成什么影响,但是如果在内存本身就比较少获取多次导致内存无法正常回收时,就会导致内存不够用,最终导致内存溢出。内存溢出 (out of memory)指程序申请内存时,没有足够的内存供申请者使用,导致数据无法正常存储到内存中。

2025-12-12 17:33:12 754

原创 Tmux使用

本文主要介绍一个Linux终端复用神器Tmux。首先,让来介绍一下什么叫“Linux终端复用”?为什么需要用这个软件?使用场景有哪些?ChatGPT的回答还是非常准确的。从我自身的角度来说,有些时候我有一些不是很花时间的小命令懒得挂后台运行,直接在xShell里跑,但是由于我们学校的校园网很烂,经常出现断网重连的情况,一旦断网,xShell就断开了,我之前跑的程序也挂了,让人很烦躁。这样迫使我去学了一下Tmux这软件。总的来说,使用的体验非常好,也不难学。

2025-11-24 21:23:21 865

原创 使用simpleperf分析android系统线程性能

android系统性能分析,一直是手机厂和车机厂重中之重。性能治理主要涉及CPU和线程使用两大块,本文主要讲解如何使用simpleperf分析系统线程。Simpleperf是Android开源项目(AOSP)的一部分, 是一个 CPU 性能剖析工具,可以剖析 Android 客户端 Java 和 C++ 代码,是 Android NDK 工具的一部分。其包含两部分:Simpleperf可执行文件(命令行)和python脚本。

2025-11-18 21:04:39 409

原创 图形化android可视化开机观测工具bootchart

bootchart 一般用于系统启动时间的分析,可为调试人员快速地提供一副体现CPU、IO、进程启动情况的,以时间序列展开的图表。Android 目前已将bootchart集成到源码中,只需要在系统运行时设定其标志位即可采集到启动信息,非常方便,下面就介绍其使用方法。

2025-11-13 20:02:53 329

原创 kotlin基于MVVM架构构建项目

由三个核心组件构成:Model 负责数据逻辑和业务规则,View 处理界面展示,ViewModel 作为桥梁连接两者。与传统 MVC 相比,MVVM 通过数据绑定实现关注点分离,使代码解耦度提升 40% 以上(Google I/O 2022 数据)。Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。此方案比传统回调减少 60% 的并发错误(Google 案例研究),并支持背压管理。

2025-10-28 14:29:08 762

原创 Android编译插桩ASM技术探究(二)

自定义TransformPlugin文件,注册transform处理class文件。

2025-10-11 17:08:08 321

原创 Android编译插桩ASM技术探究(一)

先搞明白什么是编译插桩。我们写的Java/Kotlin代码,要经过一系列加工才能变成机器上能跑的APK,apk文件编译过程如下,Java代码 → javac编译 → Class文件 → 打包成Dex → 生成APK拦下所有Class文件按你的要求修改(比如加日志、加统计)再覆盖重新生成Dex不用改源码,业务代码干干净净统一处理,避免漏改、错改一次开发,全项目生效Transform是Android Gradle提供的用于处理Class文件的接口,我们的插桩逻辑就放在这里。

2025-10-11 16:14:03 350

原创 初识kotlin协程

Kotlin中的协程是官方定义的一套可以让开发者非常方便地实现并发操作的线程API。......我们可以看到这种串行的加载方式既浪费时间又浪费资源,关键是如果我还需要加载更多的信息,将会嵌套更多层,这种维护起来是相当的困难,所以大家给它取了个昵称 ---回调地狱(Callback Hell)。国外甚至还有同名网站,但是在Kotlin//launch 表示开启一个协程//同步代码块的方式实现异步操作上面的代码暂时不需要看懂,这里只是举个例子,让大家直观感受一下协程中这个巨好用的功能。

2025-09-19 20:12:49 808

原创 Java动态代理Proxy源码分析

我将newProxyInstance关键步骤总结画图如下,

2025-09-17 17:59:44 607

原创 android线程池深度解析

最近撸了ThreadPoolExecutor.java源码,对java线程池的理解帮助很大,和大家分享下。

2025-08-21 20:19:38 659

原创 Java多线程之CAS机制

谈谈你对 CAS 机制的理解?CAS 全称 compare and swap 即比较并交换,它通过一个原子的操作完成“读取内存,比较是否相等,修改内存”这三个步骤,本质上需要 CPU 指令的支持。ABA 问题如何解决?我们可以给修改的数据加上一个版本号,初始化当前版本号与旧的版本号相等。判断当前版本号如果等于旧版本号则对数据进行修改,并使版本号自增。判断当前版本号大于旧版本号,则不进行任何操作。

2025-08-21 11:15:10 831

原创 Java 线程池ThreadPoolExecutor源码解读

线程池与其说他是复用Thread,不如说他是不断地向Thread中填充新的Runnable,然后调用run,减少了创建Thread的开销。这个是老生常谈的实现方法了,继承Thread的时候需要实现run,如果直接调用run的话是无法开启线程的。如果阻塞队列都放慢了,就会看非核心线程是否到了最大的线程数,如果达到了最大线程,就会执行拒绝策略。总的来说addWorker除了进行Worker的构建和添加到Workers之外,还进行了Worker中线程的启动,这块是真正执行我们定义的逻辑的地方。

2025-08-20 21:01:25 940

原创 android APT技术

创建一个Java Library,名称为annotation,作用是保存所有注解。创建一个Java Library,名称为processor,作用是扫描、解析、处理注解。processor的Gradle配置如下://通过 AutoService 将 Processor 声明到 META-INF 中/*** 生成文件的工具类*//*** 打印信息*//*** 元素相关*//*** 存放被注解标记的所有变量,按类来划分*//**

2025-08-01 21:13:31 1105

原创 androidstudio调试apt

在 Android Studio 中,通过 "Edit Configurations" 添加 "Remote JVM Debug" 配置,为调试会话取一个名称并保存。

2025-08-01 18:00:01 265

原创 android闪光灯源码分析

​​​​​​​这几天撸了android11 aosp闪光灯源码,本着前人栽树后人乘凉的原则,有志于android系统开发的新同学们提供一盏明灯,照亮你们前行。本人撸代码风格,喜欢从app撸到kernel,启航出发。

2025-07-10 17:15:32 966

原创 Android wifi打开流程源码分析

这段时间撸了WIFI开启流程源码,本着前人栽树后人乘凉的原则,有志于android系统开发的新同学们提供一盏明灯,照亮你们前行。本人撸代码风格,喜欢从app撸到kernel,启航出发。一、APP层源码分析。

2025-06-27 14:32:01 660

原创 Android Settings详解

Settings主界面Activity使用的是Settings.java,子界面Activity使用的是SubSettings.java,Settings与SubSetting中的内部类都是空Activity(没有重写七大生命周期方法),都继承于SettingsActivity.系统设置的二级菜单界面Activity是SubSettings类,SubSettings类虽然是一个Activity但是它是一个空的Activity,它不继承Activity7大生命周期。以WifiSettings为例。

2025-06-19 17:05:28 1249

原创 android常用的调试技巧

adb shell dumpsys window | grep "mCurrentFocus"adb shell pm dump com.example.test | grep "versionName"

2025-06-19 10:38:09 275

原创 Android 用 platform.pk8 和 platform.x509.pem 生成 keystore 系统签名文件

最近需要开发一个拥有系统级权限的应用,就了解了下系统应用的签名方式,这里来简单介绍下。在进行 Android 应用开发的时候,如果开发的是系统应用,那么就需要有系统签名才能正常运行,而系统应用一般是放到系统代码库中跟随系统一起编译。如果想要用 Android Studio 单独对某个开发的应用进行签名的话,有两种方式可以选择。一种方法是编译完成后使用 signApk.jar 、platform.pk8 和 platform.x509.pem 进行配合签名。

2024-11-25 15:47:13 2339

原创 Android 应用添加系统签名权限介绍

Android 应用添加系统签名就能获取到系统权限调用一些系统接口,添加系统签名的方式主要包括:在Android Studio中配置签名文件生成apk 和 在源码目录编译添加系统签名生成apk。本文介绍的都是一些基础的签名知识,后续延伸介绍相关权限内容。有兴趣的可以进行了解。android {。。。//证书信息在这里配置main {storeFile file("./platform.jks") //签名文件路径,根目录release {

2024-11-21 16:51:20 3954

原创 ijkplayer定制化编译

ijkplayer是一款由哔哩哔哩公司开发的基于FFmpeg的播放器SDK开源架构,是值得音视频开发人员进行研究和使用的。上手ijkplayer第一步就是要学会编译。这里记录一下编译相关过程。本文是在安卓平台上开发的,所以主要记录的也是ijkplayer-android的编译过程,环境是在Ubuntu下编译的。

2024-05-09 09:42:20 1124

原创 DLNA设备控制分析

DLNA设备、服务的注册及发现(依赖开源库cling),DLNA中设备的注册、发现主要基于UPNP协议实现,这是微软推行的一个标准。Upnp最大的愿景是希望任何设备只要一接入网络,所有网上的设备马上就能知道有新设备加入,这些设备之间就可以彼此通信。

2024-05-07 10:20:06 1150

原创 DLNA源码分析之render启动

DLNA设备、服务的注册及发现(依赖开源库cling),DLNA中设备的注册、发现主要基于UPNP协议实现,这是微软推行的一个标准。Upnp最大的愿景是希望任何设备只要一接入网络,所有网上的设备马上就能知道有新设备加入,这些设备之间就可以彼此通信。

2024-05-06 14:35:20 709

原创 DLNA设备的发现

在RouterImpl.java中的startAddressBasedTransports()方法,对DatagramIOImpl初始化后,会将其放入线程池运行,所以直接看DatagramIOImpl的run方法。接着看SendingSearch.java,搜索数据包的信息,搜索请求消息没间隔500毫秒,发送一次,共发送5次。因为这个时候并不知道,这个远端设备是根设备,还是嵌入设备,所以还要去解析它的描述符,然后在处理添加。它的实现类可以被多个线程并发调用,所以他应该是线程安全的。

2024-04-30 11:30:49 988 3

原创 DLNA源码分析之render设备注册

DLNA设备、服务的注册及发现(依赖开源库cling),DLNA中设备的注册、发现主要基于UPNP协议实现,这是微软推行的一个标准。Upnp最大的愿景是希望任何设备只要一接入网络,所有网上的设备马上就能知道有新设备加入,这些设备之间就可以彼此通信。

2024-04-29 15:40:56 1425 2

原创 UPnP协议分析

UPNP(Universal Plug and Play)即通用即插即用协议, 是为了实现电脑与智能的电器设备对等网络连接的体系结构。而内网地址与网络地址的转换就是基于此协议的,因此只要我们的路由器支持 upnp,并且我们使用支持此协议的 操作系统,那么我们就可以借此提高点对点传输速度。简单的来说,UPnP 最大的愿景就是希望任何设备只要一接上网络,所有在网络上的设备马上就能知道有新设备加入,这些设备彼此之间能互相沟通,更能直接使用或控制它,一切都不需要设定,完全的 Plug and Play。

2024-04-28 19:40:22 5122

原创 投屏协议DLNA

DLNA全称为(数字生活网络联盟),旨在解决个人电脑,消费电器,移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务的无限制的共享和增长成为可能,为设备厂商提供了构建互操性数字化家庭设备和平台的必要信息。我们的设备(PC,手机,电视等)可以通过DLNA在局域网内进行多媒体(图片以及音视频)的分享,这就是DLNA的功能,就是DLNA。有了DLNA,我们可以把音乐投送到音质更好的音响上去,可以把视频投送到屏幕更大的电视上去。

2024-04-28 15:07:52 5855

原创 android开源投屏工具scrcpy简介

首先,我们来认识一下Scrcpy。Scrcpy 是一个开源的命令行工具软件,被设计用于使计算机用户能通过android adb或通过usb数据线控制其Android设备,支持通过鼠标和键盘对Android设备操作,更重要的是无需root权限。开源地址:https://github.com/Genymobile/scrcpy电脑上安装scrcpy后,执行scrcpy命令,弹出镜像窗口如下,

2023-10-17 09:20:56 11132 2

原创 车载娱乐系统之Android系统CarFramework流程

Android Automotive OS 定义了标准的硬件抽象层HAL(Hardware Abstraction Layer)来规范各个子系统与Framework的调用接口, 并且通过CarService以及相关的Car API对上层应用提供标准编程接口。

2023-09-25 10:39:04 1334

原创 中小型互联网公司如何搭建自己的技术架构

业务数据 业务量,我们自己是新闻业务,可能会有其他的业务,比如游戏,商城等等,基本每天新增的业务数据都会在同一个量级, 每日10000, 另外跟用户相关的信息也是比较大的一块,比如用户的订阅等行为,一共5万的用户,保存相关信息可能大概需要100条的数据。QPS, 如果是5万日活,使用集中在每天的4小时,每个用户大概产生100的请求,那么平均下来,我们系统大概应该支撑的请求为:50000。本文会对可能用到的相关技术进行技术选型的说明,以及技术的架构介绍,技术架构的介绍课程后面有地址,可以点进去查看。

2023-09-20 10:36:05 647

原创 IaaS,PaaS,SaaS 的区别

上图中,绿色的部分是云服务商决定的,紫色的部分是用户决定的。可以看到,SaaS 模式下用户没有任何自主权,只能使用给定的应用程序;PaaS 模式下可以自己安装应用程序,但是不能定制操作系统;IaaS 模式下则是云服务商提供(虚拟的)硬件,从操作系统开始都可以自己选择和定制。它与 PaaS 的区别是,用户需要自己控制底层,实现基础设施的使用逻辑。普通用户接触到的互联网服务,几乎都是 SaaS,下面是一些例子。微软的 Azure 云服务有一张图,解释这三种模式的差异。越来越多的软件,开始采用云服务。

2023-09-19 09:34:17 421

原创 汽车领域专业术语

DMS:即Driver Monitoring System,监测对象为Driver(驾驶员)。DMS三大核心:OMS:即Occupancy Monitoring System,监测对象为乘客。RMS:后排盲区检测系统IMS:In-cabin monitoring System即汽车座舱的智能视觉监控系。IMS既包括DMS、OMS,也包括FACE ID、手势识别、体征监测、远程监控等。

2023-08-18 09:59:20 5954

原创 Android设备通过蓝牙HID技术模拟键盘实现

日常生活中,各种物理遥控器和鼠标等设备,需要摆放和携带,便捷性有待考验。根据蓝牙HID特性,可以用蓝牙协议模仿键盘,来实现空中键盘等功能。

2023-08-16 16:35:26 3638 8

原创 Android设备通过蓝牙HID技术模拟鼠标技术实现

日常生活中,各种物理遥控器和鼠标等设备,需要摆放和携带,便捷性有待考验。根据蓝牙HID特性,可以用蓝牙协议模仿鼠标事件,来实现空中鼠标等功能。

2023-07-28 09:38:38 3825 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除