在 Ubuntu20.04中能编译 Android2.3 吗?

Posted 亚马逊的蝴蝶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 Ubuntu20.04中能编译 Android2.3 吗?相关的知识,希望对你有一定的参考价值。

这是一篇充满血和泪的文章,讲的是我编译 android2.3 的踩坑经历。

最近开始学习 Android 开发,看的是罗升阳大神写的《Android 系统源代码情景分析(第三版)》。很多人应该都知道这本书,书中的实例非常适合初学者,但美中不足之处是这本书写得比较早,差不多是十年前,因此现在按书中例子进行实操,不可避免地会遇到很多坑。

既然学习 Android,当然要在 Ubuntu 中搭环境,因为这是主流使用的系统,自学就应该跟着主流走,这样才能方便地查到资料,否则大概率会卡死在路上。

在网友老毕的帮助下,我组装了一台 32G+1T的台式机,把硬盘划了100G给 Window11,100G给 macOS,剩下800G都给了 Ubuntu20.04。

因为罗神书中实例是基于 Android2.3 的,所以我在 Ubuntu20.04 下 repo 了 Android2.3.1_r1 源码,下载非常顺利,但开始 make 后却出现各种各样的报错,比如:临时模板参数太多、参数类型不一致、文件未找到,等等。

有经验的人应该会很快意识到哪里不对,但我是初学者,没有经验,以为有各种报错是正常的,正是需要逐个解决的问题;再加上我之前尝试过做 LineageOS 适配非官方机型,知道编译时遇到各种问题是很正常的,逐个解决就好了。这两个原因使得我一直埋头解决遇到的问题,用了近一个星期的时间把源码做了很多修改,现在回想真是佩服自己,在什么也不懂的情况,通过查资料,不断尝试,克服了这么多关卡,直到遇到一长串“文件不存在”的报错,彻底卡住了,完全没有头绪,网上也根本找不到有人问这类问题,我这时才开始怀疑自己可能从开头就做错了:Android2.3.1是十年前的源码,罗神用它做书中例子,说明源码是没有问题的,我现在遇到这么多问题,原因只能我用的系统或编译环境有问题,我在克服前面的问题过程中已经把 gcc、g++ 降级到 4.4.7版了,还出现这种别人没有遇到过的问题,只能说明我的操作系统不适用于编译 Android2.3.1,妄想把它调顺,对于高手来说可能都不是件容易的事,更别说我这样的新人了。

想明白这点,我知道该怎么做了——更换操作系统。

舍不得把已经安装好的 Ubuntu20.04 卸载,因此用 GParted 从 Ubuntu20.04 的800G分区中分出200G,给 Windows11 做 D: 盘,然后在 Windows11 中安装 VMWare15 虚拟机。先是在虚拟机中安装 Ubuntu12.04,但发现它太老了,已经没有官方支持,什么依赖包都下载不下来,于是只好安装  Ubuntu14.04,并在网上找到一篇讲如何在 Ubuntu14.04 下编译 Android2.3 的文章,正适用于我这个情况。

经过一天的折腾,终于成功完成了 Android2.3.1_r1 的编译。下面是整个过程的记录,也许对有的朋友会有帮助。

配置 Ubuntu14.04,编译 Android2.3.1_r1 过程全记录

参考文章:Android2.3.1系统源码编译_JimCal-CSDN博客

(一)安装依赖包

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 vim libssl-dev

(二)安装 Python3

​cd Downloads
wget http://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
tar -xvzf Python-3.6.4.tgz
cd Python-3.6.4
./configure --with-ssl
make
sudo make install

(三)安装 jdk1.6.0_45

下载 jdk-6u45-linux-x64.bin,放在 Downloads 文件夹中(如何下载请自行百度),然后进行安装。

sudo mkdir /usr/java
cd /usr/java
sudo cp ~/Downloads/jdk-6u45-linux-x64.bin ./
sudo chmod a+x ./jdk-6u45-linux-x64.bin
sudo ./jdk-6u45-linux-x64.bin
sudo update-alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_45/bin/java 1061
sudo update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_45/bin/javac 1061
sudo update-alternatives --install /usr/bin/javap javap /usr/java/jdk1.6.0_45/bin/javap 1061
sudo update-alternatives --install /usr/bin/javah javah /usr/java/jdk1.6.0_45/bin/javah 1061
sudo update-alternatives --install /usr/bin/jar jar /usr/java/jdk1.6.0_45/bin/jar 1061
sudo update-alternatives --install /usr/bin/javadoc javadoc /usr/java/jdk1.6.0_45/bin/javadoc 1061

如果系统中已经安装多个版本 jdk,则需要将 jdk1.6.0_45 设为默认 jdk:

执行下面命令,按提示选择 jdk1.6.0_45。

sudo update-alternatives --config java
sudo update-alternatives --config javac

(四)将 gcc 和 g++ 降级为 4.4版

编译 Android2.3 时,很多问题都是因为编译器版本过高,因此需要降级:

sudo apt-get install gcc-4.4 g++-4.4
sudo rm -rf /usr/bin/gcc
sudo rm -rf /usr/bin/g++
sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++
sudo apt-get install g++-4.4-multilib

(五)安装和配置 repo

​mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

(六)下载 Android2.3.1_r1

mkdir Android
cd Android
mkdir 2.3.1_r1
cd 2.3.1_r1
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-2.3.1_r1
repo sync

这个过程耗时很长,取决于网络速度和你的计算机性能。

repo sync 时,会出现很多提示:curl:(60)SSL certificate problem: cerificate has expired

不用管它,不影响下载和编译。

(七)编译 Andorid

如果直接编译,会遇到很多报错,所以在编译前需要做以下工作

1. 修改 dalvik/vm/native/dalvik_system_Zygote.c

vi dalvik/vm/native/dalvik_system_Zygote.c

在 dalvik_system_Zygote.c 中添加“#include <sys/resource.h>”(见下图):

2. 移动文件 /usr/include/x86_64-linux-gnu/zconf.h

sudo cp /usr/include/x86_64-linux-gnu/zconf.h /usr/include/

3. 安装 libswitch-perl

sudo apt-get install libswitch-perl

做完以上工作后,再 make,将会顺利完成编译。编译时间长短取决于你的机器,我花了40分钟完成编译。

(八)在模拟器中运行

export PATH=$PATH:~/Android/2.3.1_r1/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=~/Android/2.3.1_r1/out/target/product/generic
emulator

如果出现报错:SDL init failure, reason is: No available video device,则执行下面语句

sudo apt-get install libsdl1.2debian:i386

然后重新运行模拟器

emulator

 如果顺利的话,将出现下面的界面:

 

 

以上是关于在 Ubuntu20.04中能编译 Android2.3 吗?的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 20.04 编译安装 p4 详解

如何在 ubuntu 20.04 中安装编译器 g++-4.8.5

Ubuntu 20.04编译安装 spooftooph

汇编器消息:没有这样的指令:编译 C - GCC 9.3.0、Ubuntu 20.04 时的“endbr64”

ubuntu 20.04 编译openjdk8

“/usr/bin/ld: 在 Ubuntu 20.04 中编译 opencv 项目时找不到 -llibopencv_calib3d”