搭建Git服务器
背景
Platform: X64
OS: Ubuntu16.04 Desktop
搭建
安装git:$ sudo apt-get install git
创建一个git用户,用来运行git服务:$ sudo adduser git
创建证书登录:收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:$ sudo git init --bare sample.gitGit就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:$ sudo chown -R git:git sample.git
禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面 ...
在Android的C和C++层打印log
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
在Android的C/C++层打印log不使用TAG
添加头文件#include <utils/Log.h>D
在需要的地方使用ALOGE、ALOGI或ALOGD,例如ALOGE("log");使用TAG方法如下:在需打印的C/C++文件中添加#define LOG_TAG "JNI_DEBUG"
#include <android/log.h>
#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,## __VA_ARGS__)
#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, ## __VA_ARGS__)
#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, ## __VA_ARGS__)
fun()
...
RK3399预置APK及问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
正常流程按照官方文档,步骤如下:
在device/rockchip/rk3399/xxx/目录下新建preinstall_del、preinstall_del_forever或preinstall文件夹。
preinstall_del:可卸载预装,恢复出厂后应用会恢复
preinstall_del_forever:可卸载预装,恢复出厂后应用不会恢复
preinstall:不可卸载预装
拷贝预安装的APK到上述新建的文件夹中,注意文件名尽量使用英文,避免空格
编译。auto_generator.py会在编译过程中,将拷贝的apk解包,自动生成编译mk文件。编译完之后预置的APK会拷贝到system固件中,烧录后,系统启动的时候会自动安装到data/app目录中(通过PackageManager)
注:预置的 APK 应用需要得到对应厂商授权
附auto_generator.py源码:
#!/usr/bin/env python
import sys
import os
i ...
Ubuntu16.04网络配置
背景
Platform: X64
OS: Ubuntu16.04 Desktop
过程以前在嵌入式Linux中,一直是通过/etc/network/interfaces来配置静态IP。在Ubuntu的Desktop版本一直使用图形界面配置的静态IP。这次没接显示器,想通过命令行来配置,然后cat /etc/network/interfaces,发现不对,以前配置的静态IP根本不在里面,里面只有Loopback:
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
后面发现Ubuntu16.04的Desktop版本里,图形界面配置是通过第三方网络管理工具NetworkManager进行配置的。也可以通过interfaces进行配置,但是两者不能同时配置,会冲突出现一些莫名其妙的问题。
其实,只要弄清楚interfaces和 nm之间的关系,这些问题就不难解释了。首先,当系统内没有第三方网络管理工具(比如nm)时,系统默认使用nterfaces文件内的参数进行网络配置 ...
Android重采样与频响
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题Android项目产品频响测试不达标,22.05K的采样率,频响只有7.5kHz左右。
分析这是android系统著名的src问题,当播放或者录音的采样率与底层硬件设置的采样率不一致系统就会重采样。Android系统为了统一不同的音轨,底层硬件设置的采样率一般都是固定的44.1k或是48k。重采样的算法,特别是非整数倍SRC,会对频响有一定的影响,线性插值效果最差,而Android默认的重采样质量使用的是DYN_LOW_QUALITY,其采用的重采样算法就是线性插值,但使用sinc等高质量的算法,CPU Load就会更高。见参考[3]
AudioMixer::track_t::setResampler:
///frameworks/av/services/audioflinger/AudioMixer.c
if (trackSampleRate != devSampleRate || resam ...
Android音量控制
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
系统输出音量总输出音量 = Android系统软件音量 * 音频Codec硬件音量****音频Codec硬件音量 = 音频Codec-DAC音量(数字音量) * 音频Codec-通道音量(AP模拟音量)Android系统音量(数字音量) = stream Volume * master Volume * track Volume注:stream 音量: 系统控制音量等级,系统针对不同的stream type和不同输出device,有不同的音量level,韦伯定律(可展开,心理,情侣买礼物,金融等,)Track volume: 通过AudioTrack.setVolume来设置,取值为0~1.0master Volume: 音效
Android音量计算流程注:这里所说的音量是上面所说的stream Volume流音量整个流程即是数字音量增益调节的流程,纯数字实现,与底层音频codec无关.整个流程大致分为以下2大步
AudioPolicyManager::checkAndSetV ...
Android网络广播和本地播放输出不一致的问题
背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
问题现象:相同的音频文件,最大的音量等级,网络广播音频codec输出的幅度始终比本地播放的小,达不到音频codec理论上的满幅输出(RMS:500mV)。大致数据结果:android音量等级调到最大,网络广播(RMS:250mV), 本地播放(RMS:500mV)。
分析我们APK通过网络接收广播数据,然后用AudioTrack播放,本地播放也是使用相同的接口。x根据Android的音量控制x框架(具体可参考我以前的文章),
总输出音量 = Android系统软件音量 * 音频Codec硬件音量****音频Codec硬件音量 = 音频Codec-DAC音量(数字音量) * 音频Codec-通道音量(AP模拟音量)Android系统音量(数字音量) = stream Volume * master Volume * track Volume
音频codec的硬件音量都是一样的,所以调整track Volume和master Volume音效。
使用audioTrack ...
Android实现su权限的一种方法
背景
Platform: IMX6Q
OS: Android5.1
Kernel: 3.14.52
需求项目需求,有些功能需要root权限,但是以前做的系统没有添加su权限进去,所以就另辟蹊径用了这个办法。
实现底层init启动一个service,主要是实现一个socket服务端,监听客户端发过来的命令,然后执行它。虽然apk与该service在不同的空间,有不同的权限,但底层init启动的service具有root权限
Service服务端实现源代码大致如下#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <cutils/sockets.h>
#include <sys/un.h>
#include <neti ...
Android源码添加自己的可执行程序
背景
Platform: IMX6Q
OS: Android5.1
Kernel: 3.14.52
需求项目需要,需要在external添加自己的一些Service等二进制的可执行程序
实现
新增文件夹xxx,里面添加Android.mk和应用源码文件, Android.mk内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
xxx.cpp \
util.cpp \
#LOCAL_SHARED_LIBRARIES := \
# libcutils \
# liblog \
#LOCAL_LDLIBS :=-llog
LOCAL_MODULE := study
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)
include $(BUILD_EXECUTABLE)
注:TARGET_OUT_EX ...
嵌入式设备PHP版本升级
背景
Platform: IMX6Q
OS: Linux-QT5
Kernel: 4.1.15
需求我们的设备在漏洞扫描中报了很多PHP的漏洞,以前使用的是PHP5,因此需要将PHP升级到最新版本.
PHP交叉编译我使用的是目前最新的版本php-7.3.12, 其他版本可能大同小异
配置./configure --host=arm-poky-linux-gnueabi --prefix=xxx/php-arm --disable-all --enable-session --without-sqlite3 --with-zlib --without-iconv --enable-json --enable-sockets --enable-fileinfo --enable-cli --enable-cgi --enable-fpm --disable-phpdbg --with-config-file-path=/etc
说明:
--enable-session --enable-json --enable-sockets --enable-fileinfo: 因为我们的web ...
Linux矩阵键盘
背景
Platform: M55S
OS: Linux
Kernel: 4
需求:项目需要添加一个类似电话机的那种矩阵键盘,开始打算自己写个扫描算法,后面发现内核自带。
过程matrix-keypad(内核自带驱动): drivers/input/keyboard/
matrix-keypad的GPIO口上拉:Godshand -w -a 0xB3F000B0 -v 0x55555000
注: 这个需要根据自己的硬件平台添加, 这个很重要,可能会导致键值不对或乱码
内核menuconfig添加驱动:DeviceDrivers --->
Inputdevice support --->
<*> Event interface
Keyboards --->
<*> GPIO driven matrix keypad support
DTS配置说明见下面注释,也可查看d ...
报错Syntax error
背景
Platform: M55S
OS: Linux
Kernel: 4
问题我自己编译没问题,同事在他的虚拟机里编译我的代码时报错:
Syntax error: end of file unexpected
主要log如下:
./make_all.sh: 5: ./make_all.sh: source: not found
...
/opt/vtcs_toolchain/vienna/usr/bin/arm-linux-gcc: 2: /opt/vtcs_toolchain/vienna/usr/bin/arm-linux-gcc: Syntax error: end of file unexpected
分析造成Syntax error主要原因有:
脚本语法错误比如没有循环没有结束标记等解决: 检查语法,没有问题
字符格式问题Windows和Linux字符格式问题,win下写的shell脚本可能是DOS格式,在Linux下面会有莫 ...