导航:首页 > 源码编译 > 如何编译安卓的可执行文件

如何编译安卓的可执行文件

发布时间:2022-05-23 20:23:35

‘壹’ android上如何运行可执行文件(.exe格式)的

需要工具:
1、网上下载Bochs模拟器主程序(就是一个apk程序文件)
2、配置文件(已经打包好在附件里)
3、系统镜像 操作步骤

步骤1:安装模拟器主程序(这个就不用多说了,和普通安卓应用一样)
步骤2:将装有配置文件的SDL文件夹拷贝到机身内存根目录中(没有机身内存的手机请拷贝到SD卡中,不清楚拷贝到哪里的就用RE管理器拷贝到手机根目录显示sdcard的文件夹里)
步骤3:将系统镜像文件改名为c.img,拷贝到步骤2中的SDL文件夹(要用什么系统就拷贝相应的镜像)
步骤4:运行安装好的模拟器主程序,没有问题的话就会开机运行操作系统了

‘贰’ 自己可以编译安卓源码

用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:

sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”

其中[email protected]为你自己的邮箱.

简要说明

android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.

源码下载

由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)

repo工具下载及安装

通过执行以下命令实现repo工具的下载和安装

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:

我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:


这里写图片描述

执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.

错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.

    结束吧

    到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.

    ‘叁’ android 怎么编译so文件

    android NDK编译多个so文件

    android编译系统的makefile文件Android.mk写法如下

    (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下

    Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:

    LOCAL_PATH:=$(call my-dir)

    上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径。

    (2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始

    以include $(BUILD_XXX)结束。

    include $(CLEAR_VARS)

    CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,

    如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

    include $(BUILD_STATIC_LIBRARY)表示编译成静态库

    include $(BUILD_SHARED_LIBRARY)表示编译成动态库。

    include $(BUILD_EXECUTABLE)表示编译成可执行程序

    (3)举例如下(frameworks/base/libs/audioflinger/Android.mk):

    LOCAL_PATH:= $(call my-dir)

    include $(CLEAR_VARS) 模块一

    ifeq ($(AUDIO_POLICY_TEST),true)

    ENABLE_AUDIO_DUMP := true

    endif

    LOCAL_SRC_FILES:= \

    AudioHardwareGeneric.cpp \

    AudioHardwareStub.cpp \

    AudioHardwareInterface.cpp

    ifeq ($(ENABLE_AUDIO_DUMP),true)

    LOCAL_SRC_FILES += AudioDumpInterface.cpp

    LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP

    endif

    LOCAL_SHARED_LIBRARIES := \

    libcutils \

    libutils \

    libbinder \

    libmedia \

    libhardware_legacy

    ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

    LOCAL_CFLAGS += -DGENERIC_AUDIO

    endif

    LOCAL_MODULE:= libaudiointerface

    ifeq ($(BOARD_HAVE_BLUETOOTH),true)

    LOCAL_SRC_FILES += A2dpAudioInterface.cpp

    LOCAL_SHARED_LIBRARIES += liba2dp

    LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP

    LOCAL_C_INCLUDES += $(call include-path-for, bluez)

    endif

    include $(BUILD_STATIC_LIBRARY) 模块一编译成静态库

    include $(CLEAR_VARS) 模块二

    LOCAL_SRC_FILES:= \

    AudioPolicyManagerBase.cpp

    LOCAL_SHARED_LIBRARIES := \

    libcutils \

    libutils \

    libmedia

    ifeq ($(TARGET_SIMULATOR),true)

    LOCAL_LDLIBS += -ldl

    else

    LOCAL_SHARED_LIBRARIES += libdl

    endif

    LOCAL_MODULE:= libaudiopolicybase

    ifeq ($(BOARD_HAVE_BLUETOOTH),true)

    LOCAL_CFLAGS += -DWITH_A2DP

    endif

    ifeq ($(AUDIO_POLICY_TEST),true)

    LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

    endif

    include $(BUILD_STATIC_LIBRARY) 模块二编译成静态库

    include $(CLEAR_VARS) 模块三

    LOCAL_SRC_FILES:= \

    AudioFlinger.cpp \

    AudioMixer.cpp.arm \

    AudioResampler.cpp.arm \

    AudioResamplerSinc.cpp.arm \

    AudioResamplerCubic.cpp.arm \

    AudioPolicyService.cpp

    LOCAL_SHARED_LIBRARIES := \

    libcutils \

    libutils \

    libbinder \

    libmedia \

    libhardware_legacy

    ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

    LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybase

    LOCAL_CFLAGS += -DGENERIC_AUDIO

    else

    LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy

    endif

    ifeq ($(TARGET_SIMULATOR),true)

    LOCAL_LDLIBS += -ldl

    else

    LOCAL_SHARED_LIBRARIES += libdl

    endif

    LOCAL_MODULE:= libaudioflinger

    ifeq ($(BOARD_HAVE_BLUETOOTH),true)

    LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP

    LOCAL_SHARED_LIBRARIES += liba2dp

    endif

    ifeq ($(AUDIO_POLICY_TEST),true)

    LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

    endif

    ifeq ($(TARGET_SIMULATOR),true)

    ifeq ($(HOST_OS),linux)

    LOCAL_LDLIBS += -lrt -lpthread

    endif

    endif

    ifeq ($(BOARD_USE_LVMX),true)

    LOCAL_CFLAGS += -DLVMX

    LOCAL_C_INCLUDES += vendor/nxp

    LOCAL_STATIC_LIBRARIES += liblifevibes

    LOCAL_SHARED_LIBRARIES += liblvmxservice

    # LOCAL_SHARED_LIBRARIES += liblvmxipc

    endif

    include $(BUILD_SHARED_LIBRARY) 模块三编译成动态库

    (4)编译一个应用程序(APK)

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    # Build all java files in the java subdirectory-->直译(建立在java子目录中的所有Java文件)

    LOCAL_SRC_FILES := $(call all-subdir-java-files)

    # Name of the APK to build-->直译(创建APK的名称)

    LOCAL_PACKAGE_NAME := LocalPackage

    # Tell it to build an APK-->直译(告诉它来建立一个APK)

    include $(BUILD_PACKAGE)

    (5)编译一个依赖于静态Java库(static.jar)的应用程序

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    # List of static libraries to include in the package

    LOCAL_STATIC_JAVA_LIBRARIES := static-library

    # Build all java files in the java subdirectory

    LOCAL_SRC_FILES := $(call all-subdir-java-files)

    # Name of the APK to build

    LOCAL_PACKAGE_NAME := LocalPackage

    # Tell it to build an APK

    include $(BUILD_PACKAGE)

    (6)编译一个需要用平台的key签名的应用程序

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    # Build all java files in the java subdirectory

    LOCAL_SRC_FILES := $(call all-subdir-java-files)

    # Name of the APK to build

    LOCAL_PACKAGE_NAME := LocalPackage

    LOCAL_CERTIFICATE := platform

    # Tell it to build an APK

    include $(BUILD_PACKAGE)

    (7)编译一个需要用特定key前面的应用程序

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    # Build all java files in the java subdirectory

    LOCAL_SRC_FILES := $(call all-subdir-java-files)

    # Name of the APK to build

    LOCAL_PACKAGE_NAME := LocalPackage

    LOCAL_CERTIFICATE := vendor/example/certs/app

    # Tell it to build an APK

    include $(BUILD_PACKAGE)

    (8)添加一个预编译应用程序

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    # Mole name should match apk name to be installed.

    LOCAL_MODULE := LocalMoleName

    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

    LOCAL_MODULE_CLASS := APPS

    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

    include $(BUILD_PREBUILT)

    (9)添加一个静态JAVA库

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    # Build all java files in the java subdirectory

    LOCAL_SRC_FILES := $(call all-subdir-java-files)

    # Any libraries that this library depends on

    LOCAL_JAVA_LIBRARIES := android.test.runner

    # The name of the jar file to create

    LOCAL_MODULE := sample

    # Build a static jar file.

    include $(BUILD_STATIC_JAVA_LIBRARY)

    (10)Android.mk的编译模块中间可以定义相关的编译内容,也就是指定相关的变量如下:

    LOCAL_AAPT_FLAGS

    LOCAL_ACP_UNAVAILABLE

    LOCAL_ADDITIONAL_JAVA_DIR

    LOCAL_AIDL_INCLUDES

    LOCAL_ALLOW_UNDEFINED_SYMBOLS

    LOCAL_ARM_MODE

    LOCAL_ASFLAGS

    LOCAL_ASSET_DIR

    LOCAL_ASSET_FILES 在Android.mk文件中编译应用程序(BUILD_PACKAGE)时设置此变量,表示资源文件,

    通常会定义成LOCAL_ASSET_FILES += $(call find-subdir-assets)

    LOCAL_BUILT_MODULE_STEM

    LOCAL_C_INCLUDES 额外的C/C++编译头文件路径,用LOCAL_PATH表示本文件所在目录

    举例如下:

    LOCAL_C_INCLUDES += extlibs/zlib-1.2.3

    LOCAL_C_INCLUDES += $(LOCAL_PATH)/src

    LOCAL_CC 指定C编译器

    LOCAL_CERTIFICATE 签名认证

    LOCAL_CFLAGS 为C/C++编译器定义额外的标志(如宏定义),举例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1

    LOCAL_CLASSPATH

    LOCAL_COMPRESS_MODULE_SYMBOLS

    LOCAL_COPY_HEADERS install应用程序时需要复制的头文件,必须同时定义LOCAL_COPY_HEADERS_TO

    LOCAL_COPY_HEADERS_TO install应用程序时复制头文件的目的路径

    LOCAL_CPP_EXTENSION 如果你的C++文件不是以cpp为文件后缀,你可以通过LOCAL_CPP_EXTENSION指定C++文件后缀名

    如:LOCAL_CPP_EXTENSION := .cc

    注意统一模块中C++文件后缀必须保持一致。

    LOCAL_CPPFLAGS 传递额外的标志给C++编译器,如:LOCAL_CPPFLAGS += -ffriend-injection

    LOCAL_CXX 指定C++编译器

    LOCAL_DX_FLAGS

    LOCAL_EXPORT_PACKAGE_RESOURCES

    LOCAL_FORCE_STATIC_EXECUTABLE 如果编译的可执行程序要进行静态链接(执行时不依赖于任何动态库),则设置LOCAL_FORCE_STATIC_EXECUTABLE:=true

    目前只有libc有静态库形式,这个只有文件系统中/sbin目录下的应用程序会用到,这个目录下的应用程序在运行时通常

    文件系统的其它部分还没有加载,所以必须进行静态链接。

    LOCAL_GENERATED_SOURCES

    LOCAL_INSTRUMENTATION_FOR

    LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME

    LOCAL_INTERMEDIATE_SOURCES

    LOCAL_INTERMEDIATE_TARGETS

    LOCAL_IS_HOST_MODULE

    LOCAL_JAR_MANIFEST

    LOCAL_JARJAR_RULES

    LOCAL_JAVA_LIBRARIES 编译java应用程序和库的时候指定包含的java类库,目前有core和framework两种

    多数情况下定义成:LOCAL_JAVA_LIBRARIES := core framework

    注意LOCAL_JAVA_LIBRARIES不是必须的,而且编译APK时不允许定义(系统会自动添加)

    LOCAL_JAVA_RESOURCE_DIRS

    LOCAL_JAVA_RESOURCE_FILES

    LOCAL_JNI_SHARED_LIBRARIES

    LOCAL_LDFLAGS 传递额外的参数给连接器(务必注意参数的顺序)

    LOCAL_LDLIBS 为可执行程序或者库的编译指定额外的库,指定库以"-lxxx"格式,举例:

    LOCAL_LDLIBS += -lcurses -lpthread

    LOCAL_LDLIBS += -Wl,-z,origin

    LOCAL_MODULE 生成的模块的名称(注意应用程序名称用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)

    LOCAL_MODULE_PATH 生成模块的路径

    LOCAL_MODULE_STEM

    LOCAL_MODULE_TAGS 生成模块的标记

    LOCAL_NO_DEFAULT_COMPILER_FLAGS

    LOCAL_NO_EMMA_COMPILE

    LOCAL_NO_EMMA_INSTRUMENT

    LOCAL_NO_STANDARD_LIBRARIES

    LOCAL_OVERRIDES_PACKAGES

    LOCAL_PACKAGE_NAME APK应用程序的名称

    LOCAL_POST_PROCESS_COMMAND

    LOCAL_PREBUILT_EXECUTABLES 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用,指定需要复制的可执行文件

    LOCAL_PREBUILT_JAVA_LIBRARIES

    LOCAL_PREBUILT_LIBS 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用, 指定需要复制的库.

    LOCAL_PREBUILT_OBJ_FILES

    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES

    LOCAL_PRELINK_MODULE 是否需要预连接处理(默认需要,用来做动态库优化)

    LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)

    LOCAL_RESOURCE_DIR

    LOCAL_SDK_VERSION

    LOCAL_SHARED_LIBRARIES 可链接动态库

    LOCAL_SRC_FILES 编译源文件

    LOCAL_STATIC_JAVA_LIBRARIES

    LOCAL_STATIC_LIBRARIES 可链接静态库

    LOCAL_UNINSTALLABLE_MODULE

    LOCAL_UNSTRIPPED_PATH

    LOCAL_WHOLE_STATIC_LIBRARIES 指定模块所需要载入的完整静态库(这些精通库在链接是不允许链接器删除其中无用的代码)

    LOCAL_YACCFLAGS

    OVERRIDE_BUILT_MODULE_PATH

    ‘肆’ 如何将windows下的.cpp文件,编译成android上的可执行文件。曾见说直接用ide,具体怎么用 谢谢

    首先要说的是直接用IDE应该是行不通的.但是利用JNI方式的是可以让一个cpp代码嵌入到apk中去的.因为android本身就是利用这种机制来实现很多C的应用.

    ‘伍’ 怎么使用Android源码编译c模块生成可执行文件

    1. 在./development目录下创建一目录 如:myhello
    2. 进入hello目录,在其下编写自己的.c文件,如: myhello.c
    #include <stdio.h>
    int main()
    {
    printf("hello world\n");
    exit(0);
    //return 0;
    }
    3. 在hello目录中,编写Android.mk, 内容如下:
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := myhelloworld
    LOCAL_SRC_FILES := myhello.c
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_EXECUTABLE)
    4. 回到Android源代码顶层目录,进行编译,make myhelloworld
    5. 生成的可执行文件位于:out/target/proct/lotus/system/bin/ 目录下
    6. adb push 到手机 /data 目录下,然后进入adb shell,到data目录下,执行./myhelloworld 皆可

    手动编译连接【arm-eabi-gcc 的目录随andorid的版本而有变化,还有就是需要链接的文件如果比较多时,需要很多-l 就很麻烦了】
    7、编译成目标文件:
    #$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -I bionic/libc/arch-arm/include/ -I bionic/libc/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -g -c helloworld.c -o hello.o
    8、生成可执行代码:
    #$(yourAndroid)/prebuilt/linux-x86/toolchain/[arm-eabi-4.2.1]/bin/arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -o helloworld -Lout/target/proct/[generic]/obj/lib -Wl,-rpath-link=out/target/proct/[generic]/obj/lib -lc hello.o -entry=main

    其中[ ]中部分根据实际情况修改

    **************************************************
    实验:
    1. 建目录(my Android)/development/test, 在该目录下新建 Android.mk和fb_test.c文件

    2. Android.mk文件

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := myfbtest
    LOCAL_SRC_FILES := fb_test.c
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_EXECUTABLE)

    3. 以下为fb_test.c
    #include <fcntl.h>
    #include <linux/fb.h>
    #include <sys/mman.h>
    #include <linux/kd.h>

    #include <stdio.h>

    #define FBBIT_PER_PIXEL 32
    #define FBBIT_PIXEL_IMAGE 16
    #define PIXELS_WIDTH_BYTE 4
    #define BYTE_PER_PIXEL 3
    #define FB_GRAPHICS_PATH "/dev/graphics/fb0"
    #define DEV_TTY0_PATH "/dev/tty0"

    #define DISPLAY_ERROR -1
    #define DISPLAY_SUCCESS 0

    #define GET_BATTERYCAPACITY_ERR -1

    #define MAX_STR 255

    static struct {
    int fd;
    void *pixels;
    struct fb_fix_screeninfo fixed;
    struct fb_var_screeninfo var;
    int align_xres;
    } fb;

    int getBatteryCapacity(void)
    {
    FILE *in;
    char tmpStr[MAX_STR + 1];
    char capfile[] = "/sys/class/power_supply/battery/capacity";

    if (capfile == NULL)
    return GET_BATTERYCAPACITY_ERR;

    in = fopen(capfile, "rt");
    if (in == NULL)
    return GET_BATTERYCAPACITY_ERR;

    if (fgets(tmpStr, MAX_STR, in) == NULL) {
    printf("Failed to read battery capacity!\n");
    fclose(in);
    return GET_BATTERYCAPACITY_ERR;

    }

    printf("Battery capacity(ascii): %s\n", tmpStr);
    fclose(in);

    return 0;//atoi(tmpStr);
    }

    static int vt_set_graphicsmode(int graphics)
    {
    int fd, r;
    fd = open(DEV_TTY0_PATH, O_RDWR | O_SYNC);
    if (fd < 0)
    return DISPLAY_ERROR;
    r = ioctl(fd, KDSETMODE, graphics);
    close(fd);
    return r;
    }

    int display_init(void)
    {
    fb.fd = open(FB_GRAPHICS_PATH, O_RDWR);
    if (fb.fd < 0)
    return DISPLAY_ERROR;

    if (ioctl(fb.fd, FBIOGET_FSCREENINFO, &fb.fixed) < 0)
    return DISPLAY_ERROR;
    if (ioctl(fb.fd, FBIOGET_VSCREENINFO, &fb.var) < 0)
    return DISPLAY_ERROR;
    fb.align_xres = fb.fixed.line_length /
    (fb.var.bits_per_pixel >> BYTE_PER_PIXEL);

    fb.pixels = mmap(0, fb.fixed.line_length * fb.var.yres_virtual,
    PROT_READ | PROT_WRITE, MAP_SHARED, fb.fd, 0);
    if (fb.pixels == MAP_FAILED)
    return DISPLAY_ERROR;

    vt_set_graphicsmode(KD_GRAPHICS);

    memset(fb.pixels, 0, fb.fixed.line_length * fb.var.yres_virtual);
    //display_update(fb.pixels, fb.align_xres, fb.var.yres);
    fb.var.activate = FB_ACTIVATE_FORCE;
    ioctl(fb.fd, FBIOPUT_VSCREENINFO, &fb.var);

    printf("display_init ok\n");

    return DISPLAY_SUCCESS;
    }

    void display_on(void)
    {
    ioctl(fb.fd, FBIOBLANK, FB_BLANK_UNBLANK);
    }

    void display_off(void)
    {
    ioctl(fb.fd, FBIOBLANK, FB_BLANK_POWERDOWN);
    }

    int main()
    {
    display_init();
    display_off();//关显示屏

    getBatteryCapacity();
    sleep(5);

    display_on();//开显示屏

    return 0;
    }

    ‘陆’ 如何利用android studio 编译c code

    学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景。

    在目前 android 提供的开发环境里,如果要编写 c / cpp code, 一般是通过 ndk 开发套件,基本方法就是在
    windows 或 linux 发行版上下载 ndk 环境,然后编写 c / cpp code 然后编写 Android.mk 文件,最后用
    ndk-build 等工具进行编译,编译出来的可执行文件再通过 adb push 的方式提交到 devices 或 emulator
    运行,如果要分析其指令,需要下载 android 提供的 prebuilts binutils 工具集(如android 源码的
    prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/arm-linux-androideabi/bin/
    目录),如果你在linux上用file命令查看一下这些工具,会发现 :

    root@ubuntu:bin# file objmp
    objmp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped

    它们是x86架构的,这样,你要分析devices或emulator里的elf文件,需要adb pull 下来,放在本地的linux环境或者windows里,用上述prebuilt工具分析。

    稍微思考一下就会发现上述 ndk
    的方式,对我们的需求来说有点太复杂了,我们真正希望的是像在标准linux发行版上那样,可以用vi/vim等编辑工具写 c/cpp
    code,然后用 gcc /g++ 等编译工具编译,然后能直接运行或者用gdb调试,
    或者用readelf/objmp等命令查看elf结果和汇编码。问题变成了:如何在android上实现这一切?

    下面的方式是经过本人收集和实际测试证明可行的,我的环境是:

    目标机:小米2手机, android4.4.4, miui 6.3.5

    本地机: win7

    效果:在本地机adb目标机的shell, 然后用vi写 c/cpp code, 直接在shell上用gcc编译,用objmp分析指令

    实现步骤如下:

    1. 首先安装 busybox apk . 这个app提供了后续需要的 busy vi, busy tar 等工具

    2. 下载 adb putty ,http://yunpan.cn/cZ5x9UrDFUDdK (提取码:e70e)

    这个工具用来做终端,这里为什么不用win7自带的cmd或者其他增强版如 powerCmd 呢? 因为用 windows 的 cmd 终端,adb shell 连接上手机后,执行 busybox vi 等命令,会出现乱码,参考http://www.hu.com/question/20624475, 用这款 adb putty 终端则可以正常使用。

    3. 下载 gcc arm,http://yunpan.cn/cZ5YVZzbvJqq4 (提取码:80b8)

    ‘柒’ 如何单独编译Android源码中的模块

    1.make 模块名称
    需要查看Android.mk文件的LOCAL_PACKAGE_NAME变量。
    2.mmm命令
    用于在源码根目录编译指定模块,参数为模块的相对路径。只能在第一次编译后使用。比如要编译Phone部分源码,需要在终端中执行以下命令:
    $mmm packages/apps/phone
    3.mm命令
    用于在模块根目录编译这个模块。只能在第一次编译后使用。例如要编译Phone部分源码,需要在终端中执行以下命令:
    $cd packages/apps/phone
    $mm
    注:mmm和mm命令必须在执行“.build/envsetup.sh”之后才能使用,并且只编译发生变化的文件。如果要编译模块的所有文件,需要-B选项,例如mm -B。

    ‘捌’ 如何编译android 可执行的二进制文件

    Android由于其代码是放在dalvik虚拟机上的托管代码,所以能够很容易的将其反编译为我们可以识别的代码。 之前我写过一篇文章反编译Android的apk包到smali文件 然后再重新编译签名后打包实现篡改apk的功能。 最近又有一种新的方法来实现直接从Android apk包里的classes.dex文件,把dex码反编译到java的.class二进制码,然后从.class二进制码反编译到java源码想必就不用我来多说了吧。 首先我们需要的工具是dex2jar和jd-gui 其中第一个工具dex2jar是用来把classex.dex文件也就是dex二进制码转化为java的标准.class二进制码,然后jd-gui是把标准的.class二进制码再反编译为java源码。 首先从apk包里面提取出classes.dex 放到dex2jar目录下 然后在命令行下执行 dex2jar.bat classes.dex 这时执行成功后会生成一个classes.dex.dex2jar.jar文件 这个文件再用jd-gui打开,如下图 几乎跟我自己写的这个程序的源码一样 提供这个反编译方法主要用于大家学习与研究,有问题可以与我邮件讨论。 希望大家不要用这个方法从事恶意的活动,毕竟,别人辛辛苦苦写程序也不容易,用这个方法可以大致的学习到别人写的程序的逻辑,架构,希望对大家有所帮助。 Android 逆向apk程序的心得 本文主要介绍如何逆向一个Android的APK应用程序,本文提供的方法仅供研究学习之用。 本文需要用到的工具有 jdk 这个用于搭建java运行环境 AXMLPrinter2.jar 这个用于逆向.xml文件 baksmali.jar 这个用于逆向classex.dex文件 由于Android的.apk文件实际上就是一个zip文件 可以直接用winrar打开

    ‘玖’ 怎么单独编译安卓系统源码指定模块

    一. 首先在Android源代码目录下的build目录下,有个脚本文件envsetup.sh,执行这个脚本文件后,就可以获得一些有用的工具:
    USER-NAME@MACHINE-NAME:~/Android$ . ./build/envsetup.sh
    注意,这是一个source命令,执行之后,就会有一些额外的命令可以使用:
    - croot: Changes directory to the top of the tree.
    - m: Makes from the top of the tree.
    - mm: Builds all of the moles in the current directory.
    - mmm: Builds all of the moles in the supplied directories.
    - cgrep: Greps on all local C/C++ files.
    - jgrep: Greps on all local Java files.
    - resgrep: Greps on all local res/*.xml files.
    - godir: Go to the directory containing a file.
    这些命令的具体用法,可以在命令的后面加-help来查看,这里我们只关注mmm命令,也就是可以用它来编译指定目录的所有模块,通常这个目录只包含一个模块。
    二. 使用mmm命令来编译指定的模块,例如Email应用程序:
    USER-NAME@MACHINE-NAME:~/Android$ mmm packages/apps/Email/
    编译完成之后,就可以在out/target/proct/generic/system/app目录下看到Email.apk文件了。Android系统自带的App都放在这具目录下。另外,Android系统的一些可执行文件,例如C编译的可执行文件,放在out/target/proct/generic/system/bin目录下,动态链接库文件放在out/target/proct/generic/system/lib目录下,out/target/proct/generic/system/lib/hw目录存放的是硬件抽象层(HAL)接口文件,后面的文章里面,我们会陆续提及到,敬请关注。
    三. 编译好模块后,还要重新打包一下system.img文件,这样我们把system.img运行在模拟器上时,就可以看到我们的程序了。
    USER-NAME@MACHINE-NAME:~/Android$ make snod
    四. 参照Ubuntu上下载、编译和安装Android最新源代码一文介绍的方法运行模拟器:
    USER-NAME@MACHINE-NAME:~/Android$ emulator
    这样一切就搞定了。

    ‘拾’ 如何编译能在android上运行的C程序

    本人使用mini6410开发了一个sqlite数据库的程序,在mini6410的linux系统下已经能够成功运行了。因为Android使用的也是linux内核,所以我想当然的认为按照同样的方法将程序移植到mini6410的android系统中也可以成功运行,但是当我运行程序的时候却提示我不能找到可执行文件(xlisten-arm是交叉编译出来的可执行文件):

    / # ./xlisten-arm
    /system/bin/sh: ./xlisten-arm: not found

    1.探索:

    在网上搜索起初认为可能是库文件的不全导致的,于是在查看可执行文件xlisten-arm所需要的动态链接库:

    执行语句:

    # arm-linux-readelf -a ./xlisten-arm | grep "Shared"
    0x00000001 (NEEDED) Shared library: [libsqlite3.so.0]
    0x00000001 (NEEDED) Shared library: [libm.so.6]
    0x00000001 (NEEDED) Shared library: [libcrypt.so.1]
    0x00000001 (NEEDED) Shared library: [libpthread.so.0]
    0x00000001 (NEEDED) Shared library: [libdl.so.2]
    0x00000001 (NEEDED) Shared library: [libc.so.6]

    知道所需的动态链接库后,到android文件系统中去照着写库文件,在目录/system/lib 中,果然缺少相应的库文件,于是认为找到了我问题的根源所在,在复制相应库文件的时候为了保留原来的属性,还特意用了

    #cp -a filename dir

    谁知将这些库都添加进去以后,仍然无济于事!

    看来不仅仅事库文件缺失的问题了,而且一般来说,如果真的是因为缺少库文件而导致的问题,终端会提示我们链接某库文件时没有找到该库文件。

    2.正确的解决方法:

    将程序编译的时候选择静态编译,即使用选项 -static

    我是对Makefile文件中的CFLAG变量进行修改

    CFLAGS = -Wall

    改为;

    CFLAGS = -Wall -static

    然而此时又出现问题了:

    undefined reference to `pthread_mutex_*'

    undefined reference to `dl*'

    提示没有定义这些函数,于是在包含的库文件中添加了这两个库文件

    在Makefile中,修改LIBS变量;

    LIBS = -lsqlite3 -lm -lcrypt

    改为:

    LIBS = -lsqlite3 -lm -lcrypt -lpthread -ldl

    然后进行交叉编译,成功了!

    编译出来的可执行文件比较大,因为事静态编译的,我的有2M多,

    拷贝到开发板的andriod系统中,

    修改权限:

    #chmod 777 xlisten-arm

    执行:

    / # ./xlisten-arm

    OK!能够正确的执行了!

    阅读全文

    与如何编译安卓的可执行文件相关的资料

    热点内容
    数据加密过程简述 浏览:809
    python基础教程pdf下载 浏览:123
    如何统计服务器 浏览:742
    苹果和安卓怎么赠送模组 浏览:803
    服务器倒计时怎么弄 浏览:30
    excel文件夹更新 浏览:433
    亿点连接app哪里好 浏览:788
    java扫码支付 浏览:875
    单片机行车记录仪 浏览:393
    oppo云服务器什么意思 浏览:82
    51单片机可以编译多少公里 浏览:27
    用什么工具制作安卓应用 浏览:488
    单片机数码管的代码 浏览:779
    第一款安卓手机是什么牌子 浏览:396
    java异步web 浏览:274
    51单片机读tf卡 浏览:940
    linux下获取文件 浏览:320
    加密文件电脑显示无屏幕截取权限 浏览:356
    虚荣安卓用什么充值 浏览:754
    阿里云没有服务器如何备案 浏览:708