Android
文章平均质量分 86
Ryan ZHENG
Senior Android Frameworks Developer
展开
-
记录一次WLAN Panic导致的gcore问题分析
高通Q+A架构,WLAN驱动Panic引起Kernel HANG,从而生成gcore的问题原创 2024-04-24 21:51:50 · 837 阅读 · 3 评论 -
[Android]使用linux-ramdump-parser-v2解析gcore文件
高通Q+A平台,gcore文件解析步骤原创 2024-04-22 18:58:29 · 700 阅读 · 3 评论 -
[Android]AsyncChannel介绍
com.android.internal.util.AsyncChannel类的介绍与使用原创 2023-05-12 16:05:06 · 3477 阅读 · 0 评论 -
[Android][WIFI]手机作AP,关闭移动网络后,STA端断开重连问题分析
手机作为AP时,关闭移动网络流量开关,STA端出现断开重连的现象原创 2023-01-04 13:31:46 · 4710 阅读 · 2 评论 -
[Android]Android P(9) WIFI学习笔记 - 扫描 (3)
Android P WiFi扫描请求发起、扫描结果返回流程流程串联。原创 2022-09-09 14:50:56 · 1840 阅读 · 1 评论 -
[Android]Android P(9) WIFI学习笔记 - 扫描 (2)
Android P WiFi扫描结果返回流程原创 2022-09-06 13:38:36 · 1424 阅读 · 0 评论 -
[Android]Android P(9) WIFI学习笔记 - 扫描 (1)
Android P WiFi扫描请求发起流程原创 2022-09-02 14:37:09 · 1457 阅读 · 0 评论 -
[Android][DevTips]chrt命令修改线程优先级与调度策略
此次介绍的是Android系统中内置的chrt命令的使用和一些注意事项;原创 2022-08-18 10:41:35 · 1333 阅读 · 0 评论 -
[Android][DevTips]DHCP流程与ARP相关简介
DHCP与ARP原创 2022-07-26 16:52:10 · 1588 阅读 · 0 评论 -
SELinux规则添加进阶
在上一篇中,我们已经了解了一个常规`avc denied`日志信息该如何应对。当时挖的两个坑,今天来填一下:- 添加的SELinux规则是否存在权限放大;- 添加的SELinux规则是否触犯neverallow;实际上,这是一类问题,今天正好遇到了对应的需求,就以此为例,进行以下介绍:...原创 2022-07-26 13:58:43 · 1562 阅读 · 1 评论 -
[Android]基于AOSP源码为Pixel3编译boot.img(下)
如何将Android Kernel源码并入AOSP源码,使后者的编译框架可以直接从源码编译boot.img——下篇原创 2022-07-22 14:01:10 · 2415 阅读 · 1 评论 -
[Android]基于AOSP源码为Pixel3编译boot.img(中)
如何将Android Kernel源码并入AOSP源码,使后者的编译框架可以直接从源码编译boot.img——中篇原创 2022-07-08 13:37:36 · 1748 阅读 · 3 评论 -
[Android]基于AOSP源码为Pixel3编译boot.img(上)
如何将Android Kernel源码并入AOSP源码,使后者的编译框架可以直接从源码编译boot.img——上篇原创 2022-07-06 18:45:12 · 3246 阅读 · 10 评论 -
[Android][DevTips]修改AOSP编译环境OUT_DIR
在将Android kernel集成进AOSP编译树中,会或多或少出现由于环境变量OUT_DIR为相对路径,导致存放路径错误(例如产物生成在了kernel/msm-4.9/out下),这类问题可以通过如下任意一种方法解决原创 2022-07-05 10:48:42 · 820 阅读 · 0 评论 -
[Android][DevTips]定位Toast的所有者
定位Toast的所有者原创 2022-06-10 11:22:17 · 1572 阅读 · 0 评论 -
[Android][ASM]指令注入入门(四)——实际需求实现(中)
[Android][ASM]指令注入入门(四)——实际需求实现(中)前言在上一篇中,我们实现了无返回值的方法收尾插入Binder.clearCallingIdentity()/Binder.restoreCallingIdentity()方法;而这一篇,会在此基础上,将使我们的工具支持带返回值的方法;开发步骤源码端import java.util.Random;public class Test2 { private static final Random R = new原创 2022-05-06 10:03:27 · 241 阅读 · 0 评论 -
[Android][ASM]指令注入入门(三)——实际需求实现(前)
[Android][ASM]指令注入入门(三)——实际需求实现(前)前言在上一篇中,我们搭建了基于Ubuntu(WSL2)下JAVA的开发环境,今天我们基于这个环境,来实现一个实际需求:为特定方法的首尾分别插入Binder.clearCallingIdentity()与Binder.restoreCallingIdentity()产生这样需求的原因是如下这样一个情况:某些功能需要system_server内部各个服务间相互调用,但是开发人员在设计API时,无法考虑到调用方是否具备调用其他服务的权限原创 2022-04-29 15:40:02 · 1534 阅读 · 0 评论 -
[Android][ASM]指令注入入门(二)——开发环境搭建与Hello World
[Android][ASM]代码注入入门(二)—— 开发环境搭建与Hello World前言在上一篇中,我们见识了AOSP中使用asm实现的一个功能——lockedregioncodeinjection:其可以在编译时为services.core.unboosted.jar中指定类中的同步代码块添加try-catch代码块,并在代码块的首位追加boostPriorityForLockedSection()与resetPriorityAfterLockedSection()方法调用,并将最后修改产物保存为原创 2022-04-28 11:10:23 · 536 阅读 · 0 评论 -
[Android]基于AOSP源码为Pixel3编译vendor.img
[Android]基于AOSP源码为Pixel3编译vendor.img[Android]基于AOSP源码为Pixel3编译vendor.img前言环境台式机AOSP版本Pixel型号正文下载AOSP代码编译AOSP获取vendor.img提取vendor.img编译规则修改验证后记[Android]基于AOSP源码为Pixel3编译vendor.img前言环境台式机Ubuntu16.04AOSP版本9.0(android-9.0.0_r46 )Pixel型号Pixel3 (4GB + 6原创 2022-04-24 14:29:30 · 3322 阅读 · 14 评论 -
[Android][WIFI]关闭WLAN耗时分析
[Android][WIFI]关闭WLAN耗时分析前言基于Android P(9) 分析流程梳理详见:[Android]Android P(9) WIFI学习笔记 - Framework (2)和[Android]Android P(9) WIFI学习笔记 - HAL (2)背景引发这个思考,是由于一个现象:在热点打开的时候,关闭WLAN耗时约为1s;在热点关闭后,再关闭WLAN,耗时在2s以上;这么一个一致性很差的现象,确实很难让人理解,于是翻开之前的流程图,开始了梳理之路;梳理原创 2022-04-14 11:41:16 · 3026 阅读 · 2 评论 -
[Android][CTS][WIFI]Android P上CtsNetTestCases测试项导致系统重启问题分析
复现步骤执行:cts-tf > run cts -m CtsNetTestCases后概率复现;初步分析通过多次尝试,发现大多集中在如下这项测试项:android.net.wifi.cts.WifiManagerTest#testStartLocalOnlyHotspotSingleRequestByApps单跑此项后验证,确实有较高概率导致system_server进程崩溃,Android上层重启:cts-tf > run cts -m CtsNetTestCases -t原创 2022-01-13 18:14:04 · 2714 阅读 · 3 评论 -
[Android]CTS Fail项分析方法
[Android]CTS Fail项分析方法常规步骤为:通跑某一模块;查看测试结果;对Fail项进行单跑;辅助信息抓取;通跑某一模块以网络模块为例,通过如下测试项为例,在cts-tradefed交互界面输入list m可查看与之对应的待测模块(modules):cts-tf > list m...CtsNetTestCases...从中可以看到,CtsNetTestCases明显是网络相关的测试模块,因此执行:cts-tf > run cts -m CtsNetT原创 2021-12-29 13:19:08 · 3759 阅读 · 0 评论 -
[Android]通过‘avc denied‘日志信息添加SELinux规则
[Android]通过’avc denied’日志信息添加SELinux规则前言本文仅讨论如果通过’avc denied’日志信息,确定缺失的SELinux规则。暂不讨论:添加的SELinux规则是否存在权限放大;添加的SELinux规则是否触犯neverallow;(有时间再补上这两部分,挖坑+1…)背景最近在跑CTS,有些Fail项与SELinux有关,这里举个例子:cts-tf > run cts -m CtsNetTestCases -t android.net.ipv6原创 2021-12-28 17:45:23 · 3258 阅读 · 0 评论 -
[Android][ASM]指令注入入门(一)—— services.core.unboosted与services.core.priorityboosted
[Android][ASM]代码注入入门(一)—— 从services.jar开始说起前言以AOSP android-9.0.0_r46分支为例,这个模块改动不大,理论上适用于后续版本,但不保证;从实战入手,必要时讨论实现原理,适合直接上手实操,不适合系统学习;起因熟悉services.jar编译步骤的人应该都知道,services.jar编译实际上是静态引入多个jar包而成的:而services.core又是通过静态引入services.core.unboosted.jar而成的:对原创 2021-11-15 14:39:39 · 3332 阅读 · 0 评论 -
[SQLite]浅析其二——SQLite数据库的日志
文章目录SQLite数据库的日志日志的分类传统日志模式读取数据流程写入数据流程日志回滚流程WAL日志模式读取数据流程写入数据流程异常恢复流程SQLite数据库的日志SQLite数据存储是孤本数据,在写入时异常中断(断电,坏块等),会导致数据库文件结构损坏,造成数据丢失。因此日志的存在就非常必要,在官网的介绍中指出,SQLite支持通过PRAGMA journal_mode=?的形式设置日志模式,而当前支持的日志模式有如下几种:DELETETRUNCATEPERSISTMEMORYWALO原创 2021-09-17 13:58:03 · 6160 阅读 · 1 评论 -
[SQLite]浅析其一——SQLite数据库简介
SQLite数据库简述1.1. 介绍节选并翻译自官网介绍:SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。其代码完全开源,可供个人或商业完全免费使用。SQLite是一个嵌入式的SQL数据库引擎。与大部分SQL服务器不同,SQLite不存在单独的服务端进程,所有读写都是直接操作磁盘上的一个db文件;SQLite保存的数据库文件可跨平台使用——无论是32位/64位系统,还是大端/小端架构;SQLite并不是为了替代Oracle而生,而是为了替代fop原创 2021-09-17 10:38:40 · 1704 阅读 · 0 评论 -
[踩坑][Android]代码混淆引发的连环惨案
背景老规矩,先交代背景。现状是这样:wifi-ext-service.jar是我们开发的wifi的扩展接口的实现;wifi-service.jar与wifi-ext-service.jar均在编译时将代码混淆;wifi-ext-service.jar依赖wifi-service.jar;AOSP原生编译规则中,wifi-service.jar会静态依赖android.hardware.wifi-V1.0-java;一切都相安无事,直到现在有个开发需求,需要wifi-ext-service.原创 2021-08-20 16:03:44 · 663 阅读 · 0 评论 -
[Android]Android P(9) WIFI学习笔记 - HAL (2)
目录前文回顾前言入口WifiNativeIWifiChipIWifiCond`IWificond.disableSupplicant()``IWificond.tearDownInterfaces()`小结下一步计划:前文回顾WIFI学习笔记 - Framework (1)WIFI学习笔记 - Framework (2)WIFI学习笔记 - HAL (1)前言基于Android P源码学习;代码片为了方便阅读段经过删、裁减,请以实际源码为准;本篇旨在补全WIFI学习笔记 - HAL原创 2021-07-20 14:13:12 · 1271 阅读 · 0 评论 -
[Android]Android P(9) WIFI学习笔记 - HAL (1)
目录前文回顾前言入口WifiNative初始化打开WIFIIWifiChip前文回顾WIFI学习笔记 - Framework (1)WIFI学习笔记 - Framework (2)前言基于Android P源码学习;代码片为了方便阅读段经过删、裁减,请以实际源码为准;入口根据前两篇的分析结果,调用栈都汇聚到了WifiNative:打开Wifi:mWifiNative.setupInterfaceForClientMode(false, mWifiNativeInterfaceCa原创 2021-07-19 11:08:53 · 4499 阅读 · 4 评论 -
[Android][dnsmasq]从一个bug入门dnsmasq的IP地址分配逻辑
背景今天接到做WIFI以后的第一个问题分析,现象如下:复现步骤:机器连接某个特定WIFI (办公场所提供,无法登陆后台确认设置信息)机器再打开热点(即桥接模式)手机连接热点期望结果:手机可以正常连接实际结果:手机无法连接,始终停留在“正在获取IP地址”;这个问题比较“神奇”的地方在于:只有当机器连接某个特定WIFI时出现问题;连接该特定WIFI时稳定复现;连接其他WIFI时稳定不复现;出于直觉,这个问题很大概率上是这个WIFI设置与机器出现了不兼容的情况;但是仍然原创 2021-07-16 17:10:38 · 2843 阅读 · 6 评论 -
[Android][踩坑]libwifi-hal是如何兼容平台差异的
背景事情起因是我在学习WIFI Hal部分时,发现一个比较困惑的地方:代码路径:hardware/interfaces/wifi/1.2/default/wifi_legacy_hal.cpp:wifi_error WifiLegacyHal::QcAddInterface(const std::string& iface_name, const std::string& new_ifname,原创 2021-07-12 18:13:56 · 8261 阅读 · 2 评论 -
[Android]StateMachine介绍(三)——进阶
前文回顾[Android]StateMachine介绍(一)——概览[Android]StateMachine介绍(二)——拆解这一篇会进一步介绍一些高级应用场景;State的层级关系State切换时的调用时序根据之前的了解,我们知道在State切入时会调用其enter()方法,在退出时会调用其exit()方法;但是那都是基于评级关系而言的,当State存在层级关系的时候,enter()/exit()的调用时序是否会存在差异呢?为了探究这点,我们先假设有如下State层级关系的状态机:原创 2021-07-05 17:01:37 · 716 阅读 · 1 评论 -
[Android]Android P(9) WIFI学习笔记 - Framework (2)
WIFI学习笔记 - Framework (2)前言更多细节详见上一篇;基于Android P源码学习;代码片为了方便阅读段经过删、裁减,请以实际源码为准;调用栈 - 关闭WIFI与WIFI开启的调用入口一致,只是参数不同:开启:WifiManager.setWifiEnabled(true)关闭:WifiManager.setWifiEnabled(false)因此从App调用到WifiServiceImpl这一部分链路是完全一致的;从WifiController开始,两者执原创 2021-06-28 18:01:57 · 718 阅读 · 3 评论 -
[Android]Android P(9) WIFI学习笔记 - Framework (1)
WIFI学习笔记Framework初始化流程SystemServer在调用到startOtherServices时,会通过mSystemServiceManager.startService(WIFI_SERVICE_CLASS);启动WIFI的SystemService,对应类为:com.android.server.wifi.WifiService构造WifiService时会同时构造出WifiServiceImpl: public WifiService(Contex原创 2021-06-25 17:36:05 · 914 阅读 · 2 评论 -
[Android]StateMachine介绍(二)——拆解
在上一篇中,我简单介绍了一下StateMachine的工作原理,并尝试用示意图的方式描述其运行机制。这一篇会从源码入手,对StateMachine进行一个详细的拆解;注意,如下所有代码片段均非源代码直接截取,而是经过了各种删减的,删减部分包括但不限于日志输出部分、不影响代码逻辑分析的分支判断等;同时,为了方便阅读、理解,对原有的英文注释也进行了删减,并添加了部分中文的,基于个人的理解;因此请勿直接使用;类与内部类State首先需要介绍一下State这个类;前面提到,StateMachine是处理原创 2021-06-20 18:06:07 · 519 阅读 · 2 评论 -
[Android]StateMachine介绍(一)——概览
StateMachine介绍StateMachine,中文名状态机。顾名思义,是用于记录、切换状态的。除此之外,StateMachine还可以通过预定义执行的方法,使其在状态切换开始前、过程中、结束后分别执行不同的逻辑;接下来就对StateMachine进行一个简单的拆解;注意,如下所有代码片段均不是源代码截取,而是经过了各种删减的,删减包括但不限于日志输出部分、不影响代码逻辑分析的分支判断等;同时,为了方便阅读、理解,对原有的英文注释也进行了删减,并添加了部分中文的,基于个人的理解;因此请勿直接使原创 2021-06-19 23:29:36 · 745 阅读 · 2 评论 -
关于AndroBench在Android 10以后性能衰减的问题分析
关于AndroBench在Android 10以后性能衰减的问题分析背景自Android 10发布以来,由于Google默认禁用了在Android P时引入的Compatibility WAL,加之AndroBench这一应用在代码层面存在于Android SQLite API不兼容的情况,导致Android 10以后的AndroBench SQLite部分跑分出现大幅下滑;通过反编译AndroBench,我们得知,主要原因在于AndroBench没有使用Android framework API (原创 2021-05-19 15:02:57 · 2242 阅读 · 2 评论 -
[Android][踩坑]Android Studio导入framework.jar的各种坑
[Android][踩坑]Android Studio导入framework.jar的各种坑前言需求是这样的,我在基于system_server的源码开发一个功能,涉及了20多个类的增加。因此纯文本编辑器显然不是一个很好的选择。而配置像VS Code插件之类的事情又比较麻烦。因此导入到Android Studio中进行开发,并打包成jar包放回源码中参与编译显然是比较好的选择了。熟不知,这里面坑不少,本文主要就是记录一下自己的踩坑历程,同时给有需要的同仁一些参考,顺便吐槽下现在能在网上搜到的方案都千篇一原创 2021-04-28 17:57:58 · 13999 阅读 · 27 评论 -
[Andoid][踩坑]CTS 11_r3开始出现的testBootClassPathAndSystemServerClasspath_nonDuplicateClasses FAIL问题分析
[Andoid][踩坑]CTS 11_r3开始出现的testBootClassPathAndSystemServerClasspath_nonDuplicateClasses FAIL问题分析问题背景从CTS测试结果可以清晰看到导致FAIL的类;这个类是我自己加的,为了在Installd与system_server之间注册回调使用;由于项目进度紧张,最初报出该问题的项目采用了代码回退的方式,保证CTS测试结果正常;在通过将近2天的分析中,逐步把该问题的原因以及解决方案理清,现总结如下:问题发生原因原创 2021-03-30 19:37:39 · 2586 阅读 · 3 评论 -
[AOSP][Android]查看某个模块编译原始指令
AOSP(或CAF等基于AOSP的二次分发)现在都使用ninja进行编译指令管理与执行;这里暂不讨论与make的优劣,只想记录以下如何找到某个模块的原始编译指令;1. 生成ninja文件首先需要生成ninja文件,一般会推荐进行全编译,但是实际上在make初期就生成了完整的ninja文件,因此我们只需执行如下几步即可;source build/envsetup.shlunch xxx或choosecombo xxxmake nothingmake nothing顾名思义,啥都不会m原创 2021-03-30 10:56:03 · 1392 阅读 · 3 评论