1. 引子
Android 8 曾经的 HAL,咱们称之为传统 HAL。
在这个阶段,HAL 层以 so 库的方式存在,Framework 层经过 JNI 加载到这些 so 库,然后 Framework 层经过 Binder 服务的方式向 App 提供操作硬件的接口。
接下来咱们经过一个简单项目来体验一下传统 HAL 的开发进程,带你从驱动写到 App,做真全栈 Android 人。
大约分以下几步:
- 预备好 Ubuntu1604 模拟器,下载好 Android7.0 源码及对应内核源码,接着编译好,把模拟器发动起来
- 开发一个 HelloWorld 级别的 Linux 驱动
- 完成一个简单 Hal 模块的编写
- 修正 JNI 层代码,加载新增加的 Hal 模块
- 增加一个硬件服务模块,给 App 提供拜访硬件的接口
- 写一个 App,拜访硬件服务
本节的主要任务是建立好开发环境。
2. 开发环境预备
这儿咱们需求一个 Android 8 曾经的体系源码以及对应的内核,这儿咱们就选择运用 android-7.0.0_r1
接着咱们就运用 VMWare 装置 Ubuntu1604 虚拟机,装置的进程能够参阅极速上手aosp。
接下来便是下载源码,假如咱们在 Ubuntu1604 上直接运用 repo 下载,会遇到 Python 版别的问题,假如调整 Python 版别,编译源码又会出错。解决方法有两种:
- 在 Ubuntu2204 上运用 repo 同步好源码,再压缩复制到 Ubuntu1604 上
- 直接下载别人上传到网盘的单分支源码
- 运用 docker 编译
这儿咱们采用第二种方式:
链接: pan.baidu.com/s/1SXmIAmkp… 提取码: pj7z
下载好源码后,咱们能够经过 samba 将源码拷贝到 Ubuntu1604 上,详细 samba 的建立能够参阅Android 体系开发工具引荐
接下来装置编译 Android 的必要软件:
# 装置编译需求的软件
sudo apt-get install openjdk-8-jre openjdk-8-jdk
sudo apt-get install m4 g++multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev flex curl bison libxml2-utils
sudo apt-get install python
接下来便是解压,编译源码了:
sudo apt install p7zip-full
7z android-7.0.0_r1.7z
cd android-7.0.0_r1
source build/envsetup.sh
lunch aosp_x86_64-eng
make -j16
Android 7 编译进程中可能会出现 Ensuring Jack server is installed and started
报错问题。解决办法:
翻开 ~/.jack-server/config.properties
装备文件,修正两个端口号:
翻开 ~/.jack-settings
装备文件,修正两个端口号:
翻开 /etc/java-8-openjdk/security/java.security
,把 jdk.tls.disabledAlgorithms
的 TLSv1, TLSv1.1 两个值取消掉:
修正 ./prebuilds/sdk/tools/jack-admin:
# 找到
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
# 在-cp前参加 -Xmx 装备其可用内存,主张4096m或8192m,即修正成如下
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx8192m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
然后重新编译体系源码即可。
接下来下载编译适用于模拟器的内核:
git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git
git branch -a
git checkout android-goldfish-3.10-n-dev
编写编译脚本:
#!/bin/bash
export ARCH=x86_64
export SUBARCH=x86_64
export CROSS_COMPILE=x86_64-linux-android-
export REAL_CROSS_COMPILE=x86_64-linux-android-
export PATH=/home/zzh0838/Project/android-7.0.0_r1/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin:$PATH
/home/zzh0838/Project/android-7.0.0_r1/prebuilts/qemu-kernel/build-kernel.sh --arch=x86_64
将以上的内容保存为 build.sh 脚本文件。履行 sh build.sh 开始编译。
自定义内核发动:
# aosp 源码目录下
source build/envsetup.sh
lunch aosp_x86-eng
emulator -kernel /tmp/kernel-qemu/x86_64-3.10.0/kernel-qemue
在设置中检查 kernel 版别:
自此,开发环境就建立好了。