对于有序广播,并且发送广播的进程和接收处理的进程不是一个进程时,超过60秒才会有anr?
本文基本Android8.1系统源码
1 2 3 4 5 6 7 |
#include <utils/CallStack.h> ALOGW("name=liuderu cpp stack111"); android::CallStack stack; stack.update(); stack.log("InputDispatcher", ANDROID_LOG_DEBUG, " "); |
stack.log的第一个参数是LOG_TAG,第二个是固定的ANDROID_LOG_DEBUG
既然Zygote Server是使用网络通讯,为什么普通应用不能和它通讯?
笔者本来以为zygote是通过127.0.0.1这种方式创建的server,所以会有此疑问。经过研究发现,zygote是通过文件建立的socket server(具体文件名/dev/socket/zygote),并且zygote是以root权限运行的,所以它生成的socket文件普通应用是无法进行通讯的。
删除framework层不使用语言配置文件
删除目录frameworks/base/core/res/res/下面的除了简体中文zh-rCN、繁体中文zh-rTW、zh-rHK和英文en-rXX之外的相关语言资源文件
删除前system.img文件为1.2G左右
删除后system.img文件为1.1G左右
删除设置应用中的不使用的语言选择列表
在frameworks/base/core/res/res/values/locale_config.xml中删除不使用的语言即可
shell脚本引用其他的脚本
有多个功能类似的脚本,用到同一个变量,但是这个变量有可能会根据需要改变,如果每个脚本文件定义一个这个变量,修改的时候每个脚本都要修改,很麻烦,所以想将这个变量定义在一个common.sh脚本里面,然后在功能脚本里面引用这个脚本,代码如下:
1 2 3 4 |
#获取脚本所在的路径 script_folder=$(cd "$(dirname "$0")"; pwd) #引用脚本 source ${script_folder}/common.sh |
shell脚本获取脚本所在绝对路径
1 2 3 |
script_folder=$(cd "$(dirname "$0")"; pwd) echo ${script_folder} |
一、环境准备
Ubuntu18.04.4,不能使用Ubuntu16会有很多依赖软件版本太低
硬盘200G,内存4G+,交换分区(swap)4G+(可装完系统后添加,见后面错误处理部分)
二、下载源码
三、安装编译时需要的第三方库
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
sudo apt install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop git-core curl u-boot-tools mtd-utils android-tools-fsutils device-tree-compiler gdisk liblz4-tool m4 libz-dev
安装open-jdk-8
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
安装gcc-arm-none-eabi
sudo apt-get install gcc-arm-none-eabi
安装完这一项后,在~/.bashrc中最后一行添加脚本export ARMGCC_DIR=/usr/
然后执行source ~/.bashrc
安装cmake,需要3.13.0版本以上,安装步骤如下,其中./bootstrap那一步可以不用加后面的–qt-gui参数
https://blog.csdn.net/huigougou/article/details/84326907
四、开始编译
然后进入到Android源码目录,假设源码在用户根目录的aosp目录中:
cd ~/aosp
然后初始化编译环境,使用下面的命令:
source build/envsetup.sh
然后选择要编译的目标版本,先输入lunch命令
lunch
然后在显示的列表中选择你的目标版本,输入相应的数字,按回车即可
然后使用make开始编译,可以使用-j参数增加编译的线程以提高速度,线程数量为cpu核心数的2倍比较合适,比如你的cpu是4核的使用
make -j8
就可以了
五、遇到的问题
1. 错误:flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed.
Aborted (core dumped)
解决办法:
This will do the trick:
export LC_ALL=C
Add it to your bashrc file or equivalent.
参考链接:https://stackoverflow.com/questions/49955137/error-when-build-lineageos-make-ninja-wrapper-error-1
https://www.jianshu.com/p/2beae17c9b12
2、错误2:
JackServer提示out of memory
解决方案:
修改jack server内存
步骤:
打开./prebuilts/sdk/tools/jack-admin
找到下面这一行
JACK_SERVER_VM_ARGUMENTS=”${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8}”
修改为
JACK_SERVER_VM_ARGUMENTS=”${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096M}”
保存jack-admin文件
在命令行执行
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
重启jack server
然后重新编译
生成签名apk时,Android Studio报如下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Could not determine the dependencies of task ':app:lintVitalAilifenRelease'. > Could not resolve all artifacts for configuration ':app:wanjiaDebugAndroidTestRuntimeClasspath'. > Could not resolve com.android.support:support-annotations:{strictly 26.1.0}. Required by: project :app > Cannot find a version of 'com.android.support:support-annotations' that satisfies the version constraints: Dependency path 'simplescales:app:unspecified' --> 'com.android.support.test:runner:1.0.2' --> 'com.android.support:support-annotations:27.1.1' Constraint path 'simplescales:app:unspecified' --> 'com.android.support:support-annotations:{strictly 26.1.0}' because of the following reason: wanjiaDebugRuntimeClasspath uses version 26.1.0 Dependency path 'simplescales:app:unspecified' --> 'com.android.support:appcompat-v7:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:recyclerview-v7:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support.test:runner:1.0.2' --> 'com.android.support.test:monitor:1.0.2' --> 'com.android.support:support-annotations:27.1.1' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:appcompat-v7:26.1.0' --> 'com.android.support:support-vector-drawable:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-compat:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-media-compat:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-core-utils:26.1.0' --> 'com.android.support:support-annotations:26.1.0' Dependency path 'simplescales:app:unspecified' --> 'com.android.support:support-v4:26.1.0' --> 'com.android.support:support-core-ui:26.1.0' --> 'com.android.support:support-annotations:26.1.0' |
解决办法:
在app/build.gradle中加入以下依赖
1 |
implementation 'com.android.support:support-annotations:28.0.0' |
编译项目时出现下面的错误:
CMake Error: CMake was unable to find a build program corresponding to “Ninja”. CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
解决办法:
把项目的build.gradle中的buildscript下面dependencies里的gradle的版本升级以下就行了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
buildscript { repositories { google() maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' } maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' } jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } |
原来是:
1 |
classpath 'com.android.tools.build:gradle:3.5.3' |
模块中定义的sepolicy策略文件目录如下加入到系统编译中:
在BoardConfig.mk中找BOARD_SEPOLICY_DIRS,将你的sepolicy目录加到这个变量中,如下所示:
1 2 3 4 |
BOARD_SEPOLICY_DIRS := \ device/fsl/imx8/sepolicy \ packages/services/Car/evs/sepolicy \ device/fsl/mek_8q/sepolicy |
如何定义域?
在/system/sepolicy/public/attributes文件中输入如下的行来定义
1 |
attribute evs_domain; |
如何定义某个目录或者应用文件的安全上下文?
首先在/system/sepolicy/private/file_contexts中定义如下:
1 |
/system/bin/my_app u:object_r:my_app_exec:s0 |
然后创建my_app.te的文件来定义具体的规则:
根据logcat中的avc denied的log生成合适的seLinux规则。
我们可以在logcat中看到类似如下的日志:
1 2 3 4 5 6 |
04-01 07:55:37.768 5155 5155 I evs_app : type=1400 audit(0.0:20): avc: denied { read } for name="egl" dev="mmcblk0p4" ino=1732 scontext=u:r:evs_app:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=1 04-01 07:55:37.768 5155 5155 I evs_app : type=1400 audit(0.0:21): avc: denied { open } for path="/system/lib64/egl" dev="mmcblk0p4" ino=1732 scontext=u:r:evs_app:s0 tcontext=u:object_r:system_file:s0 tclass=dir permissive=1 04-01 07:55:37.768 2879 2879 E SELinux : avc: denied { find } for interface=android.hardware.automotive.vehicle::IVehicle pid=5155 scontext=u:r:evs_app:s0 tcontext=u:object_r:hal_vehicle_hwservice:s0 tclass=hwservice_manager permissive=1 04-01 07:55:37.936 5155 5155 I evs_app : type=1400 audit(0.0:22): avc: denied { call } for scontext=u:r:evs_app:s0 tcontext=u:r:hal_configstore_default:s0 tclass=binder permissive=1 04-01 07:55:37.941 2879 2879 E SELinux : avc: denied { find } for interface=android.hardware.configstore::ISurfaceFlingerConfigs pid=5155 scontext=u:r:evs_app:s0 tcontext=u:object_r:hal_configstore_ISurfaceFlingerConfigs:s0 tclass=hwservice_manager permissive=1 04-01 07:55:42.928 5181 5181 I evs_app : type=1400 audit(0.0:23): avc: denied { call } for scontext=u:r:evs_app:s0 tcontext=u:r:hal_configstore_default:s0 tclass=binder permissive=1 |
我们可以通过audit2allow工具把上面的log转换成合适的规则,配置在策略文件中,如果没有安装过这个工具先安装工具,如下:
1 |
sudo apt install policycoreutils |
将相关的log保存到一个文件中,如avclog.txt,然后执行下面的命令来生成规则:
1 |
audit2allow -i avclog.txt |