前言
为了使想学习Android源码、Framwork层的同学们,能够快速入门。现将我最近通过学习各种网络资源而成功编译安装的全部过程分享给大家,互相切磋、学习、交流、分享!在此特别感谢网友的慷慨分享!
准备
为了使Android源码编译快速顺利通过,使用提前下载好的资源,以root身份进入系统,进行安装,保证小白也能学会。
第一步:资源准备:
1.虚拟机(32位)版本:VMware-workstation-full-11.0.0-2305329_13808_BDdl.exe
2.Linux系统(32位)版本:Ubuntukylin-14.04-desktop-i386.iso
3.JDK1.6(32位)版本:java1.6.0_23.tar.gz
4.安卓系统(2.3.4)版本:Android-2.3.4-fs-20121011.tar.gz
下载链接:http://pan.baidu.com/s/1dDjbzBN 密码:pmdc(解压后,Android-2.3.4目录下面有java1.6.0_23.tar.gz压缩包)
第二步:资源安装:
1.虚拟机安装
虚拟机安装比较简单,一路点击下一步即可。注册码,百度一下就ok;
2.linux系统安装
Ubuntu14.04默认安装,一路下一步。
配置关键点:1或2个核cpu,3G内存,30G硬盘,关闭3D加速(如果机子配置较低,请关掉3D加速,否则,会导 致装好后桌面上左侧和顶部菜单栏呈黑色,耽误时间呀~~)
3.JDK安装:(简单期间,安装在/opt/目录)
3.1
ctrl+alt+t打开命令行界面,执行"sudo -s"命令,切换到root身份。
3.2
执行"chmod 777 /opt"命令,把opt目录权限放开。
3.3
把压缩包解压到opt目录下。
3.4
配置环境变量
执行“gedit /etc/profile”命令,在文件的末尾加上如下内容:
# for javaexport JAVA_HOME=/usr/lib/jvm/jdk1.6.0_23
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
保存并关闭文件。
使设置生效命令: source /etc/profile
测试命令 :java -version
4.安卓源码编译
把安卓源码压缩包解压到opt目录下,在命令行,以root管理员身份,切换到安卓目录下。执行make命令。开始编译。如果,顺利的话,就可以等待成功了!一般需要2个小时左右。
第三步:解决编译错误
事实上,往往会有很多错误出现,不过不要气馁,这些错误都是前辈们,走过的弯路。我们可以百度学习之。
接下来我把常遇到的错误及解决办法罗列出来:
头条: 安装编译过程中必需软件 。根据网上高人的经验,这是编译的最小工具软件集。
$sudo apt-get install build-essential
$sudo apt-get install zlib1g-dev
$sudo apt-get install flex
$sudo apt-get install libncurses-dev
$sudo apt-get install libx11-dev
$sudo apt-get install gperf
error1:
build/core/main.mk:73: You are attempting to build on a 32-bit system.
build/core/main.mk:74: Only 64-bit build environments are supported beyond froyo/2.2.
这是因为froyo/2.2默认只支持64-bit编译环境,当然你也可以重新安装64位(AMD64)系统,可以正常编译,但很麻烦。
解决方法:
1、修改Android.mk配置文件
将以下位置的几个配置文件:
./external/clearsilver/cgi/Android.mk
./external/clearsilver/cs/Android.mk
./external/clearsilver/java-jni/Android.mk
./external/clearsilver/util/Android.mk
文件中的
LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64
m64替换m32(或者注释掉,然后重写也可以)
LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32
2、修改main.mk
再将./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch)))
改为:
ifneq (i686,$(findstring i686,$(build_arch)))
error2:
make: *** [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] Error 1
解决方法:cd external/srec
wget "https://github.com/CyanogenMod/android_external_srec/commit/4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff"
patch -p1 < 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
rm -f 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff
cd ../..
error3:
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libdvm_intermediates/native/dalvik_system_Zygote.o] Error 1
解决方法:gedit dalvik/vm/native/dalvik_system_Zygote.c
#include <sys/resource.h>error4:
host C++: post_trace <= sdk/emulator/qtools/post_trace.cpp
cc1plus: all warnings being treated as errors
make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1此处编译错误是由于ubuntu 11.10采用了GCC4.6.1导致的。
解决方法:
修改源码目录下/build/core/combo/HOST_linux-x86.mk文件: 将以下语句
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 修改为
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0error5:
make: *** No rule to make target `out/target/product/generic/obj/lib/libcamera.so', needed by `out/target/product/generic/obj/SHARED_LIBRARIES/libcameraservice_intermediates/LINKED/libcameraservice.so'. Stop.
frameworks/base/services/camera/Android.mk
修改/home/Android-2.3.4/frameworks/base/services/camera/Android.mkLOCAL_PATH:= $(call my-dir)
# Set USE_CAMERA_STUB if you don't want to use the hardware camera.
# force these builds to use camera stub only
ifneq ($(filter sooner generic sim,$(TARGET_DEVICE)),)
USE_CAMERA_STUB:=true
endif
USE_CAMERA_STUB:=true
ifeq ($(USE_CAMERA_STUB),)
USE_CAMERA_STUB:=true
endif
error6:
Can't locate Switch.pm in @INC (you may need to install the Switch module)
(@INC contains:
external/webkit/WebCore/bindings/scripts
/etc/perl /usr/local/lib/perl/5.18.2
/usr/local/share/perl/5.18.2
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.18
/usr/share/perl/5.18
/usr/local/lib/site_perl .)
at external/webkit/WebCore/dom/make_names.pl line 38.
BEGIN failed--compilation aborted at external/webkit/WebCore/dom/make_names.pl line 38.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/HTMLNames.h] Error 2
make: *** Waiting for unfinished jobs....
Can't locate Switch.pm in @INC (you may need to install the Switch module) (@INC contains: external/webkit/WebCore/bindings/scripts /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at external/webkit/WebCore/dom/make_names.pl line 38.
BEGIN failed--compilation aborted at external/webkit/WebCore/dom/make_names.pl line 38.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/HTMLElementFactory.h] Error 2apt-get install libswitch-perl
error7:
In file included from external/v8/src/checks.h:31:0,
from external/v8/src/v8.h:57,
from external/v8/src/assembler.cc:35:
/usr/include/string.h:46:14: note: ‘void* memcpy(void*, const void*, size_t)’ declared here, later in the translation unit
extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
^
make: *** [out/host/linux-x86/obj/EXECUTABLES/mksnapshot_intermediates/src/assembler.o] Error 1在ubuntu 11.10(12.04)下,gcc、g++的版本是 4.6.1,编译之前应先把版本降到4.4;
否则编译 android 4.0 会出现很多意想不到的问题。
先下载4.4版本的gcc、g++:
sudo apt-get install gcc-4.4
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
此时可以使用 gcc -v、g++ -v 命令分别查看gcc、g++当前使用的版本已为4.4了!error8:
target thumb C++: backup_helper_test <= frameworks/base/tests/backup/backup_helper_test.cpp
target thumb C: gpustate <= frameworks/base/opengl/tests/angeles/gpustate.c
system/media/opensles/tests/automated/BufferQueue_test.cpp: In function 'void CheckErr(SLresult)':
system/media/opensles/tests/automated/BufferQueue_test.cpp:55: error: 'slesutResultToString' was not declared in this scope
make: *** [out/target/product/generic/obj/EXECUTABLES/BufferQueue_test_intermediates/BufferQueue_test.o] Error 1
make: *** Waiting for unfinished jobs....
target thumb C++: gtest-filepath_test <= external/gtest/test/gtest-filepath_test.cc
target thumb C++: gtest-death-test_test <= external/gtest/test/gtest-death-test_test.cc
Fix:其实是读取错文件了,你把正确文件拷贝过去就ok了
# cp system/media/opensles/libopensles/OpenSLESUT.h system/media/opensles/include/SLES/OpenSLESUT.h
编译结束: 第一次编译要等待比较久的时间,编译成功后,可以看到下面的输出:
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
Installed file list: out/target/product/generic/installed-files.txt
第四步: 编译SDK。
1. 编译。
执行以下命令: make sdk
2. 配置环境变量:执行以下命令:
export PATH=$PATH:~/Android/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=~/Android/out/target/product/generic
其中,~/Android/out/host/linux-x86/bin有我们要执行的emulator命令,而~/Android/out/target/product/generic是Android镜 像存放目录,下面执行emulator命令时会用到。
3. 运行模拟器。
执行以下命令:emulator
恭喜你,已经成功!出现下图: