您的位置:首页 > 移动开发 > Android开发

android-2.3.1源码 下载,编译,运行(编译环境ubuntu17.10)

2018-01-03 12:05 936 查看

1.前言

最近想学android,打算从源码编译入手。几番折腾终于编译成功,记录下过程,留个纪念。

2.环境准备

2.1 官方对android源码编译环境的要求

2.1.1 硬件要求

编译2.3.x以上的版本需要64位系统
磁盘空间需要100G以上

2.1.2 操纵系统要求:

Android版本编译需要的Ubuntu最低版本
Android 6.0(Marshmallow)- AOSP master Ubuntu 14.04(Trusty)
Android 2.3.x(Gingerbread) - Android 5.x(Lollipop)Ubuntu 12.04 (Precise)
Android 1.5(Cupcake)-Android 2.2.x(Froyo)
Ubuntu 10.04(Lucid)

2.1.3 JDK 要求:

Android版本编译需要的JDK版本
Android 7.0 (Nougat) - Android 8.0 (O release) OpenJDK 8
Android 5.x (Lollipop) - Android 6.0 (Marshmallow) OpenJDK 7
Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat)Java JDK 6
Android 1.5 (Cupcake) - Android 2.2.x (Froyo) Java JDK 5

2.1.4 GNUMake版本要求:

Android 4.0.x (Ice Cream Sandwich) 及以下的版本需要make 3.82版本


2.2 我的编译环境搭建

由上面可知,编译android-2.3.1 需要的环境为:

ubuntu 12.04或者以上版本(我使用的是 ubuntu17.10),jdk6,gnumake 3.82,gcc 4.4.7(
我使用gcc7报错 “”rameworks/base/tools/aapt/XMLNode.cpp:315:47: error: invalid conversion from ‘const uint16_t* {aka const short unsigned
int*}’ to ‘const char16_t*’ [-fpermissive]“,改用gcc 4.4.7后,正常)

2.2.1 操作系统安装

我使用的是windows7 旗舰版 64位,然后在windows上安装虚拟机,再在虚拟机上安装 ubuntu17.10
虚拟机我用的是 Virtual Box 5.2.4。

小技巧:
建议 Virtual Box  配置双网卡模式,一块网卡设置“NAT模式”,用来让ubuntu上网。
另一块网卡设置“桥接模式”,用来ssh登录ubuntu,以及用 samba访问ubuntu的文件。
这样就可以在windows下查看源码(linux下vim写代码很爽,但是看代码个人觉得在windows用 Source Insight更方便一点),在ubuntu中编译源码。



2.2.2 安装gcc 4.4.7

尝试使用源码安装,未能成功,于是使用二级制安装

添加源:

vim /etc/apt/sources.list

加入如下内容:

deb http://dk.archive.ubuntu.com/ubuntu/ trusty main universe

deb http://dk.archive.ubuntu.com/ubuntu/ trusty-updates main universe

然后 sudo apt-get update && sudo apt-get install g++-4.4

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 40

sudo update-alternatives --config gcc

选择gcc-4.4对应的序号, 如图:



我选的1

测试设置gcc是否成功:

gcc -v
输出如图:



然后 cd /usr/bin/ && sudo ln -s gcc cc && cd -

最后 gcc -v,cc -v, g++ -v 确认都是 4.4.7版本即可。

2.2.3 安装jdk6

下载JDK6地址:
 http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html

将下载的 jdk-6u45-linux-x64.bin,放入 /opt目录,然后
./jdk-6u45-linux-x64.bin 解压

然后设置环境变量

vim ~/.bashrc 加入:
export JAVA_HOME=/opt/jdk1.6.0_45

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

最后验证:
ndk@kun:~/jdk1.6.0_45$ java -version

java version "1.6.0_45"

2.2.4 安装make 3.8.1

我使用make 3.8.2 make时出现段错误,使用make 3.8.1 无此问题

下载地址: https://ftp.gnu.org/gnu/make/
解压后 .
./configure && make &&  sudo make install 

make命令 默认装在/usr/local/bin目录。

ndk@kun:~/android_source/android-2.3.1_r1$ make -v

GNU Make 3.81

2.2.5 安装官网要求的其他依赖

sudo apt-get install git-core gnupg flex bison gperf  zip curl zlib1g-dev gcc-4.4-multilib g++-4.4-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip libswitch-perl

注意: 这里安装的和官网上的
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

略有区别。

不要再 apt-get install build-essential,这会再次安装g++7,覆盖掉之前安装的g++4.4

3.源码下载
需要预先装好 git,curl。

3.1 官方途径

需要梯子,略。
官网提供的下载教程: https://source.android.com/setup/downloading

3.2使用清华大学镜像

镜像官网: https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

3.2.1新建bin目录并加入环境变量

mkdir ~/bin

vim ~/.bashrc  加入:

export PATH=$PATH:~/bin

然后:.  ~/.bashrc

3.2.2下载repo

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo

chmod +x ~/bin/repo

3.2.3设置REPO_URL

vim ~/.bashrc 加入:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

然后 . ~/.bashrc

3.2.4新建源码存放目录

mkdir -p android_source/android-2.3.1_r1 

 cd android_source/android-2.3.1_r1/

后面的操作,不作说明的话,都在这个目录执行。

3.2.5同步源码

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b  android-2.3.1_r1

repo sync -j4

注: -b android-2.3.1_r1  意思是指定下载android-2.3.1_r1, 下载其他版本android源码则:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b  android版本号

查看android版本号的链接: https://source.android.com/setup/build-numbers#source-code-tags-and-builds
可能遇到的错误:

如果git没设置,会提示需要设置git。
执行:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

即可

遇到网络错误导致中断后,再次执行repo sync -j4即可。

这里有一个 罗老师的 自动下载脚本:

3.2.6 如何切换到其他版本

repo init -b android-4.0.4_r1

repo sync -j4

4 源码编译

直接在源码目录执行 make -j8,开始编译,然后就是漫长的等待。。。。
ndk@kun:~/android_source/android-2.3.1_r1$ make -j8

直到



我在编译的过程遇到的错误,及解决方案如下:

错误:
error: storage size of ‘rlim’ isn’t known

  
解决方案:

 vim ./dalvik/vm/native/dalvik_system_Zygote.c

 #include <signal.h>

+++#include <sys/resource.h>

 #include <sys/types.h>

 

错误:
external/v8/src/runtime.cc:4828: error: expected primary-expression before ‘typeof’

 

解决方案:
vim  external/v8/src/conversions-inl.h

---#include <math.h>

#include <float.h>         // required for DBL_MAX and on Win32 for finite()

#include <stdarg.h>
+++#include <cmath>

+++using namespace std;

错误:
prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/../lib/gcc/arm-eabi/4.4.3/../../../../arm-eabi/bin/ld: error: out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a(PreloadScanner.o): multiple definition of 'findEntity(char
const*, unsigned int)'

解决方案:
vim ./out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/html/HTMLEntityNames.c

---const struct Entity *findEntity (register const char *str, register size_t len)

+++inline const struct Entity *findEntity (register const char *str, register size_t len)

5 运行android 模拟器

源码编译出的镜像可以用 模拟器(emulator)来运行,emulator 在目录 ./out/host/linux-x86/bin/emulator。可以将该目录加入 PATH,方便使用。

vim ~/.bashrc

加入:
export PATH=${JAVA_HOME}/bin:$PATH:~/bin:/home/ndk/android_source/android-2.3.1_r1/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/ndk/android_source/android-2.3.1_r1/out/target/product/generic

ANDROID_PRODUCT_OUT 这个变量的作用后面再解释。

在终端运行 emulator 出现如下画面,即大功告成



我在运行emulator时,遇到如下错误:

SDL init failure, reason is: No available video device

解决办法:

sudo apt-get install libsdl1.2debian:i386。

环境变量: ANDROID_PRODUCT_OUT 解释:

运行emulator,需要Linux Kernel,system.img,userdate.img,ramdisk.img 4个文件

如果不设置 ANDROID_PRODUCT_OUT,则需要设置以上4个文件的路径

emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system ./out/target/product/generic/system.img -data ./out/target/product/generic/userdata.img -ramdisk ./out/target/product/generic/ramdisk.img 。

如果设置了ANDROID_PRODUCT_OUT,emulator不带参数运行时,会默认 使用./prebuilt/android-arm/kernel/kernel-qemu,以及ANDROID_PRODUCT_OUT目录下的 system.img,userdate.img,ramdisk.img。

6 在android源码环境开发自己的app

(1)准备好app代码
将写好的代码放入 ./packages/experimental 目录。
我的路径是:
/home/ndk/android_source/android-2.3.1_r1/packages/experimental

代码可参考该目录下其他app来写。这里提供一个我写好的 HelloWorld工程
链接:
点击打开链接

解压后放入该目录即可

(2)编译
回到源码根目录,我的是 /home/ndk/android_source/android-2.3.1_r1
执行 . build/envsetup.sh

然后 mmm ./packages/experimental/HelloWorld/
mmm 后面加需要编译的模块的目录,即可编译该模块。
编译成功后输出:



可知编译出的apk放在 out/target/product/generic/system/app/目录.

(3)将apk打包到镜像:
make snod

看到如下输出:



(4)打开模拟器
执行 emulator ,即可运行app。







(5)查看日志:

ndk@kun:~/android_source/android-2.3.1_r1$ adb shell 

# logcat

这行:D/HelloWorld(  324): hello,既是我们的app输出的日志

5 安装用IDE编的APP

android版本,API levels,NDK版本对应关系
https://source.android.com/setup/build-numbers
待续。。。。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android源码编译