win10搭建flutter开发环境(Android)
背景
Platform: X64
OS: Win10 Desktop
前期准备
Android Studio安装
Android SDK安装
Git for Windows安装
镜像配置由于国内访问Flutter会有些限制,官方给中国开发者提供了镜像站:https://flutter-io.cn配置镜像:在环境变量中新增添加以下2条
PUB_HOSTED_URL:https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL:https://storage.flutter-io.cn
注:详情可参考官方关于镜像的最新动态(Using Flutter in China)
Flutter SDK 安装下载安装有2种下载方式:
直接下载包 下载地址:https://flutter.cn/docs/development/tools/sdk/releases 解压至你需要安装的目录,不要放在需要特殊权限的地方
git获取 git clone https://github.com/flutter/flutter.git -b stable
执 ...
Win10分区问题
背景
Platform: X64
OS: Win10 Desktop
问题及分析
“Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在EFI系统上,Windows只能安装到GPT磁盘。”
在新买的未装系统的电脑上,容易遇到这个问题。
win10系统的快速启动功能,要求UEFI+GPT格式的硬盘分区。现在新买的电脑默认都是UEFI+GPT,早年的电脑为BIOS(Legace)+MBR,这两者都是一一对应的,如果引导设置为BIOS(Legace)引导,则分区的时候要用MBR分区,同理UEFI引导则用GPT分区。
MBR格式和GPT格式是可以相互转化的,但需注意:此操作都会清空磁盘的所有数据
分区转换在安装系统时,按Shift+F10或者Shift+Fn+F10调出cmd窗口。依次输入下面命令:
diskpart —(启动分区管理工具)
list disk — (列出连接到电脑的所有磁盘及其编号)
select disk x —(选择需要转换分区的磁盘的编号x)
clean —(清除磁盘原有数据)
convert xxx — (选择磁盘转换的类型)xxx代表要转换 ...
搭建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 ...