Android之APK预装
应用安装的目录
/system/priv-app该路径存放一些系统底层的应用,比如Setting,systemUI等。该目录中的app拥有较高的系统权限,而且如果要使用android:protectionLevel=signatureOrSystem,那么该app必须放到priv-app目录中去。
/system/app该目录中存放的系统app权限相对较低,而且当拥有root权限时,就有可能卸载掉这些app。
/vendor/app该目录存放vendor厂商的app
/oem/app该目录中存放oem特有的app。
/data/app用户安装的第三方app
PMS启动的时候,也是按照上述顺序逐个扫描解析这些目录中的apk的
Android标准的APK预装
在 packages/apps新建文件夹,如XXX
添加编译内容,新建并配置编译文件Android.mk,分2种情况
带源码
将Source code拷贝到XXX文件夹下,仅保留必要的目录,删除不必要的目录
创建Android.mk文件,可参考其他工程添加内容,根据自己工程的需要添加必要的编译条件:LOCAL_P ...
MIPI-DSI之DCS相关
概念MIPI DCS: MIPI Display Command Set
DCS读取多个字节DCS读取多个字节,需先通过MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE(0x37)设置要读取的最大字节数
//...
ret = mipi_dsi_set_maximum_return_packet_size(state, 2);
if (ret) {
printf("mipi_dsi_set_maximum_return_packet_size ,error=%d!!\n", ret);
return ret;
}
ret = mipi_dsi_dcs_read(state, 0x04, &dwin_id[0], sizeof(dwin_id));
if (ret <= 0) {
printf("mipi_dsi_dcs_read ID[04h] ,error=%d!!\n", ret);
return ret;
}
printf("mipi_dsi_dcs_read ID[04h]=%x, ...
由F2FS引发的血案
背景基于RK3399开发的Android7.1.2批测时,频繁上下电测试,发现大概率出现启动进入recovery模式,而且一旦进recovery模式以后,每次上电都会进,不会进系统,只有在recovery模式下进行双清操作后,才能正常进入系统。从log分析是flash文件损坏或丢失,主要表现为一些配置文件读取失败或创建失败,服务启动失败。
对比data分区的文件系统类型,新的SDK默认为EXT4,现在用的老的版本还是F2FS修改data分区的文件系统类型为EXT4后, 测试无异常。
从 F2FS 文件系统切到 EXT4 需要格式化 data 分区,会导致 data 分区数据全部清空F2FS相对于以前使用的 EXT4 而言,随机读写的效率会优于 EXT4。但是另外一方面,EXT4 使用的范围更广,经历的时间考验也更久,稳定性这块我们认为可能会优于 F2FS,所以对于行业客户而言,如果更注重文件系统的稳定性,建议使用 EXT4
修改data分区的文件系统类型:
首先确认是否有使用强制加密功能,即 BUILD_WITH_FORCEENCRYPT 这个宏是否有使能,SDK 默认为使能状态, ...
shc在嵌入式Linux上的使用
shell脚本转成二进制可执行程序:gzexegzexe命令即可隐藏shell源码,它不但加密,同时压缩文件
gzexe xxx.sh
生成加密后的脚本xxx.sh和shell备份源码xxx.sh~缺点: gzexe可以直接转换明文。
gzexe -d xxx.sh
shc通过shc加密后一般来说是安全的, 不过可以使用gdb和其它的调试工具获得最初的源代码. 如果你需要更加安全的方法, 可以考虑使用wzshSDK.另外, shc还可以设置脚本的运行期限和自定义返回信息:
shc -e 11/23/2027 -m "xxx." -f xxx.sh
-e表示脚本将在2027年11月23日前失效, 并根据-m定义的信息返回给终端用户
shc编译
下载源码:http://www.datsi.fi.upm.es/~frosal/(官方), 也可以在github上搜索下载
./configure 配置生成Makefile
修改src下面Makefile:根据使用场景修改CC和CPP,如果是嵌入式,则修改为对应的交叉编译链;如果是PC,则不需要修改
mak ...
Alsa-lib操作
controlsint ctl_val(snd_ctl_t * handle, const char *elem_name, const int *elem_value)
{
snd_ctl_elem_info_t *info;
snd_ctl_elem_id_t *id;
snd_ctl_elem_value_t *value;
snd_ctl_elem_list_t *list;
snd_ctl_elem_type_t type;
unsigned int count, used, idx, info_count;
int err;
long tmp;
long long tmp64;
unsigned char need_set_val=0;
snd_ctl_elem_info_alloca(&info);
snd_ctl_elem_id_alloca(&id);
snd_ctl_elem_value_alloca(&value);
snd ...
解决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 ...