传统 Hal 开发指南1 —— 开发环境准备

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 的必要软件:

bash 复制代码
# 安装编译需要的软件
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

接下来就是解压,编译源码了:

bash 复制代码
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:

bash 复制代码
# 找到
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"

然后重新编译系统源码即可。

接下来下载编译适用于模拟器的内核:

bash 复制代码
git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git
git branch -a
git checkout android-goldfish-3.10-n-dev

编写编译脚本:

bash 复制代码
#!/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 开始编译。

自定义内核启动:

bash 复制代码
# aosp 源码目录下
source build/envsetup.sh
lunch aosp_x86-eng
emulator -kernel /tmp/kernel-qemu/x86_64-3.10.0/kernel-qemue

在设置中查看 kernel 版本:

自此,开发环境就搭建好了。

参考资料

相关推荐
Devil枫24 分钟前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer26 分钟前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin
雨白11 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹13 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空14 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭15 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日16 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安16 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑16 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟20 小时前
CTF Web的数组巧用
android