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

Ubuntu14.04 32bit编译Android2.3.4源码全过程记录

2014-08-01 19:08 579 查看
在Ubuntu 14.04 32bit麒麟版上编译Android2.3.4源码全过程
真正地体会到:编译真是个苦力活,耗费一天的时间,终于将android2.3.4源码编译成功!为此将此过程中遇到的问题详细记录如下,特供大家参考!

环境:Android2.3.4源码+Ubuntu14.04 32 位+jdk1.6(现在官网上要注册才能下载,为此将jdk安装包贡献给大家)

源码和jdk请见附件,有需要的可以自行下载!

本人以root权限登录的,所以涉及到权限的问题,命令前面无须添加sudo。

问题列表:

PS:android源码编译需要Ubuntu 64bit环境,因此需要修改,方法很简单,在此不啰嗦了,请google即可。

[1] frameworks/base/include/utils/KeyedVector.h:193:31: error: ‘indexOfKey’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]

ssize_t i = indexOfKey(key);

cc1plus: warning: unrecognized command line option "-Wno-format-y2k-fpermissive" [enabled by default]

make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] 错误 1

Fix:

frameworks/base/tools/aapt/Android.mk

在第31行后面增加一行:

LOCAL_CFLAGS += -fpermissive

[2] /bin/bash: flex: 未找到命令

缺什么命令,就添加什么命令!

Fix :apt-get install flex

[3] build/tools/merge-event-log-tags.py 权限不够

chmod 777 build/tools/merge-event-log-tags.py

[4] Error:

external/srec/tools/thirdparty/OpenFst/fst/lib/cache.h:136:11: note: use ‘this->SetState’ instead

make: *** [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile.o] Error 1

Fix:

cd external/srec

wget "https://github.com/CyanogenMod/android_external_srec/commit/4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff"

patch -p1 < 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff

rm -f 4d7ae7b79eda47e489669fbbe1f91ec501d42fb2.diff

cd ../..

[5] /usr/bin/ld: cannot find -lncurses

host Executable: adb (out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb)

/usr/bin/ld: cannot find -lncurses

collect2: ld returned 1 exit status

make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1

解决方法:sudo apt-get install libncurses5-dev

[6] 错误1:out/host/linux-x86/obj/SHARED_LIBRARIES/libdvm_intermediates/native/dalvik_system_Zygote.o

解决方法:

vm/native/dalvik_system_Zygote.c

#include "Dalvik.h"

#include "native/InternalNativePriv.h"

下面加上一行:

#include <sys/resource.h>

[7] arm-eabi-gcc: error trying to exec 'cc1': execvp: No such file or directorymake: *** [out/target/product/generic/obj/lib/crtbegin_dynamic.o] 错误 1

Fix:gcc g++版本过高,应该都降级为4.4才行

$sudo apt-get install g++-4.4

$sudo apt-get install g++-4.4-multilib

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

$sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 60

$sudo update-alternatives --config g++

Selection Path Priority Status

------------------------------------------------------------

* 0 /usr/bin/g++-4.6 60 auto mode

1 /usr/bin/g++-4.4 40 manual mode

2 /usr/bin/g++-4.6 60 manual mode

选择1.

如果想改为高版本的随时用update-alternatives --config 命令切换!

修改后第一次编译仍然存在错误,第二次编译就没有错误了,具体原因我也不清楚。

[8] 没有规则可以创建“out/target/product/generic/obj/SHARED_LIBRARIES/libcameraservice_intermediates/LINKED/libcameraservice.so”需要的目标“out/target/product/generic/obj/lib/libcamera.so”。 停止

修改/home/Android-2.3.4/frameworks/base/services/camera/Android.mk

LOCAL_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

[9] sh: 1: gperf: not foundcalling gperf failed: 32512 at ./makeprop.pl line 96.

Fix:apt-get install gperf

[10] out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/HTMLNames.h

Fix:sudo apt-get install libswitch-perl

[11] out/target/product/generic/obj/EXECUTABLES/BufferQueue_test_intermediates/BufferQueue_test.o

Fix:

其实是读取错文件了,你把正确文件拷贝过去就ok了

# cp system/media/opensles/libopensles/OpenSLESUT.h system/media/opensles/include/SLES/OpenSLESUT.h

[12] target Executable: BufferQueue_test (out/target/product/generic/obj/EXECUTABLES/BufferQueue_test_intermediates/LINKED/BufferQueue_test)

out/target/product/generic/obj/lib/libOpenSLES.so: undefined reference to `typeinfo for android::SortedVectorImpl'

out/target/product/generic/obj/lib/libOpenSLES.so: undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info'

collect2: ld returned 1 exit status

make: *** [out/target/product/generic/obj/EXECUTABLES/BufferQueue_test_intermediates/LINKED/BufferQueue_test] 错误

Fix:change system/media/opensles/libopensles/IAndroidEffect.c to IAndroidEffect.cpp

$mv IAndroidEffect.c IAndroidEffect.cpp

Android.mk change IandroidEffect.c to IAndroidEffect.cpp

Generated: (out/target/product/generic/android-info.txt)

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

执行make sdk 将编译后的代码打包成sdk

Package SDK: out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86.zip

运行android模拟器

过程虽然简单,但是遇到各种问题,也花了将近2个小时,不过最后还是成功了!

我执行了如下的代码

首先配置环境变量:

gedit /etc/profile

export ANDROID_BUILD_TOP=/home/Android-2.3.4/

export ANDROID_PRODUCT_OUT=/home/Android-2.3.4/out/target/product/generic

export ANDROID_PRODUCT_OUT_BIN=/home/Android-2.3.4/out/host/linux-x86/bin

export PATH=$PATH:/home/Android-2.3.4/out/host/linux-x86/

source /etc/profile

启动模拟器:

由于模拟器的默认kernel路径有问题,所以需要加上正确的kernel路径才能成功启动。

root@user:/home/Android-2.3.4# emulator

emulator: ERROR: bad workspace: cannot find prebuilt kernel in: /home/Android-2.3.4//prebuilts/qemu-kernel/arm/kernel-qemu

root@user:/home/Android-2.3.4# emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu









Android2.3.3源码下载地址:http://pan.baidu.com/s/1bnjaTkF 密码:a7pq
JDK 1.6下载地址:
http://pan.baidu.com/s/1i3rCiIp Android4.0源码地址:
http://pan.baidu.com/s/1qWDI9PU 密码:ntca
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: