zoukankan      html  css  js  c++  java
  • Android 2.3 GingerBread for VirtualBox x86编译指南

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://carltao.blog.51cto.com/856514/479777
    时间有限,格式未调整,见谅。
    编译的问题主要参考
    谢谢原作者。
     

    About-GingerBread-x86

     

    展开源码,用AOSP的bionic目录替换(gingerbread)的bionic
    删除bootable/diskinstaller,拷贝froyo-x86的newinstaller到bootable目录下;拷贝gingerbread的bootable/diskinstaller/libdiskconfig目录到bootable/newinstaller目录下
    修改build/core/Makefile,注释掉bootable/diskinstaller/config.mk的引用
    链接froyo-x86的kernel;cd /work/gb; ln -sf /work/x86/kernel/ .
    将x86/build/core/kernel.mk拷贝过来,并include在build/core/Makefile中
     
    $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
            $(call pretty,”Target boot image: $@”)
            $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) –output $@
            $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw)
    endif # TARGET_BOOTIMAGE_USE_EXT2
     
    include $(BUILD_SYSTEM)/kernel.mk
     
    else    # TARGET_NO_KERNEL
    # HACK: The top-level targets depend on the bootimage.  Not all targets
    # can produce a bootimage, though, and emulator targets need the ramdisk
    # instead.  Fake it out by calling the ramdisk the bootimage.
    # TODO: make the emulator use bootimages, and make mkbootimg accept
    #       kernel-less inputs.
    INSTALLED_BOOTIMAGE_TARGET := $(INSTALLED_RAMDISK_TARGET)
    endif
     
    将froyo_x86的device/vm拷贝到device目录下,在AndroidBoard.mk中注释掉TARGET_PREBUILT_APPS
    将build/core/target/board/generic_x86下面的buildspec*拷贝到根目录的buildspec.mk并修改BUILD_ENV_SEQUENCE_NUMBER为10
    编译环境设置(每次编译前不要忘记lunch vm-eng以防止编译错误目标)
    carl@carl-amd64:/work/gb$ . build/envsetup.sh 
    including device/htc/passion/vendorsetup.sh
    including device/samsung/crespo/vendorsetup.sh
    including device/vm/vm/vendorsetup.sh
    carl@carl-amd64:/work/gb$ lunch vm-eng
     
    ============================================
    PLATFORM_VERSION_CODENAME=REL
    PLATFORM_VERSION=2.3.1
    TARGET_PRODUCT=vm
    TARGET_BUILD_VARIANT=eng
    TARGET_SIMULATOR=false
    TARGET_BUILD_TYPE=release
    TARGET_BUILD_APPS=
    TARGET_ARCH=x86
    HOST_ARCH=x86
    HOST_OS=linux
    HOST_BUILD_TYPE=release
    BUILD_ID=GINGERBREAD
    ============================================
     
    将下面两行加入build/target/product/generic_x86.mk末尾
    GENERIC_X86_CONFIG_MK := $(SRC_TARGET_DIR)/board/generic_x86/BoardConfig.mk
    GENERIC_X86_ANDROID_MK := $(SRC_TARGET_DIR)/board/generic_x86/AndroidBoard.mk
     
    开始编译内核
    carl@carl-amd64:/work/gb$ m -j3 kernel
     
     
    消除LOCAL_MODULE_TAGS的问题(external/grub),设置LOCAL_MODULE_TAGS := optional
    build/core/base_rules.mk:74: *** Module name: grub_stage1
    build/core/base_rules.mk:75: *** Makefile location: external/grub
    build/core/base_rules.mk:76: * 
    build/core/base_rules.mk:77: * Each module must use a LOCAL_MODULE_TAGS in its
    build/core/base_rules.mk:78: * Android.mk. Possible tags declared by a module:
    build/core/base_rules.mk:79: * 
    build/core/base_rules.mk:80: *     optional, debug, eng, tests, samples
    build/core/base_rules.mk:81: * 
    build/core/base_rules.mk:82: * If the module is expected to be in all builds
    build/core/base_rules.mk:83: * of a product, then it should use the
    build/core/base_rules.mk:84: * “optional” tag: 
    build/core/base_rules.mk:85: * 
    build/core/base_rules.mk:86: *    Add “LOCAL_MODULE_TAGS := optional” in the
    build/core/base_rules.mk:87: *    Android.mk for the affected module, and add
    build/core/base_rules.mk:88: *    the LOCAL_MODULE value for that component
    build/core/base_rules.mk:89: *    into the PRODUCT_PACKAGES section of product
    build/core/base_rules.mk:90: *    makefile(s) where it’s necessary, if
    build/core/base_rules.mk:91: *    appropriate.
    build/core/base_rules.mk:92: * 
    build/core/base_rules.mk:93: * If the component should be in EVERY build of ALL
    build/core/base_rules.mk:94: * products, then add its LOCAL_MODULE value to the
    build/core/base_rules.mk:95: * PRODUCT_PACKAGES section of
    build/core/base_rules.mk:96: * build/target/product/core.mk
    build/core/base_rules.mk:97: * 
    build/core/base_rules.mk:98: *** user tag detected on new module – user tags are only supported on legacy modules.  Stop.
    make: Leaving directory `/work/gb’
     
    去掉多余的libdiskconfig目标
    build/core/base_rules.mk:158: *** bootable/newinstaller/libdiskconfig: MODULE.TARGET.SHARED_LIBRARIES.libdiskconfig already defined by system/core/libdiskconfig.  Stop.
    注释掉bootable/newinstaller/libdiskconfig/Android.mk中libdiskconfig相关代码
     
    ###########################
    # shared library for target
    #include $(CLEAR_VARS)
     
    #LOCAL_SRC_FILES := $(commonSources)
     
    #LOCAL_CFLAGS := -O2 -g -W -Wall -Werror
     
    #LOCAL_MODULE := libdiskconfig
    #LOCAL_MODULE_TAGS := system_builder
    #LOCAL_SYSTEM_SHARED_LIBRARIES := libcutils liblog libc
     
    #include $(BUILD_SHARED_LIBRARY)
     
    将编译好的kernel拷贝到prebuilt下相应目录
    carl@carl-amd64:/work/gb$ cp device/vm/vm/vm_defconfig prebuilt/android-x86/kernel/kernel_config_VirtualBox 
    carl@carl-amd64:/work/gb$ cp out/target/product/vm/kernel /work/gb/prebuilt/android-x86/kernel/kernel
     
     
     
    开始全编译
    carl@carl-amd64:/work/gb$ m -j3
     
    stlport的问题解决
     
    external/stlport/src/num_put_float.cpp: In function ‘bool std::priv::_Stl_is_nan_or_inf(double)’:
    external/stlport/src/num_put_float.cpp:143: error: ‘IsNANorINF’ was not declared in this scope
    external/stlport/src/num_put_float.cpp: In function ‘bool std::priv::_Stl_is_inf(double)’:
    external/stlport/src/num_put_float.cpp:144: error: ‘IsNANorINF’ was not declared in this scope
    external/stlport/src/num_put_float.cpp:144: error: ‘IsINF’ was not declared in this scope
    external/stlport/src/num_put_float.cpp: In function ‘bool std::priv::_Stl_is_neg_inf(double)’:
    external/stlport/src/num_put_float.cpp:145: error: ‘IsINF’ was not declared in this scope
    external/stlport/src/num_put_float.cpp: In function ‘bool std::priv::_Stl_is_neg_nan(double)’:
    external/stlport/src/num_put_float.cpp:146: error: ‘IsNegNAN’ was not declared in this scope
    external/stlport/src/num_put_float.cpp: In function ‘char* std::priv::_Stl_ecvtR(double, int, int*, int*, char*)’:
    external/stlport/src/num_put_float.cpp:280: error: ‘ecvt_r’ was not declared in this scope
    external/stlport/src/num_put_float.cpp: In function ‘char* std::priv::_Stl_fcvtR(double, int, int*, int*, char*)’:
    external/stlport/src/num_put_float.cpp:282: error: ‘fcvt_r’ was not declared in this scope
    external/stlport/src/num_put_float.cpp: In function ‘char* std::priv::_Stl_ecvtR(long double, int, int*, int*, char*)’:
    external/stlport/src/num_put_float.cpp:285: error: ‘qecvt_r’ was not declared in this scope
    external/stlport/src/num_put_float.cpp: In function ‘char* std::priv::_Stl_fcvtR(long double, int, int*, int*, char*)’:
    external/stlport/src/num_put_float.cpp:287: error: ‘qfcvt_r’ was not declared in this scope
    target thumb C++: libstlport <= external/stlport/src/time_facets.cpp
    make: *** [out/target/product/vm/obj/SHARED_LIBRARIES/libstlport_intermediates/src/num_put_float.o] Error 1
    编辑external/stlport/Android.mk修改libstlport_cflags := -D_GNU_SOURCE -DUSE_SPRINTF_INSTEAD
     
     
    bitwise.c的问题解决
     
    In file included from external/tremolo/Tremolo/bitwise.c:43:
    external/tremolo/Tremolo/misc.h:82: error: redefinition of ‘union magic’
    In file included from external/tremolo/Tremolo/codebook.c:45:
    external/tremolo/Tremolo/misc.h:82: error: redefinition of ‘union magic’
    make: *** [out/target/product/vm/obj/SHARED_LIBRARIES/libvorbisidec_intermediates/Tremolo/bitwise.o] Error 1
    make: *** Waiting for unfinished jobs….
    In file included from external/tremolo/Tremolo/mdct.h:42,
                     from external/tremolo/Tremolo/dsp.c:40:
    external/tremolo/Tremolo/misc.h:82: error: redefinition of ‘union magic’
    external/tremolo/Tremolo/codebook.c: In function ‘decode_map’:
    external/tremolo/Tremolo/codebook.c:763: warning: pointer of type ‘void *’ used in arithmetic
    make: *** [out/target/product/vm/obj/SHARED_LIBRARIES/libvorbisidec_intermediates/Tremolo/codebook.o] Error 1
     
    在external/tremolo/Tremolo/misc.h中加入
    #include <endian.h>
     
    __dso_handle的问题解决
     
    external/stlport/src/monetary.cpp:39: undefined reference to `__dso_handle’
    out/target/product/vm/obj/SHARED_LIBRARIES/libstlport_intermediates/src/locale.o: In function `__static_initialization_and_destruction_0′:
    external/stlport/src/locale.cpp:29: undefined reference to `__dso_handle’
    out/target/product/vm/obj/SHARED_LIBRARIES/libstlport_intermediates/src/locale_impl.o: In function `__static_initialization_and_destruction_0′:
    external/stlport/src/locale_impl.cpp:31: undefined reference to `__dso_handle’
    out/target/product/vm/obj/SHARED_LIBRARIES/libstlport_intermediates/src/locale_impl.o: In function `std::_Locale_impl::make_classic_locale()’:
    external/stlport/src/locale_impl.cpp:670: undefined reference to `__dso_handle’
    external/stlport/src/locale_impl.cpp:667: undefined reference to `__dso_handle’
    out/target/product/vm/obj/SHARED_LIBRARIES/libstlport_intermediates/src/locale_impl.o:external/stlport/src/locale_impl.cpp:604: more undefined references to `__dso_handle’ follow
    collect2: ld returned 1 exit status
     
    修改external/stlport/dll_main.cpp加入
    extern “C” {
    void * __dso_handle = 0;
    }
     
    dnsmasq的dbus引用问题解决
     
    external/dnsmasq/src/dbus.c:21:23: error: dbus/dbus.h: No such file or directory
    external/dnsmasq/src/dbus.c:60: error: expected specifier-qualifier-list before ‘DBusWatch’
    external/dnsmasq/src/dbus.c:65: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘add_watch’
    external/dnsmasq/src/dbus.c:84: error: expected ‘)’ before ‘*’ token
    external/dnsmasq/src/dbus.c:100: error: expected ‘)’ before ‘*’ token
    external/dnsmasq/src/dbus.c:261: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘message_handler’
     
    修改external/dnsmasq/src/config.h
    /* #define HAVE_DBUS */
    #ifdef __ANDROID__
    #undef HAVE_DBUS
    #endif
     
     
    libnfc-nxp的问题解决
    target arm C: libnfc <= external/libnfc-nxp/src/phLibNfc.c
    cc1: error: unrecognized command line option “-mapcs”
    cc1: error: unrecognized command line option “-mno-sched-prolog”
    cc1: error: unrecognized command line option “-mabi=aapcs-linux”
    cc1: error: unrecognized command line option “-mno-thumb-interwork”
     
    修改external/libnfc-nxp/Android.mk将
    LOCAL_CFLAGS += -DNXP_MESSAGING -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -msoft-float -Uarm -fno-common –fpic
    改为
    LOCAL_CFLAGS += -DNXP_MESSAGING -DINCLUDE_DALINIT_DEINIT -pipe -fomit-frame-pointer -Wall -Wno-trigraphs -Werror-implicit-function-declaration  -fno-strict-aliasing -msoft-float -Uarm -fno-common -fpic
     
    in mkuserimg.sh PATH=out/host/linux-x86/bin/:/boot/jdk/bin:/home/carl/bin:/opt/android/tools:/opt/android/platform-tools:/opt/depot_tools:/boot/jdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/gb/out/host/linux-x86/bin:/work/gb/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:/work/gb/development/emulator/qtools:/work/gb/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:/work/gb/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
    Only ext4 is supported!
    修改各个image的文件系统支持
    直接修改build/target/board/generic_x86/BoardConfig.mk
     
    TARGET_USERIMAGES_USE_EXT4 := true
    TARGET_BOOTIMAGE_USE_EXT2 := true
    TARGET_SYSTEMIMAGES_USE_EXT2 := true
     
    修改build/core/Makefile
     
    ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true)
     ## generate an ext2 image
     # $(1): output file
     define build-systemimage-target
         @echo “Target system fs image: $(1)”
         $(call build-userimage-ext-target, $(TARGET_OUT), $(1), system, $(INTERNAL_USERIMAGES_EXT_VARIANT), $(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
     endef
    改为
    ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true)
      ifeq ($(TARGET_SYSTEMIMAGES_USE_EXT2),true)
        -include external/genext2fs/Config.mk
        ## generate an ext2 image
        # $(1): output file
        define build-systemimage-target
          @echo “Target system fs image: $(1)”
          $(call build-userimage-ext2-target,$(TARGET_OUT),$(1),system,)
        endef
        else
        define build-systemimage-target
          @echo “Target system fs image: $(1)”
          $(call build-userimage-ext-target,$(TARGET_OUT),$(1),system,$(INTERNAL_USERIMAGES_EXT_VARIANT),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
        endef
      endif
     
    完成后,可以直接
    carl@carl-amd64:/work/gb$ export USE_SQUASHFS=0
    carl@carl-amd64:/work/gb$ m -j3 iso_img
     
     
    IAudioEffect.c的问题解决
    out/target/product/vm/obj/SHARED_LIBRARIES/libOpenSLES_intermediates/IAndroidEffect.o:(.data.rel.ro._ZTIN7android12SortedVectorINS_16key_value_pair_tImPNS_11AudioEffectEEEEE[typeinfo for android::SortedVector<android::key_value_pair_t<unsigned long, android::AudioEffect*> >]+0×0): undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info’
    out/target/product/vm/obj/SHARED_LIBRARIES/libOpenSLES_intermediates/IAndroidEffect.o:(.data.rel.ro._ZTIN7android12SortedVectorINS_16key_value_pair_tImPNS_11AudioEffectEEEEE[typeinfo for android::SortedVector<android::key_value_pair_t<unsigned long, android::AudioEffect*> >]+0×10): undefined reference to `typeinfo for android::SortedVectorImpl’
    collect2: ld returned 1 exit status
    将system/media/opensles/libopensles/IAndroidEffect.c换名IAndroidEffect.cpp并更新Android.mk文件
     
    init.rc不执行拷贝的问题
    在build/target/board/generic_x86/AndroidBoard.mk中指定的init.rc模块,无论如何设置都不会执行拷贝,这是由于新版本的build system脚本调整导致的麻烦,需要强制在definitions.mk中指定安装init.rc模块。
    ifeq ($(TARGET_PROVIDES_INIT_RC), true)
    ALL_DEFAULT_INSTALLED_MODULES:=init.rc
    else
    ALL_DEFAULT_INSTALLED_MODULES:=
    endif
     
    SQUASHFS生成目标的支持问题
    froyo-x86默认是生成SQUASHFS,如下修改bootable/newinstaller/Android.mk为默认不生成SQUASHFS;如果需要设置生成SQUASHFS,只需要在make前export USE_SQUASHFS=1
     
    # use squashfs for iso, unless explictly disabled
    ifeq ($(USE_SQUASHFS),1)
    MKSQUASHFS = $(shell which mksquashfs)
     
    在Makefile中集成system.sfs目标
     
    $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP)
            @echo “Install system fs image: $@”
            $(copy-file-to-target)
            $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs)
     
    ifneq ($(MKSQUASHFS),)
    $(PRODUCT_OUT)/system.sfs: $(BUILT_SYSTEMIMAGE)
            $(call build-squashfs-target,$^,$@)
    endif
     
    systemimage: $(INSTALLED_SYSTEMIMAGE)
     
     
    init.rc的定制问题
     
    Gingerbread修改了system/core/init模块的代码,init.rc的支持也变得更加强大。
    init.rc需要根据不同平台来进行定制,否则在chroot到android后会出现严重问题。
    基本思路是基于Android原生的init.rc修改,添加文件系统mount的指令,添加eth0启动时支持。
     
     
    BOARD_KERNEL_CMDLINE的问题
    由于没有使用diskinstaller,所以build/target/board/generic-x86/BoardConfig.mk中KERNEL_CMDLINE如下修改
    # For VirtualBox and likely other emulators
    #BOARD_INSTALLER_CMDLINE := init=/init console=ttyS0 console=tty0 androidboot.hardware=generic_x86 vga=788 verbose
    #BOARD_KERNEL_CMDLINE := init=/init console=tty0 console=ttyS0 androidboot.hardware=generic_x86 vga=788
    BOARD_KERNEL_CMDLINE := init=/init console=tty0 androidboot.hardware=$(TARGET_PRODUCT) acpi_sleep=s3_bios,s3_mode vga=788
     

    本文出自 “快乐的技术员” 博客,请务必保留此出处http://carltao.blog.51cto.com/856514/479777

  • 相关阅读:
    2021.1.28 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2020.12.14 个人训练赛补题报告
    2020.11.28 2020团体程序设计天梯赛补题报告
    2020.12.3 Codeforces Beta Round #73(Div2)补题报告
    Xhorse VVDI Prog V5.0.6 is Ready for BCM2 Adapter
    Program 2021 Ford Bronco All Keys Lost using VVDI Key Tool Plus
    Xhorse VVDI Prog V5.0.4 Software Update in July 2021
    How to use Xhorse VVDI2 to Exchange BMW FEM/BDC Module?
  • 原文地址:https://www.cnblogs.com/googlegis/p/2978794.html
Copyright © 2011-2022 走看看