Android 4.0.1 源代码编译

在学习应用编程时,为了实现应用在后台对其它界面的控制,需要将应用的权限提高到系统级。
但提高到系统级的方法,其中一个就是放在 Android 源代码目录中进行编译;另一个方法已经试过,但安装失败。
开始一直想直接从 Google 的网站上获取 Android 源代码,但由于大陆对 Google 的封锁,导致无法获取到。大家都通过 VPN 来获取,但一般 VPN 是需要费用的。
后来才将获取 Android 源代码的方向转向别人下载好,打包传到网上的。
先后从 XX 云盘下载了 3 个 Android 源代码压缩包,分别是:
repo.tar.gz 12.2GB
WORKING_DIRECTORY.tar 12.4GB 
android4.0.tar.gz 1.73GB
前两个还没有使用过,先使用 android4.0.tar.gz 进行了试验。

在 Ubuntu 中先解压 android4.0.tar.gz: tar -zxvf android4.0.tar.gz

安装 jdk-6u45-linux-i586.bin,从 Oracle 网站上下载,需要在 Oracle 注册。
获取 jdk-6u45-linux-i586.bin 下载网址的办法: google "jdk-6u45-linux" 得到的第一个搜索结果: 
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html
注意: 不用使用 Ubuntu 提供的 open-jdk 的版本。

安装过程:
(1) 赋予执行权限,在 terminal 中输入: chmod a+x jdk-6u45-linux-i586.bin
(2) 解压,在 terminal 中输入: ./jdk-6u45-linux-i586.bin
(3) 创建 jvm 目录,在 terminal 中输入: sudo mkdir /usr/lib/jvm
(4) 移动解压文件,在 terminal 中输入: sudo mv ~/AndroidSource/android4.0/jdk1.6.0_45 /usr/lib/jvm/jdk1.6.0_45
(5) 启用 jdk 6,在 terminal 中输入:
sudo ln -s -b /usr/lib/jvm/jdk1.6.0_45/jre/bin/java /etc/alternatives/java
sudo ln -s -b /usr/lib/jvm/jdk1.6.0_45/jre/bin/java /usr/bin/java
(6) 检验,在 terminal 中输入:java -version
结果应显示: 
java version "1.6.0_45"
(7) 编辑配置文件,在 terminal 中输入: sudo vim /etc/profile
在文件末尾添加如下条目: 
JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45                         
export JRE_HOME=/usr/lib/jvm/jdk1.6.0_45/jre   
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH   
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 
#set java environment
这里要根据自己的安装路径对以上内容进行修改!重启系统后java的环境就安装好了。
注: vim 操作指令,(1) Insert 按键;(2) : ; (3)! ; (4) w/q

开始编译 Android 源代码,进入目录: ~/AndroidSource/android4.0,依次输入如下指令:
#make installclean
#make clean
#source build/envsetup.sh
#lunch 选择版本号: lunch full-eng
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_maguro-userdebug
     5. full_tuna-userdebug
     6. full_panda-eng
Which would you like  [full-eng] 5
#make -j4 其中-j(n)表示用n核cpu编译

如果出错如下错误,按对应方法解决:
(1) Ubuntu bison:找不到命令
sudo apt-get install g++
(2) Ubuntu g++:找不到命令 
sudo apt-get install bison
(3) /usr/bin/ld: cannot find -lz
详细信息如下:
host C: libpng <= external/libpng/pngwtran.c
host C: libpng <= external/libpng/pngwutil.c
host StaticLib: libpng (out/host/linux-x86/obj/STATIC_LIBRARIES/libpng_intermediates/libpng.a)
host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] 错误 1
解决方法:    
更新了工具的安装,如下:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils xsltproc
可以继续编译。

错误1:
编译过程中出现一次提示: 进程被杀掉的错误,并终止的现象。
当时没有记录具体的错误,重新编译就 OK 了。
------重新执行: make -j2

错误2:
t_intermediates/src -api out/target/common/obj/PACKAGING/public_api.txt -nodocs
make: *** 正在等待未完成的任务....
make: *** [out/target/common/docs/api-stubs-timestamp] 错误 45
解决方法(使用方法2): 
(1) 网上一种解决方法(但我的 extenal 目录中没有 clearsilver 目录(有人说此方法适用于: Android 2.3))
是由于clearsilver在编译时如果检测到使用Java JDK 6,就使用64位编译。要避开此错误,需要修改下面四个文件: 
external/clearsilver/cgi/Android.mk 
external/clearsilver/java-jni/Android.mk 
external/clearsilver/util/Android.mk 
external/clearsilver/cs/Android.mk 
把这四个Makefile中的下列语句注掉即可: 
# This forces a 64-bit build for Java6 
# Comment by Easwy 
# LOCAL_CFLAGS += -m64 
# LOCAL_LDFLAGS += -m64 
然后在external/clearsilver目录中执行一下make clean,然后回到项目根目录,继续make即可。
(2) make clear/make update-api/make
(3) make: *** [out/target/common/docs/doc-comment-check-timestamp] 错误 45
解决方法:需要做个链接如下:
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/jar /bin/jar
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/java /bin/java
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/javac /bin/javac
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/javah /bin/javah
sudo ln -s /usr/lib/jvm/jdk1.6.0_45/bin/javadoc /bin/javadoc

错误:
prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-ar: out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a: No space left on device
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a] 错误 1
make: *** 正在删除文件“out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a”
原因: 空间不足导致编译中断

挂载一个 20G 的空分区,重新解压 android4.0.tar.gz: tar -zxvf android4.0.tar.gz
make installclean
make clean
make update-api
source build/envsetup.sh
make -j2

错误:
nd/m_demangle/cplus-dem.c:2865: error: undefined reference to ‘vgPlain_strcspn‘
prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: out/target/product/generic/obj/STATIC_LIBRARIES/libcoregrind-arm-linux_intermediates/libcoregrind-arm-linux.a(cplus-dem.o): in function gnu_special:external/valgrind/main/coregrind/m_demangle/cplus-dem.c:2926: error: undefined reference to ‘vgPlain_strpbrk‘
collect2: ld returned 1 exit status
make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/cachegrind-arm-linux_intermediates/LINKED/cachegrind-arm-linux] 错误 1
原因: 没有执行 lunch

错误: 
target StaticLib: libwebcore (out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a)
prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-ar: out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a: No space left on device
make: *** [out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a] 错误 1
make: *** 正在删除文件“out/target/product/tuna/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a”
/usr/bin/ld: final link failed: No space left on device
collect2: ld returned 1 exit status
make: *** 正在等待未完成的任务....
make: *** [out/host/linux-x86/obj/lib/libbcc.so] 错误 1

挂载一个 20G 的空分区后编译  Android 4.0.1 的源代码,仍然出现: No space left on device。所以一狠心,将现在用的 Ubuntu 虚拟机删除了,重建一个 80G 的虚拟机。
使用 Ubuntu 10.04,安装后不做任何升级。
以下是操作过程中对硬盘剩余空间的记录: 
(1) 80G 安装 Ubuntu 后剩余 69.7 GB
(2) 复制 android4.0.tar.gz 和 jdk-6u45-linux-i586.bin 后,解压: tar -zxvf android4.0.tar.gz 后剩余 61.4 GB
(3)准备好编译环境后(删除 android4.0.tar.gz 和 jdk-6u45-linux-i586.bin),剩余空间 62.9 GB
开始编译 Android 4.0.1 源代码。
如果编译过程中出现错误,只要编译环境的配置是正确的,就不要试着去解决它。只需要简单的重新编译即可!编译成功后,剩余的空间是 51.1 GB。
编译 Android 4.0.1 源代码,至少需要 18.6G 的硬盘空间。

编译成功结束时的 LOG: 
Target system fs image: out/target/product/tuna/obj/PACKAGING/systemimage_intermediates/system.img
in mkuserimg.sh PATH=out/host/linux-x86/bin/:/usr/lib/jvm/java-6-sun/bin:/usr/lib/jvm/jdk1.6.0_45/bin:/usr/lib/jvm/jdk1.6.0_45/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/leozheng/android4.0/out/host/linux-x86/bin:/home/leozheng/android4.0/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin:/home/leozheng/android4.0/development/emulator/qtools:/home/leozheng/android4.0/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin:/home/leozheng/android4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
make_ext4fs -s -l 685768704 -a system out/target/product/tuna/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/tuna/system
Creating filesystem with parameters:
    Size: 685768704
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 6976
    Inode size: 256
    Journal blocks: 2616
    Label: 
    Blocks: 167424
    Block groups: 6
    Reserved block group size: 47
Created filesystem with 904/41856 inodes and 41089/167424 blocks
Install system fs image: out/target/product/tuna/system.img
out/target/product/tuna/system.img+out/target/product/tuna/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p total size is 159017016

启动编译后的 Android 4.0.1 模拟器
[email protected]:~$ ls
android4.0  Documents  examples.desktop  Pictures  Templates
Desktop     Downloads  Music             Public    Videos
[email protected]:~$ cd android4.0/out/host/linux-x86/bin
按网上的说明,要进入 sdk 目录。但此目录不存在,会提示 bash: cd: sdk: No such file or directory
[email protected]:~/android4.0/out/host/linux-x86/bin$ ls
......
[email protected]:~/android4.0/out/host/linux-x86/bin$ ls em*
emulator  emulator-arm  emulator-ui  emulator-x86
[email protected]:~/android4.0/out/host/linux-x86/bin$ ./emulator
emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found.
If you are an Android SDK user, please use ‘@<name>‘ or ‘-avd <name>‘
to start a given virtual device (see -help-avd for details).

Otherwise, follow the instructions in -help-disk-images to start the emulator

[email protected]:~/android4.0/out/host/linux-x86/bin$ ./emulator list targets
invalid command-line parameter: list.
Hint: use ‘@foo‘ to launch a virtual device named ‘foo‘.
please use -help for more information
[email protected]:~/android4.0/out/host/linux-x86/bin$ ls an*
android
[email protected]:~/android4.0/out/host/linux-x86/bin$ android list targets
android: command not found
[email protected]:~/android4.0/out/host/linux-x86/bin$ ./android list targets
SWT folder ‘/home/leozheng/android4.0/out/host/linux-x86/framework/x86‘ does not exist.
Please export ANDROID_SWT to point to the folder containing swt.jar for your platform.
[email protected]:~/android4.0/out/host/linux-x86/bin$ export PATH=~/android4.0/out/host/linux-x86/bin:$PATH
[email protected]:~/android4.0/out/host/linux-x86/bin$ export ANDROID_PRODUCT_OUT=~/android4.0/out/target/product/generic
[email protected]:~/android4.0/out/host/linux-x86/bin$ emulator
emulator: ERROR: Can‘t access ANDROID_PRODUCT_OUT as ‘/home/leozheng/android4.0/out/target/product/generic‘
You need to build the Android system before launching the emulator
[email protected]:~/android4.0/out/host/linux-x86/bin$ cd ..
[email protected]:~/android4.0/out/host/linux-x86$ cd ..
[email protected]:~/android4.0/out/host$ cd ..
[email protected]:~/android4.0/out$ ls
casecheck.txt  CaseCheck.txt  host  target  versions_checked.mk
[email protected]:~/android4.0/out$ cd target/
[email protected]:~/android4.0/out/target$ ls
common  product
[email protected]:~/android4.0/out/target$ cd product
[email protected]:~/android4.0/out/target/product$ ls
tuna
[email protected]:~/android4.0/out/target/product$ cd tuna
[email protected]:~/android4.0/out/target/product/tuna$ ls
android-info.txt     kernel                    recovery.img
boot.img             obj                       root
clean_steps.mk       previous_build_config.mk  symbols
data                 ramdisk.img               system
fake_packages        ramdisk-recovery.img      system.img
installed-files.txt  recovery                  userdata.img
[email protected]:~/android4.0/out/target/product/tuna$ export ANDROID_PRODUCT_OUT=~/android4.0/out/target/product/tuna
[email protected]:~/android4.0/out/target/product/tuna$ emulator
模拟器启动成功,运行中...

如果提示:
emulator: WARNING: system partition size adjusted to match image file (152 MB > 66 MB)
emulator: WARNING: data partition size adjusted to match image file (135 MB > 66 MB)
emulator: emulator window was out of view and was recentered
如果在笔记本(1280*800分辨率)上用,skin的显示区域太大,键盘部分可能显示不全,给使用带来不便

以下网上记录的别人编译 Android V4.0.1 时遇到的问题与解决方法: 
(*1) usr/bin/ld: cannot find libncurses.so.5 cannot find -lGL
sudo apt-get install git-core gnupg flex bison gperfbuild-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libsx11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-devg++-multilib
解决方法:
sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so

(*2)
host SharedLib: lib64EGL_translator (out/host/linux-x86/obj/lib/lib64EGL_translator.so)
 /usr/bin/ld: cannot find -lGL
 collect2: ld returned 1 exit status
 make: *** [out/host/linux-x86/obj/lib/lib64EGL_translator.so] Error 1
 make: *** Waiting for unfinished jobs....
解决方法:
sudo apt-get install libglu1-mesa-dev

NDK 安装
http://developer.android.com/tools/sdk/ndk/index.html
ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk$ ./android-ndk-r10c-darwin-x86_64.bin

(*3) 
 host SharedLib: lib64EGL_translator (out/host/linux-x86/obj/lib/lib64EGL_translator.so)
 /usr/bin/ld: cannot find -lGL
 collect2: ld returned 1 exit status
 make: *** [out/host/linux-x86/obj/lib/lib64EGL_translator.so] Error 1
 make: *** Waiting for unfinished jobs....
解决方法 :
sudo apt-get install libglu1-mesa-dev

(*4) 
host StaticLib: libGLcommon (out/host/linux-x86/obj/STATIC_LIBRARIES/libGLcommon
 _intermediates/libGLcommon.a)
 host SharedLib: libGLES_CM_translator (out/host/linux-x86/obj/lib/libGLES_CM_tra
 nslator.so)
 /usr/bin/ld: cannot find -lGL
 collect2: ld returned 1 exit status
 make: *** [out/host/linux-x86/obj/lib/libGLES_CM_translator.so] Error 1
解决方法: 
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 /usr/lib/libGL.so

时间: 2024-10-23 23:43:04

Android 4.0.1 源代码编译的相关文章

android 7.0 (nougat)的编译优化-ninja

http://blog.csdn.net/songjam/article/details/52640501 版权声明:本文为博主原创文章,未经博主允许不得转载. 从官方的定义,ninja大大缩短了android系统的编译周期,android 7.0即nougat上已经默认使用,禁用方式: export USE_NINJA = false 从build/core/main.mk看,ninja要执行两遍main.mk的扫描,第一次执行导入android环境和产品的基本配置信息,但不扫描Android

[odroid-pc] ubuntu12.04 64bit Android4.0.3 源代码编译报错及解决办法

第一个错误: host Executable: cmu2nuance (out/host/linux-x86/obj/EXECUTABLES/cmu2nuance_intermediates/cmu2nuance) /usr/bin/ld: cannot find -lncurses collect2: ld returned 1 exit status make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Er

Ubantu16.04进行Android 8.0源码编译

分为4个流程 源码下载 构建编译环境 编译源码 运行 源码下载 安装git并且配置 //安装git sudo apt-get install git //配置git名称和邮箱 git config --global user.name "your name" git config --global user.email "[email protected]" 创建repo的bin目录和源码目录 创建repo的bin目录 midir ~/bin 创建源码目录 midi

现成Android 5.0系统源代码

让Android融入我的生活! 写Android一段时间了,每次看到网上一些大牛的博客.分析Android底层Zygote启动.Activity启动.View的绘制过程.SurfaceFlinger.AudioFlinger.Binder IPC.内存管理.Dalvik等等各种深入的东西,都很敬仰,自己一直想深入了解一下Android底层的东西.那么首先要解决的就是拿到全部源代码.昨天參照罗老师的方法安装Ubuntu.Git,可是一直获取不了,可能是Google的链接如今无法訪问了,也可能是自己

Android 5.0源码编译问题

转载: http://blog.csdn.net/shineflowers/article/details/41545057 如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是从别人那拷贝,然后自己编译,那么通常会出现下面的错误: No rule to make target 'external/chromium_org/third_party/a

android 5.0 Build.VERSION_CODES 无效

现在对android 5.0 api内部处理机制比较困惑.如果我的android app 使用 android 5.0版本进行编译,那么编译后的app是可以再android 5.0 和以后版本运行的.如果开发中配置(Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) 依然能有效,如果运行在其他比较老的设备(android系统版本比较老),该设备没有给 Build.VERSION_CODES.LOLLIPOP 定义,如果才能以一种通用的方式运

Android 6.0 源代码编译实践

http://www.judymax.com/archives/1087 Android 6.0 源代码编译实践 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 清华大学android镜像

Android # 4.0.x(1-3) 源码 下载 编译

Android 4.0源码下载方法:repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 官方下载页面:http://source.android.com/source/downloading.html Android SDK 4.0官方下载页面:http://developer.android.com/sdk/android-4.0.html android 4.0.3最新源码下载

Android 5.0 源代码结构

本节书摘来自异步社区<深入理解Android 5 源代码>一书中的第2章,第2.2节分析Android源代码结构,作者 李骏. 网址:https://yq.aliyun.com/articles/93279?spm=5176.100239.blogcont93310.17.gtBsUg 2.2 分析Android源代码结构 获得Android 5.0源代码后,源代码的全部工程分为以下3个部分. Core Project:核心工程部分,这是建立Android系统的基础,被保存在根目录的各个文件夹