解决AS build中文报错乱码问题
AS界面双击shift键,在输入框中输入:Edit Custom VM Options,回车
显示这个文件不存在,点击create创建即可
在文件中添加:-Dfile.encoding=UTF-8,设置编码
Sync Gradle按钮
重启AS
Kconfig语法
菜单选项1 - config 配置项
config MODVERSIONS
bool "Set version information on all module symbols"
depends MODULES
default y
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
选项的(1)类型,(2)输入提示(input prompt),(3)依赖关系,(4)默认值,(5)帮助信息类型:”bool/tristate/string/hex/int”tristate三态:内建、模块、移除依赖关系:”depends on/requires”depends on与if等价
bool "foo" if BAR
default y if BAR
和
depends on BAR
bool "foo"
default y
depends on BAR
2 - ...
UBIFS相关
Uboot支持添加配置:
#define CONFIG_MTD_PARTITIONS
#define CONFIG_CMD_UBI
#define CONFIG_RBTREE
boot启动参数设置:
setenv bootargs 'console=0,115200 mem=64M phy_mode=rmii rootwait=1 rw ubi.mtd=4 ubi.mtd=5 rootfstype=ubifs root=ubi0:rootfs'
可在命令行参数中增加多个ubi设备,如ubi.mtd=2,ubi.mtd=1,这样传递后,内核启动后会做attach的操作,attach之后,/dev/下就建立好设备
Kernel支持Kernel> make menuconfig
File systems
---> [*] Miscellaneous filesystems
---> <*> UBIFS file system support
UBIFS制作 ...
Tmux使用
Tmux:终端复用器(terminal multiplexer)
安装sudo apt-get install tmux
启动tmux
退出按下Ctrl+d或者显式输入exit命令
前缀键认的前缀键是Ctrl+b快捷键都是通过前缀键唤起
会话
新建会话:tmux new -s <session-name>
分离会话按下Ctrl+b d或者输入tmux detach命令上面命令执行后,就会退出当前 Tmux 窗口,但是会话和里面的进程仍然在后台运行。tmux ls命令可以查看当前所有的 Tmux 会话
接入会话用于重新接入某个已存在的会话tmux attach -t <session-name>
杀死会话tmux kill-session -t <session-name>
切换会话tmux switch -t <session-name>
窗格
划分窗格
# 划分上下两个窗格
$ tmux split-window
# 划分左右两个窗格
$ tmux split-window -h
快捷键:划分上下: ctrl+b ...
Ubuntu之运行Shell报错1
背景在docker一个Ubuntu(16.04)的容器里,运行一个以前用过的Shell脚本,报错:
syntax error: unexpected “(“以前都运行的好好的,这就奇了怪了,而且更奇怪的是报错的地方是function这行:
function make_mvapp()
{
...
}
解决搜索一把,发现很多一样的情况
查看Shell版本ls -l /bin/sh
lrwxrwxrwx 1 root root 9 2月 12 2019 /bin/sh -> dash
发现sh指向的是dash!因为Ubuntu/Debian为了加快开机速度,用dash代替了传统的bash
解决:重新配置dashsudo dpkg-reconfigure dash
提示是否为系统默认shell的时候选择no重新再查看Shell版本,OK重新运行脚本,OK
参考https://www.jianshu.com/p/63c07b049c25
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 ...