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

来源:互联网 发布:高仿耐克鞋淘宝店 编辑:程序博客网 时间:2024/05/16 18:03

Ubuntu 14.04 32bit麒麟版上编译Android2.3.4源码全过程

真正地体会到:编译真是个苦力活,耗费一天的时间,终于将android2.3.4源码编译成功!为此将此过程中遇到的问题详细记录如下,特供大家参考!

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

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

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

问题列表:

PSandroid源码编译需要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 

Fixgcc 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 


0 0
原创粉丝点击