Ahao's Technical Blog Ahao's Technical Blog
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

阿豪讲Framework

不积跬步无以至千里
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础篇

  • 玩转AOSP篇

  • 学穿Binder篇

  • 基础组件篇

  • 系统启动过程分析

  • Hal开发入门与实践

    • 001.Android HAL 层概览
    • 002.传统 Hal 开发指南1 —— 开发环境准备
      • 1. 引子
      • 2. 开发环境准备
      • 参考资料
    • 003.传统 Hal 开发指南2 —— 传统 HAL 整体架构
    • 004.传统 Hal 开发指南3 —— 驱动开发
    • 005.传统 Hal 开发指南4 —— 实现一个简单的 Hal 模块
    • 006.传统 Hal 开发指南5 —— 添加硬件访问服务
    • 007.传统 Hal 开发指南6 —— 开发一个 App 访问硬件服务
    • 008.HIDL HAL 开发指南1 —— 开发环境准备
    • 009.HIDL Hal 开发指南2 —— Android 8 HAL 变迁
    • 010.HIDL Hal 开发指南3 —— HIDL HAL 实例程序
    • 011.HIDL Hal 开发指南4 —— Binderized HALs 实例分析
    • 012.HIDL Hal 开发指南5 —— Passthrough HALs 实例分析
    • 013.HIDL Hal 开发指南6 —— Same-Process HALs 实例分析
    • 014.HIDL Hal 开发指南7 —— 驱动开发
    • 015.HIDL Hal 开发指南8 —— 简单 HIDL HAL 实现
    • 016.HIDL Hal 开发指南9 —— 添加硬件访问服务
    • 017.HIDL Hal 开发指南10 —— 开发一个 App 访问硬件服务
    • 018.AIDL Hal 开发指南1—— 开发环境准备
    • 019.AIDL Hal 开发指南2 —— AIDL HAL 整体架构
    • 020.AIDL Hal 开发指南 3 ———— AIDL HAL 实例分析1
    • 021.AIDL Hal 开发指南 4 ———— AIDL HAL 实例分析2
    • 022.AIDL Hal 开发指南5 —— stable-c HAL 实例分析
    • 023.AIDL Hal 开发指南6 —— 驱动开发
    • 024.AIDL Hal 开发指南7 —— 实现一个简单的 AIDL HAL
    • 025.AIDL Hal 开发指南8 —— 添加硬件访问服务
    • 026.AIDL Hal 开发指南10 —— AIDL HAL 的升级
  • 显示系统

  • Framework
  • Hal开发入门与实践
阿豪
2024-03-19
目录

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

更多 Framework 教程,ahaoframework.tech

# 1. 引子

Android 8 以前的 HAL,我们称之为传统 HAL。

20240313103414

在这个阶段,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 (opens new window)。

接下来就是下载源码,如果我们在 Ubuntu1604 上直接使用 repo 下载,会遇到 Python 版本的问题,如果调整 Python 版本,编译源码又会出错。解决方法有两种:

  • 在 Ubuntu2204 上使用 repo 同步好源码,再压缩复制到 Ubuntu1604 上
  • 直接下载别人上传到网盘的单分支源码
  • 使用 docker 编译

这里我们采用第二种方式:

链接: https://pan.baidu.com/s/1SXmIAmkpR09L-wCUZU_YZA 提取码: pj7z

下载好源码后,我们可以通过 samba 将源码拷贝到 Ubuntu1604 上,具体 samba 的搭建可以参考Android 系统开发工具推荐 (opens new window)

接下来安装编译 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
1
2
3
4

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

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
1
2
3
4
5
6
7

Android 7 编译过程中可能会出现 Ensuring Jack server is installed and started 报错问题。解决办法:

打开 ~/.jack-server/config.properties 配置文件,修改两个端口号:

20240313121428

打开 ~/.jack-settings 配置文件,修改两个端口号:

20240313121511

打开 /etc/java-8-openjdk/security/java.security,把 jdk.tls.disabledAlgorithms 的 TLSv1, TLSv1.1 两个值取消掉:

20240313121923

修改 ./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"
1
2
3
4

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

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

git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git
git branch -a
git checkout android-goldfish-3.10-n-dev
1
2
3

编写编译脚本:

#!/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
1
2
3
4
5
6
7

将以上的内容保存为 build.sh 脚本文件。执行 sh build.sh 开始编译。

自定义内核启动:

# aosp 源码目录下
source build/envsetup.sh
lunch aosp_x86_64-eng
emulator -kernel /tmp/kernel-qemu/x86_64-3.10.0/kernel-qemu
1
2
3
4

在设置中查看 kernel 版本:

20240313155559

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

# 参考资料

  • 编译x86_64 android 7.1及goldfish内核 (opens new window)
  • Android硬件抽象层HAL总结 (opens new window)
001.Android HAL 层概览
003.传统 Hal 开发指南2 —— 传统 HAL 整体架构

← 001.Android HAL 层概览 003.传统 Hal 开发指南2 —— 传统 HAL 整体架构→

最近更新
01
如何调试 SurfaceFlinger
10-05
02
SurfaceFlinger 概述
10-05
03
HWC 接口分析
10-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 AHao Framework | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式