Android源码编译相关
Android源码编译相关Android源码国内镜像:https://lug.ustc.edu.cn/wiki/mirrors/help/aosp
编译环境配置:一般在Ubuntu 64位(18.04等)下面编译安装必要的软件包及OpenJDK:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev lib32z1 x11proto-core-dev libx11-dev lib32readline6-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc
编译源码每个芯片平台可能略有差异
source build/envsetup.sh
lunch #32
make update-api
make -j4
make aboot -j4
mak ...
Android网络设置
Android网络设置路由操作android4.4之前的版本,只使用了一份路由表,可以通过route命令操作Android5.0之后,考虑要对多网络的支持,采用了多路由表,网络的功能实现完全转移到netd上面,主要包括ip,路由配置,dns代理设置,带宽控制和流量统计等
3 种路由类型主机路由主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。例如,在下面的示例中,本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机。
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ------ --- --- -----
10.0.0.10 192.168.1.1 255.255.255.255 UH 0 0 0 eth0
网络路由网络路由是代表 ...
RK3399-auto_generator支持armv8
RK3399-auto_generator支持armv8背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
RK3399 auto_generator脚本支持armv8:
#!/usr/bin/env python
import sys
import os
import re
import zipfile
import shutil
templet = """include $(CLEAR_VARS)
LOCAL_MODULE := %s
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/%s
LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_DEX_PREOPT := false
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX : ...
swap相关概念
swap相关概念zram内核文档:Documentation/admin-guide/blockdev/zram.rst
zram: Compressed RAM based block devicesThe zram module creates RAM based block devices named /dev/zram( = 0, 1, …). Pages written to these disks are compressed and storedin memory itself. These disks allow very fast I/O and compression providesgood amounts of memory savings. Some of the usecases include /tmp storage,use as swap disks, various caches under /var and maybe many more :)
Statistics for individual zram devices are exported ...
蓝牙耳机音量控制问题
蓝牙耳机音量控制问题背景之前测试提了一个蓝牙音量相关的BUG: 调节蓝牙耳机音量,系统音量不跟随变化,即耳机音量没有和系统音量同步;
虽然知道是绝对音量的问题,但不太清楚整个具体流程,特此记录下
分析与解决音量调节的流程音量调节的整个流程:
蓝牙
OS(数字音量)<-- --> 蓝牙耳机(数字音量+模拟音量)
在使用蓝牙耳机时,
调节OS上的音量当调节OS上的音量时, 其调节的是数字音量,即调整了蓝牙传输的数字音频数据增益,从而使耳机听起来的音量有所变化
调节蓝牙耳机上的音量当调节蓝牙耳机上的音量时,一般是直接调节蓝牙芯片的数字音量,使DAC出来的音量发生变化,所以这种情况下一般不会对OS的音量有所影响。
蓝牙的绝对音量如果在调节蓝牙耳机上的音量时,需要将耳机音量同步给OS系统该怎么办呢? 也是可以做的,蓝牙协议已经帮忙考虑到这一点了,即设置蓝牙的绝对音量,需要走AVRCP协议,并且主机和蓝牙耳机都要支持该协议
具体流程见下图:
首先,主机(OS)需向耳机注册音量变化的通知事件
耳机回复临时的响应
当用户调节耳机音量时,就会有音量变化的事件上报给 ...
一个静态全局变量初始化引发的讨论
一个静态全局变量初始化引发的讨论背景最近在提交的一个补丁,引发了一个静态全局变量初始化的讨论, 主要还是理论基础不够扎实,特此记录
具体的情况是这样的:在一个补丁中,我定义了一个静态的全局变量,来存储启动参数传过来的值。开始补丁中的这部分是这样的:
static bool alc269_restore_verbs = false;
但使用补丁检查工具检查时,报如下的错误:
./scripts/checkpatch.pl 0001-xxx.patch
ERROR: do not initialise statics to false
后面就在提交补丁的时候,把这个初值去掉了,然后在群里引起了一阵讨论。
通过网上查了查,和大家的讨论, 去掉初值主要是基于以下原因:静态全局变量会默认初始化为0,如果初值为0就没必要进行初始化,是多此一举。
在C语音编译的时候,已初始化的全局变量就保存在.data段中,未初始化的全局变量保存在.bss段中。
BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会 ...
内核模块参数
内核模块参数背景接上一篇 内核启动参数cmdline
上一篇主要讨论了不是模块的情况下,内核启动参数的传递解析过程及使用:early_param()和__setup(),这篇主要讨论下模块的情况
相关内核文档:Documentation/admin-guide/kernel-parameters.rst等
内核模块添加参数module_param(参数名, 参数类型, 0644);
MODULE_PARM_DESC(参数名, "参数说明.");
内核模块参数使用分3种方式:
内核启动cmdline模块名.参数=xxx
模块加载cmdlinemodprobe 模块名 参数=xxx
动态修改/ sys / module / <模块名> / parameters/参数
例如:
(kernel command line) usbcore.blinkenlights=1
(modprobe command line) modprobe usbcore blinkenlights=1
内核模块定义和解析过程定义下面是module_param定义(include/ ...
记一次UAC无法使用的bug
记一次UAC无法使用的bug现象最近遇到一个BUG,一个USB摄像头自带的MIC没法在Linux下使用。记录下UAC相关排查过程
分析查看驱动加载及节点使用lsusb可以看到,该UAC的设备已经加载对应通用驱动snd-usb-audio:
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 1: Dev 6, If 0, Class=Mass Storage, Driver=usb-storage, 480M
|__ Port 2: Dev 8, If 0, Class= ...
Kernel之模块版本检查
Kernel之模块版本检查背景通过insmod或modprobe加载核外驱动ko时,特别是第三方驱动,经常会遇到模块版本检查报错,类似:
version magic '5.4.96-xx SMP preempt mod_unload aarch64' should be '5.4.96-yy SMP preempt mod_unload aarch64'
那我们就来看看模块版本检查的大致过程
Kernel: v5.4.96vermagic: version magic
过程分析内核相关源码:kernel/module.c逻辑过程比较简单check_modinfo() -> same_magic()check_modinfo() 函数首先获取模块相关的modinfo,即modmagic,然后会和内核的vermagic做对比,即same_magic()函数
可以通过cat /proc/version 来查看linux 系统的 vermagic ,对于module, 可以通过modinfo xxx 的方式来查看module的 vermagic
che ...
Kernel之MODVERSION
Kernel之MODVERSION官方说明关于modversion,内核文档官方解释(Documentation/kbuild/modules.rst):
6 Module Versioning Module versioning is enabled by the CONFIG_MODVERSIONS tag, and is used as a simple ABI consistency check. A CRC value of the full prototype for an exported symbol is created. When a module is loaded/used, the CRC values contained in the kernel are compared with similar values in the module; if they are not equal, the kernel refuses to load the module.
Module.symvers contains a list of all export ...
Kernel之vermagic
Kernel之vermagic内核的vermagic内核的vermagic类似于:5.4.96-xx SMP preempt mod_unload aarch64
内核的vermagic即为VERMAGIC_STRING``(include/linux/vermagic.h)
static const char vermagic[] = VERMAGIC_STRING;
/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#elif defined(CONFIG_PREEMPT_RT)
#define MODULE_VERMAGIC_PREEMPT "preempt_rt "
#else
#define MODULE_VER ...
科普贴--电源管理的几种状态
科普贴–电源管理的几种状态G状态针对系统整个平台来定义,肉眼可以识别。我们根据吃电量大小,软件是否工作,外部事件触发到工作状态的延时时间,拆机是否安全等来判断系统处于哪种状态
G0:工作状态,操作系统分发用户线程并执行。在此状态中,外围设备吃电量可以改变。
G1:显示器关闭,用户态线程不再执行。系统状态S1,S3,S4均属G1状态。返回G0状态用时比G2短。
G2:关机状态,硬件不会保存软件环境,需要较长时间才能返回到工作状态。此状态也称为soft off。
G3:也称Mechanicaloff,除RTC电开启外,再无其它电,此种状态下,我们拆机不会有短路风险
S状态系统状态,这种状态是针对OS所定义。G状态中除了G3,其余G0,G1和G2分别有相应的状态与之相对应。S状态的判定:可根据平台吃电量大小,系统返回工作状态的延时时间来判定。
S0:工作状态,和G0相同。
S1:CPU时钟信号被停止,CPU有较低的功耗,返回到S0的时间较短。
S3:即我们常说的睡眠状态。此状态下,系统环境保存在内存里面。设备带电方面:只有内存VCC保留,其余设备全部关闭。时钟方面:只有RTC时钟依然有 ...