導航:首頁 > 源碼編譯 > 如何編譯安卓的可執行文件

如何編譯安卓的可執行文件

發布時間: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!能夠正確的執行了!

    閱讀全文

    與如何編譯安卓的可執行文件相關的資料

    熱點內容
    程序員面試金典第6版 瀏覽:718
    內存2g編譯安卓 瀏覽:414
    單片機小數點怎麼亮 瀏覽:414
    安卓手機怎麼設置健康碼雙擊兩下就出來 瀏覽:266
    同一個文件夾可以存在兩個相同的文件嗎 瀏覽:535
    動態重編譯jit 瀏覽:132
    android藍牙音頻 瀏覽:451
    mc國際版怎麼加伺服器 瀏覽:816
    phphtaccess配置 瀏覽:747
    dos命令鎖定 瀏覽:486
    python中調換數據位置 瀏覽:300
    武漢市中石油加油什麼APP優惠 瀏覽:545
    程序員33歲以後的規劃 瀏覽:858
    招標文件加密流轉 瀏覽:897
    源碼數據盈利可信嗎 瀏覽:860
    android閃爍圖標 瀏覽:942
    程序員呼蘭搞笑 瀏覽:352
    蘋果怎麼關閉自動排序app 瀏覽:963
    國外可以訪問到用什麼伺服器地址 瀏覽:949
    揚州前端程序員私活價格 瀏覽:990