虚拟机编译android
2012-11-12 22:38:23 BENKG 阅读数 921

修改:

android2.3.4_GB_T34/build/core/main.mk


#ifneq (64,$(findstring 64,$(build_arch)))    //打开这个注释

ifneq (i686,$(findstring i686,$(build_arch)))     //将这行注释起来
$(warning ************************************************************)
$(warning You are attempting to build on a 32-bit system.)
$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

$(warning ************************************************************)

修改/android2.3.4_GB_T34/external/clearsilver/目录下

cgi/Android.mk:16:#LOCAL_CFLAGS += -m64
cgi/Android.mk:17:#LOCAL_LDFLAGS += -m64
cgi/Android.mk:21:# uses a 32-bit toolchain that can't handle -m64
cs/Android.mk:12:#LOCAL_CFLAGS += -m64
cs/Android.mk:13:#LOCAL_LDFLAGS += -m64
cs/Android.mk:17:# uses a 32-bit toolchain that can't handle -m64
java-jni/Android.mk:37:#LOCAL_CFLAGS += -m64
java-jni/Android.mk:38:#LOCAL_LDFLAGS += -m64
java-jni/Android.mk:42:# uses a 32-bit toolchain that can't handle -m64
util/Android.mk:21:#LOCAL_CFLAGS += -m64
util/Android.mk:22:#LOCAL_LDFLAGS += -m64
util/Android.mk:26:# uses a 32-bit toolchain that can't handle -m64

将上面这些注释去掉

并且将m32注释起来

cgi/Android.mk:18:LOCAL_CFLAGS += -m32
cgi/Android.mk:19:LOCAL_LDFLAGS += -m32
cs/Android.mk:14:LOCAL_CFLAGS += -m32
java-jni/Android.mk:39:LOCAL_CFLAGS += -m32
java-jni/Android.mk:40:LOCAL_LDFLAGS += -m32
util/Android.mk:23:LOCAL_CFLAGS += -m32
util/Android.mk:24:LOCAL_LDFLAGS += -m32




2010-04-14 21:55:00 free2o 阅读数 2432

  可以修改SDK 的 image 文件,让这些image 直接到自己编译的image 目录下面,这样可以在模拟器中直接运行自己修改、编译的image 文件了。 在修改代码之后,要执行 make sdk 来编译生成新的SDK。

  我使用的android 的版本是 1.6 的,故做如下修改使得模拟器所用的image 为编译生成的image。

  1. 到 android-sdk-windows/platforms/android-1.6 目录下把 “data", "images", "templates", "samples" 四个目录重新改个名字。

  2. 在创建软连接到这四个目录:

ln -s /myandroid/out/host/linux-x86/sdk/android-sdk-eng/platforms/android-1.6/samples samples

ln -s /myandroid/out/host/linux-x86/sdk/android-sdk-eng/platforms/android-1.6/images/ images

ln -s /myandroid/out/host/linux-x86/sdk/android-sdk-eng/platforms/android-1.6/templates templates

ln -s /myandroid/out/host/linux-x86/sdk/android-sdk-eng/platforms/android-1.6/data/  data
 这样就可以直接用虚拟机来运行自己修改编译的image 文件了。 

2017-05-02 22:25:00 weixin_34364135 阅读数 0

本节书摘来自异步社区《深入解析Android 虚拟机》一书中的第1章,第1.4节,作者:钟世礼著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.4 编译Android Kernel

编译Android Kernel代码就是编译Android内核代码,在进行具体编译工作之前,需要先了解在Android开源系统中包含的以下3部分代码。

仿真器公共代码:对应的工程名是kernel/common.get。
MSM平台的内核代码:对应的工程名是kernel/msm.get。
OMAP平台的内核代码:对应的工程名是kernel/omap.get。
在本节的内容中,将详细讲解编译上述Android Kernel的基本知识。

1.4.1 获取Goldfish内核代码
Goldfish是一种虚拟的ARM处理器,通常在Android的仿真环境中使用。在Linux的内核中,Goldfish作为ARM体系结构的一种“机器”。在Android的发展过程中,Goldfish内核的版本也从Linux 2.6.25升级到了Linux 3.4,此处理器的Linux内核和标准的Linux内核有以下3个方面的差别。

Goldfish机器的移植。
Goldfish一些虚拟设备的驱动程序。
Android中特有的驱动程序和组件。
Goldfish处理器有两个版本,分别是ARMv5和ARMv7,在一般情况下,只需使用ARMv5版本即可。在Android开源工程的代码仓库中,使用git工具得到Goldfish内核代码的命令如下所示:

$ git clone git://android.git.kernel.org/kernel/common.git
在其Linux源代码的根目录中,配置和编译Goldfish内核的过程如下所示:

$make ARCH=arm goldfish_defconfig .config
$make ARCH=arm CROSS_COMPILE={path}/arm-none-linux-gnueabi-

其中,CROSS_COMPILE的path值用于指定交叉编译工具的路径。

编译结果如下所示:

LD vmlinux
SYSMAP system.map
SYSMAP .tmp_system.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC arch/arm/boot/compressed/misc.o
LD arch/arm/boot/compressed/vmlinux
   OBJCONPY arch/arm/boot/zImage
   Kernel: arch/arm/boot/zImage is ready

vmlinux:是Linux进行编译和连接之后生成的Elf格式的文件。
Image:是未经过压缩的二进制文件。
piggy:是一个解压缩程序。
zImage:是解压缩程序和压缩内核的组合。
在Android源代码的根目录中,vmlinux和zImage分别对应Android代码prebuilt中的预编译的ARM内核。使用zImage可以替换 prebuilt中的“prebuilt/android-arm/”目录下的goldfish_defconfig,此文件的主要片断如下所示:

CONFIG_ARM=y
#
# System Type
#
CONFIG_ARCH_GOLDFISH=y
#
# Goldfish options
#
CONFIG_MACH_GOLDFISH=y
# CONFIG_MACH_GOLDFISH_ARMV7 is not set

因为GoldFish是ARM处理器,所以CONFIG_ARM宏需要被使能,CONFIG_ARCH_GOLDFISH和CONFIG_MACH_GOLDFISH宏是GoldFish处理器这类机器使用的配置宏。

在gildfish_defconfig中,与Android系统相关的宏如下所示:

#
# android
#
CONFIG_ANDROID=y
CONFIG_ANDROID_BUNDER_IPC=y #binder ipc驱动程序
CONFIG_ANDROID_LOGGER=y #log记录器驱动程序
# CONFIG_ANDROID_RAM_CONSOLE is not set
CONFIG_ANDROID_TIMED_OUTPUT=y #定时输出驱动程序框架
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
CONFIG_ANDROID_PMEM=y #物理内存驱动程序
CONFIG_ASHMEM=y #匿名共享内存驱动程序
CONFIG_RTC_INTF_ALARM=y
CONFIG_HAS_WAKELOCK=y 电源管理相关的部分wakelock和earlysuspend
CONFIG_HAS_EARLYSUSPEND=y
CONFIG_WAKELOCK=y
CONFIG_WAKELOCK_STAT=y
CONFIG_USER_WAKELOCK=y
CONFIG_EARLYSUSPEND=y
goldfish_defconfig 配置文件中,另外有一个宏是处理器虚拟设备的“驱动程序”,其内容如下所示:
CONFIG_MTD_GOLDFISH_NAND=y
CONFIG_KEYBOARD_GOLDFISH_EVENTS=y
CONFIG_GOLDFISH_TTY=y
CONFIG_BATTERY_GOLDFISH=y
CONFIG_FB_GOLDFISH=y
CONFIG_MMC_GOLDFISH=y
CONFIG_RTC_DRV_GOLDFISH=y

在Goldfish处理器的各个配置选项中,体系结构和Goldfish的虚拟驱动程序基于标准Linux内容的驱动程序框架,但是这些设备在不同硬件平台的移植方式不同;Android专用的驱动程序是Android中特有的内容,非Linux标准,但是和硬件平台无关。

和原Linux内核相比,Android内核增加了Android的相关驱动(Driver),对应的目录如下所示:

kernel/drivers/android
Android的相关驱动主要分为以下几类驱动。

Android IPC系统:Binder (binder.c)。
Android 日志系统:Logger (logger.c)。
Android 电源管理:Power (power.c)。
Android 闹钟管理:Alarm (alarm.c)。
Android 内存控制台:Ram_console (ram_console.c)。
Android 时钟控制的gpio:Timed_gpio (timed_gpio.c)。
对于本书讲解的驱动程序开发来说,我们比较关心的是GoldFish平台下相关的驱动文件,具体说明如下所示。

(1)字符输出设备:

kernel/drivers/char/goldfish_tty.c
(2)图象显示设备(Frame Buffer):

kernel/drivers/video/goldfishfb.c
(3)键盘输入设备文件:

kernel/drivers/input/keyboard/goldfish_events.c
(4)RTC设备(Real Time Clock)文件:

kernel/drivers/rtc/rtc-goldfish.c
(5)USB Device设备文件:

kernel/drivers/usb/gadget/android_adb.c
(6)SD卡设备文件:

kernel/drivers/mmc/host/goldfish.c
(7)FLASH设备文件:

kernel/drivers/mtd/devices/goldfish_nand.c
kernel/drivers/mtd/devices/goldfish_nand_reg.h

(8)LED设备文件:

kernel/drivers/leds/ledtrig-sleep.c
(9)电源设备:

kernel/drivers/power/goldfish_battery.c
(10)音频设备:

kernel/arch/arm/mach-goldfish/audio.c
(11)电源管理:

kernel/arch/arm/mach-goldfish/pm.c
(12)时钟管理:

kernel/arch/arm/mach-goldfish/timer.c
1.4.2 获取MSM内核代码
在目前市面上,谷歌的手机产品G1是基于MSM内核的,MSM是高通公司的应用处理器,在Android代码库中公开了对应的MSM的源代码。在Android开源工程的代码仓库中,使用Git工具得到MSM内核代码的命令如下所示:

$ git clone git://android.git.kernel.org/kernel/msm.git
1.4.3 获取OMAP内核代码
OMAP是德州仪器公司的应用处理器,为Android使用的是OMAP3系列的处理器。在Android代码库中公开了对应的OMAP的源代码,使用Git工具得到OMAP内核代码的命令如下所示:

$ git clone git://android.git.kernel.org/kernel/omap.git
1.4.4 编译Android的Linux内核
了解了上述3类Android内核后,下面开始讲解编译Android内核的方法。在此以Ubuntu 8.10为例,完整编译Android内核的流程如下。

(1)构建交叉编译环境。

Android的默认硬件处理器是ARM,因此需要在自己的机器上构建交叉编译环境。交叉编译器GNU Toolchain for ARM Processors下载地址如下所示:

http://www.codesourcery.com/gnu_toolchains/arm/download.html
单击GNU/Linux对应的链接,再单击“Download Sourcery CodeBench Lite 5.1 2012.03-117”链接后直接下载,如图1-20所示。

screenshot

把arm-2008q3-71-arm-none-linux-gnueabi-i686-pc-linux- gnu.tar.bz2解压到一目录下,例如“~/programes/”,并加入PATH环境变量:

vim ~/.bashrc
然后添加:

ARM_TOOLCHIAN=~/programes/arm-2008q3/bin/
export PATH=${PATH}:${ARM_TOOLCHIAN};

保存后并source ~/.bashrc。

(2)获取内核源码,源码地址如下所示:

http://code.google.com/p/android/downloads/list
选择的内核版本要与选用的模拟器版本尽量一致。下载并解压后得到kernel.git文件夹。

tar -xvf ~/download/linux-3.2.5-android-4.3_r1.tar.gz
(3)获取内核编译配置信息文件。

编译内核时需要使用configure,通常configure有很多选项,我们往往不知道需要那些选项。在运行Android模拟器时,有一个文件“/proc/config.gz”,这是当前内核的配置信息文件,把config.gz获取并解压到“kernel.git/”下,然后改名为.config。命令如下所示:

cd kernel.git/
emulator &
adb pull /proc/config.gz
gunzip config.gz
mv config .config

(4)修改Makefile。

修改195行的代码:

CROSS_COMPILE = arm-none-linux-gnueabi-
将CROSS_COMPILE值改为arm-none-linux-gnueabi-,这是安装的交叉编译工具链的前缀,修改此处意在告诉make在编译的时候要使用该工具链。然后注释掉562和563行的如下代码:

#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/
#                  $(call ld-option, -Wl$(comma)--build-id,))

必须将上述代码中的build id 值注释掉,因为目前版本的Android内核不支持该选项。

(5)编译。

使用make进行编译,并同时生成zImage:

LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready

这样生成zImage大小为1.23 MB,android- sdk-linux_x86-4.3_r1/tools/lib/images/kernel-qemu是1.24 MB。

(6)使用模拟器加载内核测试,命令如下所示:

cd android/out/cupcake/out/target/product/generic
emulator -image system.img -data userdata.img -ramdisk ramdisk.img -kernel ~/project/android/kernel.git/ arch/arm/boot/zImage &

到此为止,模拟器就加载成功了。

2014-10-21 22:46:59 RandySu 阅读数 328

Ubuntu版本:ubuntu-10.04-desktop-amd64.iso

(1)/bin/bash: bison: command not found  解决办法:sudo apt-get install bison

(2)/bin/bash: g++: command not found   解决办法:sudo apt-get install build-essential

(2)/usr/bin/ld: cannot find -lncurses   解决办法:sudo apt-get install libncurses-dev

(2)/bin/bash: flex: command not found   解决办法:sudo apt-get install flex

(2)sh: gperf: not found   解决办法:sudo apt-get install gperf

(2)g++: error trying to exec 'cc1plus': execvp: 没有那个文件或目录     

解决办法:

这个错误是gcc和g++版本不兼容导致的,也有可能是安装完gcc没有安装g++

首先安装gcc和g++及一些依赖包
sudo apt-get install build-essential
sudo apt-get install g++
安装完成后使用 gcc -v 查看版本,然后使用g++ -v 查看版本,保证版本一致

2018-07-11 19:43:00 weixin_34221332 阅读数 35

掘金专栏地址:https://juejin.im/post/5b0e591451882515662234cd
android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4模拟器运行

  • 1.源码下载

    • 首先确保自己已经安装了Git.

      sudo apt-get install git 
      git config –global user.email “test@test.com” 
      git config –global user.name “test”
      
      
    • 使用清华大学镜像

      mkdir ~/bin
      PATH=~/bin:$PATH
      curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
      chmod a+x ~/bin/repo
      //拒绝连接可以使用tuna的git-repo镜像,将地址换成清华大学的镜像地址
      详情查看网址https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
      
      • 使用每月更新的初始化包(也可以传统的初始化方法,因为网络慢会下载失败,还是直接把初始化包下载下来再进行同步)

      • 下载地址 每月更新的初始化包

      • 由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录

      使用方法如下:
      
      wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-mo nthly/aosp-latest.tar # 下载初始化包
      tar xf aosp-latest.tar
      cd AOSP   # 解压得到的 AOSP 工程目录
      # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
      repo sync # 正常同步一遍即可得到完整目录
      # 或 repo sync -l 仅checkout代码
      
      • 同步完代码之后需要直接进行编译的话就是编译主分支的源码,如果需要特定版本,则需要自己切换分支,再次同步就切换到指定分支的源码了,执行以下命令(这里切换到8.0版本 支持设备 Pixel XL、Pixel)

        分支列表 代号、标记和细分版本号

        repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2
        repo sync
        
  • 2.构建编译环境

    • 硬件要求:

    • 64位的操作系统只能编译2.3.x以上的版本,如果你想要编译2.3.x以下的,那么需要32位的操作系统.
      磁盘空间越多越好,至少在100GB以上.意思就是,你可以去买个大点的硬盘了
      如果你想要在是在虚拟机运行linux,那么至少需要16GB的RAM/swap.

    • 软件要求

    • 安装 openJDK 8

      sudo apt-get update
      sudo apt-get install openjdk-8-jdk
      
      
    • 依赖设置:

      sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
      sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
      sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
      sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
      sudo apt-get install git-core gnupg flex bison gperf build-essential  
      sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
      sudo apt-get install libc6-dev-i386 
      sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
      sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
      sudo apt-get install lib32z-dev ccache
      
      • 依赖设置中有可能会出现“无法定位软件包 libesd0-dev” 这个问题
        解决方案:
        在etc/apt   的sources.list 添加镜像源   deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
        
        然后 sudo apt-get update  接着继续使用该命令安装就可以了
        
    • 操作系统要求

      Android版本 编译要求的Ubuntu最低版本
      Android 6.0至AOSP master Ubuntu 14.04
      Android 2.3.x至Android 5.x Ubuntu 12.04
      Android 1.5至Android 2.2.x Ubuntu 10.04
  • JDK版本要求

    Android版本 编译要求的JDK版本
    AOSP的Android主线 OpenJDK 8
    Android 5.x至android 6.0 Oracle JDK 7
    Android 2.3.x至Android 4.4.x Oracle JDK 6
    Android 1.5至Android 2.2.x Oracle JDK 5
  • 官方编译环境搭建文档地址

    搭建编译环境

  • 初始化编译环境

    source build/envsetup.sh 
    或者
    . build/envsetup.sh
    
    
    • 选择目标
    . lunch aosp_arm64-eng
    
    
    • 该命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。
      如果您没有提供任何参数就运行命令,lunch 将提示您从菜单中选择一个目标。
      所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。

    • BUILDTYPE 是以下类型之一:

      编译类型 使用情况
      user 权限受限;适用于生产环境(没有root权和dedug等)
      userdebug 在user版本的基础上开放了root权限和debug权限.
      eng 开发工程师的版本,拥有最大的权限,此外还附带了许多debug工具
  • 3.编译源码

    • 您可以使用make编译任何代码。GNUMake可以借助 -jN参数处理并行任务,通常使用的任务数N介于编译时所用计算机上硬件线程数的1-2倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核2个线程)上,要实现最快的编译速度,可以使用介于make -j16 到 make -j32 之间的命令。
    make -j8
    
    • 编译中

      2174557-17c4d48a6b319e24
      源码编译中
  • 4.编译完成运行

    2174557-243d821acfa67509
    编译完成
    • 运行模拟器

      //依次输入以下命令(如果是在编译成功源码之后直接想运行模拟器,则直接输入emulator命令就行,因为前面编译源码已经输入过以上两条命令)
      
      . build/envsetup.sh
      
      lunch(选择刚才你编译源码设置的目标版本)
      
      emulator
      
      
      2174557-0cada77238fb3971
      运行模拟器
  • 将源码导入Android Studio 查看

    • 编译idegen

      source build/envsetup.sh // 将执行文件设置为临时变量
      mmm development/tools/idegen/  //生成idegen.jar文件(#### build completed successfully (49 seconds) #### 标识生成idegen.jar文件)
      
      
    • 执行脚本 idegen.sh

      . development/tools/idegen/idegen.sh
      
      

      看到下图,表示编译idegen完成,执行成功后在asop的根目录下生成android.ipr和android.iml两个个文件:

      • android.ipr 一般保存了工程相关的设置,比如modules和modules libraries的路径,编译器配置,入口点等。
      • android.iml 用来描述modules。它包括modules路径、 依赖关系,顺序设置等。一个项目可以包含多个 *.iml 文件。


        2174557-3de21acc9d2adaff
        image
      • 打开Android Studio,选择File->Open弹出路径选择框,输入相应的源码根路径,然后选择android.ipr文件,就开始导入源码,导入快慢和电脑性能有关,一般10至20分钟。
      • 至此整个源码编译完成,并可进行源码查看。
  • 编译中遇到的坑

    • Error: library-pathout/host/linux-x86/lib64/libsepolwrap.so does not exist

      2174557-839f4aff3a75f3ee
      image
      • 解决 :
        1.重新同步代码 并加入sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
        2.确认是否配置好了JDK的环境变量
  • openJDK 配置环境变量方法

    1.用gedit文本编辑器在/etc/profile中添加环境变量:
    命令 : sudo gedit /etc/profile
    
    2.在打开的/etc/profile文件末尾添加下面几行:
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    export JRE_HOME=${JAVA_HOME}/jre 
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
    export PATH=${JAVA_HOME}/bin:$PATH
    
    
  • 编译Android 8.0出现问题

    loadlocale.c:130:_nl_intern_locale_data: ?? 'cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' ???
    Aborted (core dumped)
    

    可以在 build/envsetup.sh 最后加入

    export LC_ALL=C
    

    参考解决办法地址

  • 编译出现 Try increasing heap size with java option '-Xmx<size>',编译失败

    解决方案,依次执行以下命令
    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
    jack-admin kill-server && jack-admin start-server
    

    参考解决办法地址

最后

没有更多推荐了,返回首页