惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
aimingoo的专栏
aimingoo的专栏
C
CXSECURITY Database RSS Feed - CXSecurity.com
Stack Overflow Blog
Stack Overflow Blog
C
CERT Recently Published Vulnerability Notes
T
Tailwind CSS Blog
腾讯CDC
罗磊的独立博客
Security Latest
Security Latest
K
Kaspersky official blog
A
Arctic Wolf
博客园 - Franky
D
Docker
博客园 - 司徒正美
GbyAI
GbyAI
T
Tenable Blog
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
H
Help Net Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
Lohrmann on Cybersecurity
小众软件
小众软件
V
V2EX
T
Threatpost
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
P
Privacy & Cybersecurity Law Blog
S
Securelist
Google DeepMind News
Google DeepMind News
I
Intezer
The Register - Security
The Register - Security
NISL@THU
NISL@THU
L
LINUX DO - 热门话题
C
Cisco Blogs
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
S
Schneier on Security
Scott Helme
Scott Helme
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
Project Zero
Project Zero
Cyberwarzone
Cyberwarzone
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
L
LangChain Blog
P
Proofpoint News Feed

音视频开发进阶

音视频教程-第三节 音视频教程-第二节 真的,AI 可能就是新时代的信息差 充值 Cursor 之后,工作有了哪些变化?🤔 个人'蒸馏'大模型能做哪些有意思的事情 DeepSeek 大模型在 Mac 上的部署和运行 音视频教程-第一节 【WebRTC 专栏】-- Android 开发集成 WebRTC 库的几种方式 【WebRTC 专栏】-- 在 Mac M1 等系列芯片编译和开发 WebRTC-Android 库 Meta Llama3 大模型在 Mac 上的部署和运行 iOS VideoToolBox 解码 HEVC Open-GOP 视频的问题排查 Flutter 状态管理之 InheritedWidget 使用和分析 用 ChatGPT 回答技术问题怎么样 ? 音视频开发系统入门大致路线 UE 4.27 添加自定义 ShadingModel 用 UE4 虚幻引擎做个捏脸小功能~~ UE4 材质练习 之 凹凸贴图偏移的使用 UE4 材质练习系列基础 OpenGL上下文创建以及共享机制 007 | 播放器系列专栏-解析 MP4 文件读取信息 006 | 播放器系列专栏-在 Mac 上查看 MP4 格式信息 干货 | 快速抽取缩略图是怎么练成的? 关于直播、WebRTC、FFmpeg 的那些事 005 | 播放器系列专栏-在 Windows 上查看 MP4 格式信息 将音视频中的花屏、绿屏、黑屏问题一网打尽 关于音视频里面的解码帧率和渲染帧率 004 | 播放器系列专栏-认识MP4视频(下) 003 | 播放器系列专栏-认识MP4视频(上) 入门或者转行音视频,应该要怎么做? H264视频文件如何缩放分辨率 002 | 播放器系列专栏-FFmpeg依赖库的配置 001 | 播放器系列专栏-关于播放器项目的一个小实践 Seek策略以及在有B帧情况下的处理 目前流媒体开发工程师工作内容主要是什么? 一个音视频领域专业问答的小圈子 干货收藏 || Vulkan Game Engine 视频教程 音视频春节假期内卷指南(实操) Vulkan 在 FFmpeg 中的支持 Windows 下 FFmpeg 和 LibX264 的编译和配置 Metal 开发 | 使用 C++ 进行接口调用 音视频开发工作经验分享 || 视频版 FFmpeg 调用 MediaCodec 硬解码到 Surface 上 代码吸猫 | 用 OpenGL 图像渲染的养猫计划 百倍变速--解码到底能不能丢 非参考帧 ?FFmpeg 有话说!!! 老生常谈-FFmpeg 的编译问题轻松搞定 FFmpeg 调用 Android MediaCodec 进行硬解码(附源码) 【WebRTC 专栏】--创建相机预览 Unity Shader 光照基础之 Half Lambert 光照模型 Unity Shader 光照基础之Lambert光照模型 Unity Shader 光照基础内容 Unity Shader 显示一张图片纹理 UnityShader 的基本概念 Unity 物体的基本操作 C++ 模板系列小结07-尾置返回类型 C++ 模板系列小结06-可变参数模板特性 C++ 中的多线程的使用和线程池建设 C++ 模板系列小结05-模板类型作为模板参数 C++ 模板系列小结04-类模板中的成员模板 C++ 模板系列小结03-在模板中指定变量类型 C++ 模板系列小结02-非类型模板参数 C++ 模板系列小结01-函数模板和类模板 从零打造渲染引擎系列01-什么是渲染引擎 iOS开发 - 在 Swift 中去调用 C/C++ 代码 2021 技术新番 - 从零打造渲染引擎系列 iOS 音视频开发的一些基础准备工作 音视频交流群又来啦~~~ 【WebRTC 专栏】WebRTC & Android 开发学习环境搭建~ 【喜大普奔】域名终于备案通过啦 Shader 优化 | OpenGL 绘制网格效果 【音视频连载-011】第二季 FFmpeg 一层一层获取文件信息 KodeLife | Shader 实时编辑预览的强大工具使用实践 推荐几个堪称教科书级别的 Android 音视频入门项目 【音视频连载-010】第二季 FFmpeg 日志打印 【音视频连载-008】基础学习篇-SDL 播放 PCM 音频文件(下) 【音视频连载-007】基础学习篇-SDL 播放 PCM 音频文件(上) 【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件 【音视频连载-005】基础学习篇-SDL 加载 YUV 文件并显示 【音视频连载-004】基础学习篇-SDL 加载图片并显示 【音视频连载-003】基础学习篇-SDL 消息循环和事件响应 【音视频连载-002】基础学习篇-SDL 创建窗口并显示颜色 【音视频连载-001】基础学习篇- SDL 介绍以及工程配置 LearnOpenGL 源码在 MAC 上的编译与调试 2019 年终总结与回顾 Android NDK 开发的免费技术视频来啦~~ OpenGL 实现视频编辑中的转场效果 OpenGL 实践之贝塞尔曲线绘制 图像库 libjpeg-turbo 编译与实践 图像库 libpng 编译与实践 rust 开发编译 Android 动态库实践 Android NDK 开发 —— 从 Assets 文件夹加载图片并上传纹理 简单易用的图像解码库介绍 —— stb_image 博客图床迁移记 进击的 Vulkan 移动开发之 SwapChain 进击的 Vulkan 移动开发之 Command Buffer 进击的 Vulkan 移动开发之 Instance & Device & Queue 进击的 Vulkan 移动开发(一)之今生前世 Java 显式锁 Lock 与条件队列 C++ 标准容器库小结 一文读懂 YUV 的采样与格式 《OpenGL ES 3.x 游戏开发》碰撞检测之 AABB 包围盒
编译安卓源码
音视频开发进阶 · 2018-01-31 · via 音视频开发进阶

一个专注音视频领域的小圈子

花了一两天时间终于在 Mac 上成功编译了 Android 主线最新代码,中间遇到了不少问题,也查阅了好多资料,总算是成功了,看到模拟器启动的那一刻还是挺激动的。

环境准备

由于我编译的是安卓主线的最新代码,版本是安卓 6.0 的,而网上有些博文是基于 Android 4.0 版本的,这两者之间的编译还是有些差距的,这里列举一下我的环境。

  •    Mac 一台,16 G 内存(版本:10.11.5)。
  •    Java 8
  •    Xcode 安装(包含命令行工具等等)
  •    Android 开发环境安装

如果本身就是开发安卓的,那么这些环境准备工作应该都可以略过了,之前就应该配好了的,只要电脑足够强劲就行了。

大小写区分的文件系统

在 Mac 电脑上需要创建一个大小写区分的文件系统,而 Mac 默认是大小写不区分的。

使用磁盘工具创建

Mac 自带了磁盘工具软件来创建磁盘,也就是我们平时安装软件时的 .dmg 格式的文件。不过,在我使用的时候,明明选择了 OS X 拓展(区分大小写,日志式) ,可创建出的磁盘镜像依旧还是不区分大小写的,试了两次之后还是不行,干脆放弃了,转用命令行。

使用命令行创建 

在安卓的官方教程中都已经给出了具体的命令了:https://source.android.com/source/initializing.html#setting-up-a-mac-os-x-build-environment

  •    创建一个大小是 40 G 的,区分大小写的,稀疏磁盘映像的文件系统。
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg

然而,当我用了这个命令行之后,发现的确创建了磁盘,但却是只读的,不能写入,这就很尴尬了。 解决方法就是干脆不创建稀疏磁盘映像了,创建一个固定大小的可读写的磁盘映像。

使用 hdiutil create -help 命令,读/写磁盘映像的命令对应的是 UDIF ,更换命令行如下:

hdiutil create -type UDIF -fs 'Case-sensitive Journaled HFS+' -size 80g ~/android.dmg

SPARSE 替换成 UDIF ,并且将容量扩大到 80 G 。

  •    调整磁盘映像文件大小
hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

由于创建的固定大小的,也就没什么需要再改变的了。

  •    挂载磁盘映像
# mount the android file imagefunction mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }

将此 function 写入到 ~/.bash_profile 文件中,就可以直接在命令行使用 mountAndroid 命令了。其实,创建了磁盘映像之后,直接双击也可以将其挂载上去了。

  •    卸载磁盘映像
# unmount the android file imagefunction umountAndroid() { hdiutil detach /Volumes/android; }

下载 Android 源码

由于众所周知的原因,Android 源码是在 清华大学 TUNA 镜像源 上下载的。

我使用的是每月更新的初始化包。首先需要进入到自己挂载的区分大小写的磁盘镜像中去,然后按照清华大学的 Android 镜像使用帮助给的命令执行即可。

//下载 repo 工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo //使用每月更新的初始化包
wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP   # 解压得到的 AOSP 工程目录# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录# 或 repo sync -l 仅checkout代码

解压之后,AOSP 文件夹的大小大概是 37.5 G 左右。

一波三折的编译过程

下载好了 Android 源码就可以进行编译了,整个编译过程就三个命令:

  •    脚本环境初始化

*   选择要编译的目标

  •    执行编译
make -j4// 数字4代表执行的线程,根据个人电脑情况所定

然后要顺利执行完这三个命令,中间还会遇到很多问题……

使用 bash 而非 zsh

在执行

命令时,使用 zsh 并不能把所有的内容都初始化,有些命令还是需要 bash 来完成的。

echo $SHELL  // 查看当前使用的shell
chsh-s /bin/bash    // 切换到 bash 

更新 curl 工具

在执行 make 命令时,会遇到如下的问题,需要安装 Jack server。这个东西是不需要再另行安装的,应该编译过程中会搞定的。执行在编译时用到了 curl 工具,而 curl 工具需要支持 ssl 。

java-server-not-install-2

通过 curl --version 查看当前 curl 版本,如果是 7.43 或者更低,不能再版本信息中看到 OpenSSL 的字样,说明就要更新了,然而,通过 homerew 更新 curl 之后,会发现,当前的版本仍是之前的版本,解决方法如下:http://stackoverflow.com/questions/31708574/curl-does-not-support-http2-on-mac

// 安装新版 curlbrew install curl --with-nghttp2 --with-openssl
# link the formula to replace the system cURL
$  brew link curl --force
# now reload the shell

这个时候在查看 curl 版本,就会发现已经更新了。

空间不足

如果在编译过程中出现了如下图片所示的错误,No space left on device ,说明创建的磁盘空间不足了,需要再扩大一下磁盘空间了。no-space-left

编译成功

在解决上面的问题之后,虽说编译过程还是会报出很多错误,但是都可以忽略了,并不影响到最后的编译结果。当然,如果编译到一半停住了,那肯定是要解决问题了。例如网上还有的问题就是报的内存不够之类的。 漫长的等待之后,就会出现编译成功的提示了。 make-success

模拟器

接下来就是启动模拟器了,一个令人激动的时刻了,因为之前选择的编译就是在模拟器上的。 执行 emulator 命令即可启动模拟器,但还是会收到如下的提示:system-partition

因为 Android 最新的版本是 6.0 的,所以我们还要指定一下模拟器的配置信息。emulator  -partition-size 2048在经过漫长的等待之后,模拟器就启动了,显示的就是最新的 Android 主分支上的 6.0 的系统了。

参考

  1. http://www.jianshu.com/p/367f0886e62b#
  2. http://www.cnblogs.com/qianxudetianxia/p/3681890.html
  3. http://blog.alexwan1989.com/2016/01/12/Android%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%80%EF%BC%89/

原创文章,转载请注明来源:    编译安卓源码