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 ~/binvim ~/.bashrc 加入:
export PATH=$PATH:~/bin
然后:. ~/.bashrc
3.2.2下载repo
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repochmod +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_r1cd 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_r1repo 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_r1repo 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 7.1 源码下载编译 (Ubuntu 14.0.4 环境下)
- ubuntu下Android源码下载编译运行,单独编译运行
- Ubuntu下Android开发环境搭建及源代码下载、编译、运行
- Ubuntu环境下 Android平台源码的下载及编译
- Ubuntu环境Android平台源码下载及编译
- ubuntu环境:下载、编译模拟器平台android内核源码
- Ubuntu环境下 Android平台源码的下载及编译
- Ubuntu环境下 Android平台源码的下载及编译
- Ubuntu环境Android平台源码下载及编译 .
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码
- Ubuntu 9.10下的Android源码下载及编译
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码
- 【摘录】Ubuntu 10.04环境下载&编译Android-2.1_r2源代码
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码 1/2 分享
- Android平台源码下载以及编译--ubuntu 11.04
- Ubuntu下android源码编译环境搭建
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码
- ubuntu下载编译android源码(二)