初学者 Android 移植:在 Debian 上设置稳定的构建环境
通过稳定一致的构建环境,减少 Android 移植中的一些麻烦。
引言
通过在 chroot 环境中设置开发环境,避免依赖冲突并将 Android 开发与 Debian GNU/Linux 系统隔离开来。这适用于“通配符”类别,因为从源代码构建 Android 似乎没有在其他地方涉及。
背景
本指南是正在进行的个人项目的一部分,旨在开发一本关于 Android ROM 移植的免费开源书籍,旨在简化 ROM 移植的研发过程并揭开其神秘面纱。本指南的源代码(采用 MarkDown Extra 格式)可在 GitHub 上获取:https://github.com/omr87169。
在基于 Debian 的 GNU/Linux 发行版上设置 Android 开发环境
*为本书的目的,所有在 GNU/Linux 上进行的说明将明确显示使用 sudo,当命令必须以 root 或替代用户身份运行时。这主要是为了消除设置构建环境过程中的歧义。
使用 debootstrap 和 chroot 稳定和隔离您的构建环境
使用 chroot 将允许您在一致的构建环境中工作并避免冲突的依赖项。尽管在大多数 Android 移植指南中没有描述,但我发现它是设置开发环境不可或缺的一步。为了做到这一点,我们将使用 debootstrap 在您计算机上的一个目录中生成一个最小的 Debian 安装,挂载底层文件系统的必要部分,然后使用 chroot 进入新的纯净环境。最后,我们将编写一些简短的脚本来自动进入我们的构建环境。这个过程可能看起来有点繁琐,但如果您花时间去做,它可以为您省去一些麻烦。
您将使用的程序
- apt-get
- debootstrap debootstrap @ Debian wiki
- chroot chroot @ Debian wiki
首先,设置一些目录。
这些目录将包含构建 Android ROM 所需的所有文件。
mkdir -p ~/android/system
/android 是我们将存储一些用于设置和进入构建环境的辅助脚本的目录
/android/system 是将创建稳定 chroot 环境的目录。
其次,获取一些依赖项。
如果您尚未安装 debootstrap,请安装它。
sudo apt-get install debootstrap
debootstrap 在您计算机上的一个目录中创建最小的 Debian 安装。
第三,运行 debootstrap。
更改目录到辅助脚本目录。
cd ~/android
运行 debootstrap 在系统目录中创建 Debian i386 安装。
sudo debootstrap --arch i386 wheezy system
或者,在系统目录中创建 Debian amd64 安装。
此命令的意思是“作为 root 用户,使用 wheezy 存储库在工作目录下的名为 system 的目录中为 i386 架构引导一个新的 Debian 安装。”
第四,挂载 /proc、/sys 和 /dev。
接下来,您需要挂载宿主文件系统的一些部分,以便使用您刚刚创建的系统。
sudo mount proc system/proc -t proc
sudo mount sysfs system/sys -t sysfs
sudo mount --bind /dev/pts ~/android/system/dev/pts
sudo mount --bind system/dev /dev
第五,进入 chroot 并允许它从 wheezy-backports 获取内容。
将本地 hosts 文件复制到开发环境
sudo cp /etc/hosts system/etc/hosts
将本地挂载的设备复制到开发环境。
sudo cp /proc/mounts system/etc/mtab
现在我们准备好进入 chroot 了。这次,我们只设置 wheezy-backports 存储库,更新安装,然后退出。
sudo chroot system
mkdir -p /home/android/
echo "
deb http://ftp.us.debian.org/debian/ wheezy-backports main
" >> /etc/apt/sources.list
echo "
APT::Default-Release "wheezy";
" > /etc/apt/apt.conf
apt-get update && apt-get dist-upgrade
wheezy-backports 存储库将作为补充,帮助您安装对处理 Android ROM 至关重要的软件。
第六,编写一些脚本自动进入 chroot。
我们没有配置在系统启动时自动启动 chroot 中的进程,所以每次我们都必须重新挂载宿主文件系统,并重新将宿主和挂载文件复制到 chroot 中。与其做所有这些,我们不如创建一个脚本,它将自动将您加载到 chroot 中。
在辅助脚本目录中创建一个包含进入 chroot 脚本的文件。
echo "#! /bin/sh
sudo mount proc ~/android/system/proc -t proc
sudo mount sysfs ~/android/system/sys -t sysfs
sudo mount -o bind /dev/pts ~/android/system/dev/pts
sudo mount -o bind /dev ~/android/system/dev
sudo cp /proc/mounts ~/android/system/etc/mtab
sudo cp /etc/hosts ~/android/system/etc/hosts
sudo chroot ~/android/system/ /bin/sh -c "cd /home/android && bash && CROSS_COMPILE=/home/android/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi- & echo "success ""
" > ~/android/enter.sh
使文件可执行。
chmod +x ~/android/enter.sh
最后,让我们回顾一下这些新脚本的工作流程。
要使用 enter.sh 脚本,您只需将目录更改到辅助脚本目录并运行 ./enter.sh。因为它使用 sudo,所以会要求您输入密码。
cd ~/android/
./enter.sh
退出 chroot 构建环境
退出 chroot。
输入 exit。
exit
安装构建依赖项
接下来,我们将在 chroot 中安装编译 Android ROM 的构建依赖项。
您将使用的程序
- apt-get
- ln
进入构建环境。
当您想要处理 Android ROM 时,您需要进入 chroot 开发环境。
既然您已经设置了 chroot 环境,请进入它。
cd ~/android
./enter.sh
设置构建依赖项
现在只需使用 apt 安装构建依赖项。
对于 386 构建环境,安装这些软件包。
apt-get install -t wheezy-backports bison flex git-core gperf \
libncurses-dev build-essential squashfs-tools openjdk-6-jre \
openjdk-6-jdk pngcrush wget zip zlib1g-dev lzma libxml2-utils \
build-essential libesd0-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 lzop \
xsltproc zip schedtool locales
对于 amd64 构建环境,也安装这些软件包。
apt-get install libc6-dev-i386 gcc-multilib g++-multilib lib32z1-dev \
lib32readline5-dev lib32ncurses5-dev
需要回顾的事情,解决库问题。
这是过程中可能需要一些推理的第一部分(尽管使用 386 chroot 应该可以缓解大多数问题)。一些发行版会将库文件放在您计算机上略有不同的目录中。如果您在编译 ROM 时遇到涉及缺少库的错误,这很可能是原因。解决这个问题将涉及在环境期望的位置为所需的库创建一个符号链接。
例如,如果您看到 zconf.h 丢失,您可能需要做类似的事情
sudo ln -s /usr/include/x86_64-linux-gnu/zconf.h /usr/lib/zconf.h
同样,如果 libstdc++.so 缺失,
sudo ln -s /usr/lib32/libstdc++.so.6.0.14 /usr/lib32/libstdc++.so
或者 libGL.so
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 \
/usr/lib/i386-linux-gnu/libGL.so
此命令的意思是作为 root,在编译器正在查找所需文件的目录中创建一个到所需文件的软符号链接。
不幸的是,很难确定您的特定构建环境期望这些库中的每一个在哪里。我将尽力在本文档中尽可能多地记录这些信息。
安装 repo
还需要安装一些程序,以便您获取源代码并成功构建。
待处理,仅通过 apt-get 安装 SDK 和 NDK
Android SDK 和 NDK 的部分内容已经作为标准的 Debian 软件包提供,不幸的是,这些工具的完整性并不明显。因此,我们将从源代码设置所有这些工具,而不是使用 apt 软件包。如果有人知道如何使用 apt 软件包而不是从源代码安装软件的更多信息,请告诉我。
让我们安装 repo
Repo 由 Google 创建,是一个工具,它使用称为清单的 xml 文件自动下载大量 git 源存储库。我将在本书的后半部分详细介绍 repo。
安装 repo 很简单,只需将文件下载到您的 /usr/bin 目录。
curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo
然后,使其可执行。
chmod a+x /usr/bin/repo
这会将 repo 直接安装到您的 /usr/bin/repo 路径中。Android 文档的安装方式不同,鼓励您将 repo 安装到主目录下的一个文件夹中,并将该文件夹添加到您的 $PATH 中,以方便更新。在 chroot 中,这不是必需的。
而且名字也挺扯淡的。这使得很难找到人们关于使用 repo 的论坛帖子,而不是搜索其他类型的仓库。Google,你可真会想。
安装 Android NDK 并将其添加到您的 PATH
您还需要 Android NDK 来编译您自己的 ROM。NDK 为 arm 设备生成二进制代码。
为了安装 NDK,请使用 wget 下载它。wget -O /home/NDK.tar.gz http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2 tar xvjf NDK.tar.gz CROSS_COMPILE=/home/android/android-ndk-r10/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
安装 adb, fastboot
您可能希望在主机计算机上安装 adb 和 fastboot,而不是在 chroot 开发环境中。这可以使用 apt 完成,或者通过从源代码安装 SDK 工具来完成。
在 chroot 开发环境之外,运行
sudo apt-get install android-tools*
或者,在 chroot 开发环境内部,运行
apt-get install android-tools
一个为您完成所有这些的一次性脚本
#! /bin/sh
mkdir -p ~/android/system
sudo apt-get install debootstrap
cd ~/android
echo "Do you want to use an i386 or amd64 build environment?"
select Arch in "i386" "amd64"; do
case $Arch in
i386 ) sudo debootstrap --arch i386 wheezy system; a=i386;
amd64 ) sudo debootstrap --arch amd64 wheezy system; a=amd64;
esac
done
sudo mount proc system/proc -t proc
sudo mount sysfs system/sys -t sysfs
sudo mount --bind system/dev /dev
sudo cp /etc/hosts system/etc/hosts
sudo cp /proc/mounts system/etc/mtab
sudo chroot system
mkdir -p /home/android/
echo "
deb http://ftp.us.debian.org/debian/ wheezy-backports main
" >> /etc/apt/sources.list
echo "
APT::Default-Release "wheezy";
" > /etc/apt/apt.conf
apt-get update && apt-get dist-upgrade
echo '#! /bin/sh
sudo mount proc ~/android/system/proc -t proc
sudo mount sysfs ~/android/system/sys -t sysfs
sudo mount -o bind /dev/pts ~/android/system/dev/pts
sudo mount -o bind /dev ~/android/system/dev
sudo cp /proc/mounts ~/android/system/etc/mtab
sudo cp /etc/hosts ~/android/system/etc/hosts
sudo chroot ~/android/system/ /bin/sh -c "cd /home/android && bash && CROSS_COMPILE=/home/android/android-ndk-r10/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc & echo "success""
' > ~/android/enter.sh
chmod +x ~/android/enter.sh
cd ~/android/
./enter.sh
exit
cd ~/android
./enter.sh
apt-get install -t wheezy-backports bison flex git-core gperf \
libncurses-dev build-essential squashfs-tools openjdk-6-jre \
openjdk-6-jdk pngcrush wget zip zlib1g-dev lzma libxml2-utils \
build-essential libesd0-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 lzop \
xsltproc zip schedtool locales
case a in
amd64 ) apt-get install libc6-dev-i386 gcc-multilib \
g++-multilib lib32z1-dev lib32readline5-dev lib32ncurses5-dev
esac
curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo
chmod a+x /usr/bin/repo
wget -O /home/NDK.tar.gz http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2
tar xvjf NDK.tar.gz
CROSS_COMPILE=/home/android/android-ndk-r10/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
echo "Install android-tools-* packages on the host machine or the build
machine?"
select tools in "host" "build"; do
case $Arch in
host ) sudo apt-get install android-tools*;
build )sudo chroot ~android/system apt-get install android-tools*
esac
done
进一步引用
构建依赖项安装,,Replicant Wiki,Replicant Project
初始化构建环境, Android 开发者指南,Google
延伸阅读
https://en.wikipedia.org/wiki/Chroot