一、c\c++
1、数组指针及指针数组
数组指针 (*p)[n]:是指针—— 指向数组的指针。
指针数组 *p[n]:是数组—— 装着指针的数组。
(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;
*p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。根据上面两个分析,可以看出,p是什么,则词组的中心词就是什么,即数组“指针”和指针“数组”。
2、sizeof
sizeof 是一个关键字、操作符,也是一个编译时运算符,其作用是返回一个对象或者类型所占的内存字节数。
sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小
sizeof计算对象的大小实际上是转换成对象类型进行计算,也就是说,同种类型的不同对象其sizeof值都是一致的。指针记录了一个对象的地址。指针变量的位宽等于机器字长,机器字长由CPU寄存器位数决定。在32位系统中,一个指针变量的返回值为4字节,64位系统中指针变量的sizeof结果为8字节。当sizeof作用于数组时,求取的是数组所有元素所占用的大小
int A[3][5]; // 二维数组; cout<<sizeof(A)<<endl; // 输出60 = 4 * 3 * 5
char c[] = "123456"; // 字符串; cout<<sizeof(c)<<endl; // 输出7 = 6 + 1 ('\0'),字符串以'\0'结束。
对于sizeof()
,strPtr 是指针 (4)
,strs 是字符数组(包括末尾符号’\0’)(6)
,str 是string类型变量(24)
。
而strlen(char *)
则是直接返回实际字符串的字符个数(5)
。
strlen函数:计算的是字符串str的长度,从字符的首地址开始遍历,以 '\0' 为结束标志,然后将计算的长度返回,计算的长度并不包含'\0'。
3、编译流程
实际上从源程序文件到可执行代码经历了四个阶段:预处理、编译、汇编和链接
预编译过程主要处理那些源代码文件中的以“#”开始的预编译指令,包括宏定义指令、条件编译指令和头文件包含指令。 经过预编译得到的 .i 文本文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字,如:main, if , else , for , while , { , } , + , - , * , \ 等等,编译器gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言接下来进入编译阶段。经过优化得到的汇编代码必须经过汇编过程转换成相应的二进制机器指令,方可能被机器执行。汇编阶段是把编译阶段生成的汇编语言代码翻译成二进制目标代码(也就是二进制机器指令)。
4、字符串
5、链表
6、宏
二、安卓
1、.mk文件
.mk文件是Android NDK中的一个重要文件,用于构建和编译C/C++代码。它包含了构建和编译所需的规则和指令
-
写法规则:
- .mk文件是一个文本文件,可以使用任何文本编辑器进行编辑。
- .mk文件的语法是Makefile语法,它由一系列的规则和指令组成。
- 每个规则由一个目标和一组依赖项组成,用冒号分隔。
- 每个规则的指令在目标和依赖项之后,以Tab键开头。
- 可以使用变量来简化.mk文件的编写,变量以$开头,例如$(LOCAL_PATH)表示当前.mk文件所在的路径。
-
编译中的步骤和文件路径:
- .mk文件通常用于构建和编译C/C++代码,它在编译过程中处于非常重要的位置。
- 在Android项目中,通常有一个名为Android.mk的主.mk文件,它位于项目的根目录下。
- Android.mk文件定义了整个项目的编译规则和指令,包括源文件的路径、编译选项、链接选项等。
- 在编译过程中,Android.mk文件会被自动调用,并根据其中的规则和指令来进行编译和链接操作。
- 具体的编译步骤和文件路径会根据项目的结构和.mk文件的配置而有所不同,可以在.mk文件中定义源文件的路径、编译选项、链接选项等
-
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 定义源文件的路径
LOCAL_SRC_FILES := \
src/file1.c \
src/file2.c# 定义编译选项
LOCAL_CFLAGS := -Wall -O2# 定义链接选项
LOCAL_LDFLAGS := -llog# 定义目标文件名
LOCAL_MODULE := mymoduleinclude $(BUILD_SHARED_LIBRARY)
2、安卓软件架构,代码位置
Android 操作系统架构_android操作系统的架构-CSDN博客
Android系统架构与系统源码目录_易安卓源码大全-CSDN博客
http://androidxref.com/9.0.0_r3/xref/
development | 应用程序开发相关 |
device | 设备相关配置 |
docs | 参考文档目录 |
external | 开源模组相关文件 |
frameworks | 应用程序框架,Android系统核心部分,由Java和C++编写 |
hardware | 主要是硬件抽象层的代码 |
packages目录 | 描述 |
---|---|
apps | 核心应用程序 |
experimental | 第三方应用程序 |
inputmethods | 输入法目录 |
providers | 内容提供者目录 |
screensavers | 屏幕保护 |
services | 通信服务 |
3、四大组件及生命周期
Android四大组件详解_android四大组件是什么-CSDN博客
Android 开发的四大组件分别是:
活动(activity),用于表现功能;
服务(service),后台运行服务,不提供界面呈现;
广播接受者 (Broadcast Receive),勇于接收广播;
内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。
activity的七个方法 onCreate()、onStart()、onResume() 、onRestat() 、onPause()、onStop()、onDestroy()
service的启动方式:··startService(启动);··bindService(绑定服务)
startService()与bindService()区别:startService只是启动Service,启动它的组件(如Activity)和Service并没有关联,只有当Service调用stopSelf或者其他组件调用stopService服务才会终止。
bindService方法启动Service,其他组件可以通过回调获取Service的代理对象和Service交互,而这两方也进行了绑定,当启动方销毁时,Service也会自动进行unBind操作,当发现所有绑定都进行了unBind时才会销毁Service。
开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。
三、WiFi
1、WiFi打开、扫描、连接流程
打开流程
Android WiFi 开启流程(基于Android S)_android 打开wifi-CSDN博客
WifiManager.setWifiEnabled(true) -> WifiServiceImpl.enable(pkgName, true) -> setWifiEnabledInternal(packageName, enable, callingUid, callingPid, isPrivileged)
WifiNative.startHal() -> WifiVendorHal.startVendorHal() -> HalDeviceManager.start() -> HalDeviceManager.startWifi()其中
startWifi()方法其实主要就两行代码
// 通过hal接口启动
WifiStatus status = mWifi.start();
// 获取chip info
WifiChipInfo[] wifiChipInfos = getAllChipInfo();
IWifi.Start() hardware/interface/wifi1.6/default/wifi.cpp
- 通过wifi_mode_controller加载驱动
- 初始化所有的HAL接口(legacy_hal_factory_->getHals())
- initVendorHalDescriptorFromLinked
- initVendorHalsDescriptorList
扫描流程
Android 12 WIFI扫描流程_android12 wificondscannerimpl: filtering out 2 sca-CSDN博客
Android13 Wifi Scan流程梳理_android 扫描wifi-CSDN博客
packages/modules/Wifi/service/java/com/android/server/wifi/ConcreteClientModeManager.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ActiveModeWarden.java
packages/modules/Wifi/service/java/com/android/server/wifi/ScanRequestProxy.java
packages/modules/Wifi/framework/java/android/net/wifi/WifiScanner.java
packages/modules/Wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
packages/modules/Wifi/framework/java/android/net/wifi/WifiManager.java
packages/modules/Wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
packages/modules/Wifi/service/java/com/android/server/wifi/ScanRequestProxy.java
packages/modules/Wifi/service/java/com/android/server/wifi/scanner/WifiScannerImpl.java
modules/Wifi/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java
packages/modules/Wifi/service/java/com/android/server/wifi/WifiNative.java
frameworks/base/wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java
2、WiFi打不开问题解答
3、WiF连接类问题解答
连接是否正常,linkspeed 重传率、丢包率 。关键词:wificlientmodelmpl:L2connectedState
看网络侧RTT ,发数据到对方接受数据时间+接收方确认到数据的时间
wlan助理分数:wn-s (oppo的)
驱动状态,收发包情况 TX/RX
DHCP概述:STA加入一个ap,动态分配一个ip地址。
流程图:
WiFi断开问题
在ASSOCIATING阶段丢包导致的AssocReject
4次握手由于密码错误、丢帧、信号弱导致WRONG_KEY
4次握手成功但DHCP Failure ,DHCH Failure count =0
被ap踢出,需要sniffer log
ROAM,漫游在FIRMWARE 层发生的
4、WiFi扫描类问题解答
5、WiFi P2P问题解答
主要为投屏问题
p2p流程:P2P Device Discovery 流程 分为两个阶段
Scan Phase:扫描阶段
Find Phase:找寻阶段 分为两个状态 Search state (1、6、11信道)、Listen state (100to的整数值)
GO协商 确认谁做GO 即做AP .过程中有三个帧(GO Rep、GO Resp、GO Confirm)(Action帧)
分析问题思路:
连接失败:P2P失败,一般在Group-Formation 确认gointent 。RTSP失败,m1-m4阶段
异常断开:基于802.11协议和驱动异常,分析是否环境或距离
花屏、黑屏:链路质量问题,tcpdump转流查看编码是否正常 来确认对端是否正常,屏蔽房测试,p2p吞吐量测试。
6、WiFi报文、协议、基础
7、功耗类问题
查看关机漏电流、飞行待机电流是否正常
确认场景,为单一场景或复合场景
抓log
确认是否持锁 wakelock
DHCP是否频繁续租
查看wireshark是否有大量数据包发送