• Android 4.1.1源码编译


    适用环境:

    系统:ubuntu-12.04.2-desktop-amd64

    JDKsun-java6-jdk

    Android源码:android_4.1.1_r1

     

    虚拟机安装:

    VMware Workstation版本:vmware-workstation-full-9.0.2-1031769

     

    安装前请大家切记BIOSVT功能,不开的话安装Ubuntu 64bit 是不允许的。

    我的电脑是HP pro 3380(实习生进来分配的机型)

    开启方式:Bios -> Security -> System Security -> enable VT

     

    开启后就可以安装VM并自行破解。

    注意:要先开启VT开安装VM,先安装VM再开启VT的话是不行的。

     

    Unbuntu安装

    版本:ubuntu-12.04.2-desktop-amd64.iso

    下载地址:下载

     

    注意:建议下载上面的版本,因为不同版之间的差异可能会引起一些不同问题。

    选择64位是因为Google Android 的源码编环境译默认是要在64bit系统上跑的,虽然可以修改mk文件让它可以在32bit系统上跑,但是比较麻烦且网上的修改方法都比较老,找不到适合Android 4.X 的修改方法。

     

    建议:

    内存设置到1.5G以上吧,不然很容易出现OOM

    硬盘大小设置为40G以上。

     

     

    详细安装过程省略....

     

    JDK安装:

     

    添加安装JDK6

    $sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"

    $sudo apt-get update

    $sudo apt-get install sun-java6-jdk

     

    采用在线安装,可以不用手动设置环境变量。

    控制台输入  java -version

    如下显示,则表示JDK安装成功:

     

     

    安装软件环境

    apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev  build-essential zip curl libncurses5-dev  libwxgtk2.8-dev   zlib1g-dev  xsltproc  libc6-dev-i386  libglu1-mesa:i386 lib32z1  libxml2-utils

     

    注意:其中红色的是解决自己在安装过程中遇到各种问题所用到的软件,在这里跟google推荐的软件(黑色的)一起装,可以避免遇到我同样的问题,可以少很多折腾。

     

     

     

    检查环境

    检查gccjdk的版本号是否正确:

    $gcc v

    $g++ -v

    $cc v

    $java version

    $javac version

     

    Ubuntu 12 默认自带g++和gcc,若您的系统不自带请先安装:

    $sudo apt-get install gcc-4.3 g++-4.3 gcc-4.3-multilib g++-4.3-multilib

     

     

    环境设置

    在控制台执行:

    gedit ~/.bashrc

    增加以下代码(要根据自己的实际情况修改):

     

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

    # set android environment

    ANDROID_DIR=/home/ccf/src

    ANDROID_CODE_ID=android_4.1.1_r1

    ANDROID_BUILD_TOP=${ANDROID_DIR}/${ANDROID_CODE_ID}

    ANDROID_PRODUCT_OUT=${ANDROID_BUILD_TOP}/out/target/product/generic

    ANDROID_SWT=${ANDROID_BUILD_TOP}/out/host/linux-x86/framework

    export PATH=${PATH}:${ANDROID_DIR}:${ANDROID_BUILD_TOP}:${ANDROID_PRODUCT_OUT}:${ANDROID_SWT}

     

    # set android sdk environment 

    export ANDROID_SDK_HOME=/home/ccf/eclipse/adt-bundle-linux-x86_64-20130717/sdk

    export PATH=${PATH}:${ANDROID_SDK_HOME}:${ANDROID_SDK_HOME/tools}

     

    # set android emulator environment

    ANDROID_EMULATOR=${ANDROID_BUILD_TOP}/out/host/linux-x86/bin

    export PATH=${PATH}:${ANDROID_EMULATOR}

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

    其中ccf是我的用户名。

    src是放源码文件夹的位置。

    android_4.1.1_r1是在src下源码问文件夹

     

     

    开始编译前的一些准备:

    1.设置swap大小:

     

    因为在编译源码的时候,占用内存是非常大的,Ubuntu默认的swap交换区是比较少了。

    这里我们把它设置大。

     

    sudo dd if=/dev/zero of=/boot/swapfile bs=1024 count=4194304

        sudo mkswap -v1 /boot/swapfile

        sudo swapon /boot/swapfile

        free

        sudo gedit /etc/fstab

        /boot/swapfile swap swap defaults 1 1

     

    在控制台执行  free命令,可以看到以下结果则说明设置成功

     

    2.避免因为Java虚拟内存问题导致编译失败

    在源码目录中找到:

    frameworks/base/tools/layoutlib/Android.mk
    将文件中的 
    $(hide) java -jar $(built_layoutlib_create_jar)  这行修改为如下:
    $(hide) java  -Xmx512M  -jar $(built_layoutlib_create_jar) 

     

     

    编译Android源码

    下载源码(具体下载参考网上教程)

     

    解压源码:
    tar xvf  android_4.1.1_r1.tgz

     

    得到以下文件夹

     

    用命令行进入android_4.1.1_r1  文件夹

     

    source build/envsetup.sh

    lunch sdk-eng

    make  -j4  (j代表线程数)

     

    最后出现Installed file list: out/target/product/generic/installed-files.txt表示编译成功。

     

    期间可能出现一些问题,我遇到的问题我会连同解决方法写在最后面,如果里面没有你遇到的问题,请自行谷歌吧。

     

    编译出来的东西会放在:

    /home/ccf/src/android_4.1.1_r1/out

     

     

    编译SDK

    source build/envsetup.sh

    lunch sdk-eng

    make sdk -j2  (j代表线程数)

     

    编译后的sdk

    /home/ccf/src/android_4.1.1_r1/out/host/linux-x86/sdk

    将自己编译出来的SDK放在/home/ccf/src/android_4.1.1_r1目录下。

    【注】copy出来是防止SDK被意外修改或后面编译ADT时被自动删掉。

     

     

     

    运行模拟器

    自进入源码目录下/home/ccf/src/android_4.1.1_r1

    运行下面命令:

    source build/envsetup.sh

    lunch sdk-eng

    emulator

     

    问题总结

    以下问题是我在编译过程中遇到比较典型的问题,并附有解决方法

     

    问题1. 

    Libz.so问题

    1.安装sudo apt-get install libglu1-mesa:i386

     

    2.安装sudo apt-get install lib32z1

    (要装这个,可能会提示缺少上面那个,所以要先装上面那个。)

    说明:GNU C Library: 32-bit shared libraries for AMD64

     

     

    问题2. 

    [out/target/product/generic/system/etc/apns-conf.xml] Error 127

    sudo apt-get install  libxml2-utils  

     xml相关的包。

     

     

     

    问题3.

    make:*** [out/target/common/obj/APPS/android.core.tests.libcore.package.com.no-core-tests-res_intermediates    /  noproguard.classes-with-local.dex] Killed

     

     默认的1GB的,所以,增加swap空间即可,执行命令如下:

     

        sudo dd if=/dev/zero of=/boot/swapfile bs=1024 count=4194304

     

        sudo mkswap -v1 /boot/swapfile

     

        sudo swapon /boot/swapfile

     

        free

     

        sudo vi /etc/fstab

     

        /boot/swapfile swap swap defaults 1 1

     

     

     

    问题4.

    出现make: *** [out/target/common/docs/offline-sdk-timestamp] 错误 45
    (又可能是你的linux下少安装了一些东西如果不是在看下面
    sudo apt-get install bison libc6-dev-amd64 g++-multilib 
    sudo apt-get install flex

    把这个目录删除:out/target/common/obj/JAVA_LIBRARIES/framework_intermediates
    make sdk

     

     

     

    问题5

     Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
     at java.util.Vector.<init>(Vector.java:111)
     at java.util.Vector.<init>(Vector.java:124)
     at org.antlr.analysis.DFA.createTransitionTableEntryForState(DFA.java:551)
     at org.antlr.analysis.DFA.createStateTables(DFA.java:440)
     at org.antlr.codegen.CodeGenerator.genLookaheadDecision(CodeGenerator.java:645)
     at org.antlr.grammar.v3.CodeGenTreeWalker.block(CodeGenTreeWalker.java:2876)
     at org.antlr.grammar.v3.CodeGenTreeWalker.rule(CodeGenTreeWalker.java:2382)
     at org.antlr.grammar.v3.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:1537)
     at org.antlr.grammar.v3.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:1441)
     at org.antlr.grammar.v3.CodeGenTreeWalker.grammar_(CodeGenTreeWalker.java:461)
     at org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:421)
     at org.antlr.Tool.generateRecognizer(Tool.java:655)
     at org.antlr.Tool.process(Tool.java:468)
     at org.antlr.Tool.main(Tool.java:93)
    make: *** [out/host/common/obj/JAVA_LIBRARIES/smali_intermediates/smaliLexer.java] 错误 
    解决:

    这个问题同样是提示java虚拟机内存的问题,解决的思路是一样的,但解决这个问题需要修改的是external/smali/smali/Android.mk

    这个mk文件,将Android.mk文件中的

    $(GEN): PRIVATE_CUSTOM_TOOL = java -jar $(ANTLR_JAR) -fo $(dir $@) $<.这行,修改为

    $(GEN): PRIVATE_CUSTOM_TOOL = java -Xmx512m  -jar $(ANTLR_JAR) -fo $(dir $@) $<.

     

     

    问题6.

     

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
     at java.util.zip.ZipOutputStream.getUTF8Bytes(ZipOutputStream.java:498)
     at java.util.zip.ZipOutputStream.writeLOC(ZipOutputStream.java:348)
     at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:179)
     at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:92)
     at com.android.tools.layoutlib.create.AsmGenerator.createJar(AsmGenerator.java:241)
     at com.android.tools.layoutlib.create.AsmGenerator.generate(AsmGenerator.java:225)
     at com.android.tools.layoutlib.create.Main.main(Main.java:98)
    make: *** [out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar] 错误 1
    make: *** 正在删除文件“out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar”
    解决:这个问题也是java虚拟机内存的问题,解决的方法是修改frameworks/base/tools/layoutlib/Android.mk
    将文件中的 
    $(hide) java -jar $(built_layoutlib_create_jar)  这行修改为如下:
    $(hide) java  -Xmx512M  -jar $(built_layoutlib_create_jar) 

     

     

    问题7.

    make: *** [out/target/common/obj/APPS/android.core.tests.libcore.package.dalvik.no-core-tests-res_intermediates/noproguard.classes-with-local.dex] Error 130

    上次make或或者mmm的时候生成一些错误的东西

    可以使用:make clean 再重新make

    解决:rm out/target/common/obj/APPS/ -r (如果还是有这样的错误,就只能clean了)

     

  • 相关阅读:
    正则表达式的与或非
    正则中需要转义的符号
    HTTP 错误状态码讯息
    HTTP协议详解
    TCP/IP、Http、Socket的区别
    CSS样式中标点符号的作用
    HighCharts: 设置时间图x轴的宽度
    可以尝试用Google Font API来摆脱网页字体的单调 仅仅抛砖引玉
    Oracle 权限(grant、revoke)
    网站加上图标
  • 原文地址:https://www.cnblogs.com/chenchuangfeng/p/3223476.html
Copyright © 2020-2023  润新知