Docker配置Android编译环境
背景
编译目标:32位Android5.1
宿主机:64位-Ubuntu Server 18.04
安装docker及相关操作:详见https://notes.z-dd.online/2021/01/13/Docker%E7%9B%B8%E5%85%B3/创建编译容器:docker run -itd --name=容器名 --restart=always -v ~/ubuntu-share:/home/share ubuntu:16.04 /bin/bash
配置编译环境以下操作都是在容器伪终端进行,即使用docker exec命令进入容器
添加64位系统对32位的支持
检查是否已经支持 dpkg --print-architecture # 若支持,输出 amd64
dpkg --print-foreign-architectures # 若支持,输出 i386
手动开启支持 dpkg --add-architecture i386
安装相关工具、库
系统更新 apt-get update
apt-get dist-upgrade
安装ping、ssh: ...
Android之资源限制ulimit
查看系统用户所有限制值: ulimit -a
首先尝试 ulimit -n 4096 , 确认能正确更改进程的max fd 数目。
后来发现可以很方便的在init.rc/init.xxxx.rc 里面进行设定, 通常设定分成两种,
一种是for all user process, 这种就是针对bootup 时对init process 进行设定(已验证). 比如 on init
......
# Allow up to 32K FDs per process
#setrlimit nofile 32768 32768 #can't work at N, work at P
setrlimit 7 4096 4096 # can work ta N
另外一种就是针对某个process 来进行设定, 这个通常是针对某个 service 进行设定: service camerahalserver /vendor/bin/hw/camerahalserver
class m ...
Android限制AP最大连接数
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
在项目中,因使用的WIFI模块的性能限制,在作为AP热点时候不能带很多台station,所以需要限制AP最大连接数。
解决热点配置文件/data/misc/wifi/hostapd.conf里面带上max_num_sta参数限制最大连接数,但Android原生代码不包含此参数, 该文件最终是由/system/netd/server/SoftapController.cpp生成。
Android7.1路径(Android O会有所不同):/system/netd/server/SoftapController.cpp
添加头文件:
#include <cutils/properties.h> //环境变量操作头文件
添加处理代码:
//start add for sta limit 20200817,
int max_num_sta = 0; //0为不限制
char buf[PROPERTY_VALUE_MAX] = {'\0',} ...
RK3399-新老MIPI屏兼容问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
项目经常会遇到屏供应商屏幕停产,驱动IC升级等问题,如果产品已经量产或出货,软件上就需要考虑新旧屏幕的兼容问题,避免维护多套软件代码。这里我们遇到了MIPI屏升级驱动IC的情况。
分析主要思路就是初始化屏幕之前,先读取驱动IC的ID,然后通过不同的ID去使用DTS里面的不同初始化参数,也可以通过读取不同的ID来加载不同的DTS。此方式主要适用于兼容的驱动IC之间,除了初始化参数不同之外,其他参数基本相同的情形。
RK3399的MIPI屏采用的是DRM,panel-simple驱动需注意的是uboot和内核里面都需要同步修改。
解决主要路径及文件:
kernel:路径:kernel/drivers/gpu/drm相关文件:panel-simple.c-->drm_mipi_dsi.c->dw-mipi-dsi.c
uboot:路径:u-boot/drivers/video相关文件:rockchip_dsi_panel.c -> rockchip_mipi_ds ...
RK3399支持5G-WiFi热点
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
以前用AP6356s模块,设置WIFI热点的时候有5G频段选项后面发现没有了,在调试AP6256的时候也发现没有,但他们都是支持5G的。
解决最原始的版本是通过判断mWifiManager.isDualBandSupported()和countryCode,来确定是否添加5G频段的选项
mWifiManager.isDualBandSupported(),通过以下配置读取frameworks/base/core/res/res/values/config.xml:<bool translatable="false" name="config_wifi_dual_band_support">true</bool>
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java:publi ...
Linux&Android网络检测相关
背景在一些项目中,有时候需要检测网络的一些状态,这里总结了一些常用的方法。
获取网络配置从配置文件(json文件)获取网络配置,这里使用的是cJson库
static int getNetInfo(char *filename, char *ip, char *gw)
{
FILE *f;
long len;
char *data;
cJSON *root;
cJSON *item;
f=fopen(filename,"rb");
//判断配置文件是否存在,刷机后的第一次是没有配置文件的
if(f == NULL) {
ALOGE("Open Config File[%s] Error!\n", filename);
return -1;
}
fseek(f,0,SEEK_END);
len=ftell(f);
fseek(f,0,SEEK_SET);
data=(char*)malloc(len+1);
fread(data,1,len,f);
fclose(f);
root=cJSON_Parse( ...
C调用Shell脚本
Linux中,在C语言中调用Shell脚本:
带返回返回值,使用管道I/O(popen)static int sys_exec_cmd_buf(char *cmd,char *buf,int size)
{
//ALOGV("sys_exec_cmd_buf %s\n",cmd);
FILE *fp = 0;
if((fp = popen(cmd, "r")) == NULL)
return -1;
//fread(buf,1,size,fp);
if(fgets(buf, size, fp) == NULL)
return -1;
//fclose(fp);
pclose(fp);
return 0;
}
不带返回值,使用systemstatic int sys_exec_cmd_str(const char *cmd)
{
//ALOGV("sys_exec_cmd_str %s\n",cmd);
int ret = 0;
ret = system ...
Machine ID问题
问题背景以前的一个旧产品需要升级SDK,包括loader、uboot、kernel、sdk等。在升级kennel的时候遇到下面一个machine ID的问题:
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x00000778).
Available machine support:
ID (hex) NAME
ffffffff VATICS vienna SoC (Flattened Device Tree)
Please check your kernel config and/or bootloader
解决后面通过修改读取DTB的内存地址解决了,就是下面的0x1400000。CONFIG_BOOTCOMMAND bootcmd
#define CONFIG_BOOTCOMMAND_NET "tftp 0xa00000 zImage;tftp ...
RK3399之开机Logo动画壁纸相关
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
修改Uboot、Kernel开机Logo只需替换kernel/logo.bmp(uboot)和kernel/logo_kernel.bmp
修改Android开机动画蒙版图片动画蒙版图片动画是通过两张图片叠加移动实现动画效果,所以只需修改这2张图片
镂空蒙版图片:(要求背景为黑色,字体中间镂空)frameworks/base/core/res/assets/images/android-logo-mask.png镂空蒙版后面的闪光图片:frameworks/base/core/res/assets/images/android-logo-shine.png
替换后的处理:
#防止源码不编译图片,需更新图片时间戳
$ touch frameworks/base/core/res/assets/images/android-logo-mask.png
#重新编译模块
$ source build/envsetup.sh
$ lunch xxx
$ mmm frameworks/b ...
Android音频声道数据处理
问题:音频声道数据异常分析
分析:1. 检查硬件信号MICBIAS偏置电压:2点多V,正常OK进运放前MIC的信号:OK运放后的信号:OK
2. 检查音频通道切换使用Tinymix查看通道是否OK?: OK
3. 检查数据立体声pcm数据结构Android录音默认录制生成的是pcm文件,假设我们设置采样率为16K,录音类型为AudioFormat.CHANNEL_IN_STEREO(立体声录音),数据类型为AudioFormat.ENCODING_PCM_16BIT。则pcm文件的数据结构大致为2byte左声道、2byte右声道、2byte左声道、2byte右声道
立体声拆分:
private void splitStereoPcm(byte[] data) {
int monoLength = data.length / 2;
byte[] leftData = new byte[monoLength];
byte[] rightData = new byte[monoLength];
for ( ...
Android7.1之WIFI热点问题
背景项目需求,需要在Android应用中打开关闭和配置WIFI热点,开始以为只需要简单地调用几下系统API就可以了,后来发现是个大坑。不同的Android版本操作热点的方式还不一样
Android7.0及以前的版本是通过WifiManager的setWifiApEnabled,具体方式如下:
WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Method method = mWifiManager.getClass().getMethod("setWifiApEnabled",
WifiConfiguration.class, boolean.class);
//反射
method.invoke(mWifiManager, null, false);
在Android7.1及后面的版本,主要是通过ConnectivityManager的startTethering方法来操作的。
而且对于Android7. ...
RK3399之AP模块蓝牙兼容问题
背景项目中,换了一个AP的WIFI/BT模块,AP6356S换成了AP6236。按照RK的WIFI/BT模块兼容框架,把新模块加了进去,简单测试,WIFI的station和ap都没问题,蓝牙a2dp播放没问题,但发现SCO通话模式有问题,一点正常的声音都没有,而且每隔一段时间会有一个很明显的噪声。
后面通过和硬件一起排查,发现新模块(AP6236)在SCO通话模式下,I2S的两边都有时钟输出,即CPU和模块都是master模式。
为什么a2dp模式是正常的呢?AP模块的A2DP模式走的是UART,SCO模式才走I2S接口
解决找到上述原因之后,解决就好办了。修改CPU和模块的模式。
在未修改之前,CPU是master,模块是slave。以前的老模块是OK没问题,但是新模块(AP6236)就是不行,估计是它的固件不支持做slave。首先我只修改CPU的模式,由以前的主改成了从。果然,新模块(AP6236)就OK,但是老模块不行,因为模块这边也是配置的从模式。RK3399这边主要修改DTS配置,修改如下:
bt_sound: bt-sound {
status ...