當前位置:首頁 » 安卓系統 » android編譯命令

android編譯命令

發布時間: 2022-07-18 08:18:56

❶ 如何單獨編譯Android源代碼中的模塊

Android源碼目錄下的build/envsetup.sh文件,描述編譯的命令

- 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.

要想使用這些命令,首先需要在android源碼根目錄執行. build/envsetup.sh 腳本設置環境

m:編譯所有的模塊

mm:編譯當前目錄下的模塊,當前目錄下要有Android.mk文件

mmm:編譯指定路徑下的模塊,指定路徑下要有Android.mk文件

下面舉個例子說明,假設我要編譯android下的\hardware\libhardware_legacy\power模塊,當前目錄為源碼根目錄,方法如下:

1、. build/envsetup.sh

2、mmm hardware/libhardware_legacy/power/

編譯完後 運行 make snod

會重新將你改過的模塊打入到system.img中

❷ 自己可以編譯安卓源碼嗎

用最新的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動態鏈編的native c/c++code

    編譯環境要求:下載Android的源碼,並執行完一次完整的編譯。以下的所有命令均是在編譯後的源碼根目錄下執行。

    1. 編譯C code
    同樣以hello.c為例:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    printf("hello, world!\n");
    return 0;
    }


    執行以下步驟生成動態鏈編的binary文件:
    生成目標文件: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/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -include system/core/include/arch/linux-arm/AndroidConfig.h -c -o hello.o hello.c
    生成可執行程序: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 hello -Lout/target/proct/generic/obj/lib -Wl,-rpath-link=out/target/proct/generic/obj/lib -lc -lstdc++ out/target/proct/generic/obj/lib/crtbegin_dynamic.o hello.o -Wl,--no-undefined ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a out/target/proct/generic/obj/lib/crtend_android.o

    用命令file查看生成的hello文件屬性:
    hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
    可以證明此時的hello是一個動態鏈編的文件。

    2. 編譯native c++ 代碼
    以hello_cpp為例:

    hello_cpp.h
    #ifndef HELLO_CPP_H
    #define HELLO_CPP_H

    class Hello
    {
    public:
    Hello();
    ~Hello();
    void printMessage(char* msg);
    };

    #endif

    hello_cpp.cpp
    #include <stdio.h>
    #include "hello_cpp.h"

    Hello::Hello()
    {
    }

    Hello::~Hello()
    {
    }

    void Hello::printMessage(char* msg)
    {
    printf("C++ example printing message: %s", msg);
    }

    int main(void)
    {
    Hello hello_obj;
    hello_obj.printMessage("Hello world!\n");
    return 0;
    }
    執行以下命令完成:
    編譯目標文件:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++ -I bionic/libc/arch-arm/include -I bionic/libc/include -I bionic/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -include system/core/include/arch/linux-arm/AndroidConfig.h -fno-exceptions -fno-rtti -c -o hello_cpp.o hello_cpp.cpp
    編譯可執行程序:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm- eabi-g++ -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -o hello_cpp -Lout/target/proct/generic/obj/lib -Wl,-rpath-link=out/target/proct/generic/obj/lib -lc -lstdc++ out/target/proct/generic/obj/lib/crtbegin_dynamic.o hello_cpp.o -Wl,--no-undefined ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a out/target/proct/generic/obj/lib/crtend_android.o

    同樣用file查看hello_cpp的文件屬性:
    hello_cpp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

    但是很不幸的是,android自帶的toolchain不支持C++標准庫的開發,即所有的std namespace下的類均無法使用,包括基本的string。

    ❹ 如何單獨編譯Android源碼中的模塊

    第一次下載好Android源代碼工程後,我們通常是在Android源代碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統鏡像system.img了。以後如果我們修改了Android源代碼中的某個模塊或者在Android源代碼工程新增一個自己的模塊,是不是還是執行make命令呢?答案是否定的,Google為我們准備了另外的命令來支持編譯單獨的模塊,以及重新打包system.img的命令。在繼續學習Android源代碼之前,就讓我們先來看看這個命令吧。
    一. 首先在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開發,怎麼使用ndk編譯成.so文件

    一、首先下載android-ndk,官方網站是:http://developer.android.com/tools/sdk/ndk/index.html
    目前最新的版本是android-ndk-r8e-windows-x86.zip,下載地址:
    http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
    下載後把壓縮解壓出來,例如:D:\ndk,目錄下的ndk-build.cmd就是用來編譯的批處理命令。
    二、編譯,打開cmd命令行窗口,cd進入目錄:D:\ndk\samples\hello-jni,
    然後執行命令:D:\ndk\ndk-build.cmd(如果設置過環境變數則直接使用ndk-build.cmd)來編譯hello-jni,如果沒有錯誤會輸出:
    Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
    Gdbsetup : libs/armeabi/gdb.setup
    "Compile thumb : hello-jni <= hello-jni.c
    SharedLibrary : libhello-jni.so
    Install : libhello-jni.so => libs/armeabi/libhello-jni.so
    三、創建android應用程序並使用so文件
    打開eclipse創建一個android應用程序HelloJni,默認的com.example.hellojni包下面有一個MainActivity.java,
    在此包下添加一個HelloJni.java,

    ❻ android.mk ubuntu怎麼編譯

    一個Android.mk file用來向編譯系統描述你的源代碼。具體來說:該文件是GNU Makefile的一小部分,會被編譯系統解析一次或多次。你可以在每一個Android.mk file中定義一個或多個模塊。每個模塊屬下列類型之一:
    1)APK程序,一般的Android程序,編譯打包生成apk文件
    2)Java庫,java類庫,編譯打包生成jar文件
    3) CC++應用程序,可執行的CC++應用程序
    4)CC++靜態庫,編譯生成CC++靜態庫,並打包成.a文件
    5)CC++共享庫,編譯生成共享庫(動態鏈接庫),並打包成.so, 有且只有共享庫才能被安裝/復制到您的應用軟體(APK)包中。
    (1)先看一個簡單的例子:一個簡單的"hello world",比如下面的文件:
    sources/helloworld/helloworld.c
    sources/helloworld/Android.mk
    相應的Android.mk文件會像下面這樣:

    ---------- cut here ------------------

    普通的.mk一樣

    =====================================m、mm、mmm編譯命令===========================================

    android源碼目錄下的build/envsetup.sh文件,描述編譯的命令
    - 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.

    所以要想使用這些命令,首先需要在android源碼根目錄執行build/envsetup.sh 腳本設置環境。
    m:編譯所有的模塊
    mm:編譯當前目錄下的模塊,當前目錄下要有Android.mk文件
    mmm:編譯指定路徑下的模塊,指定路徑下要有Android.mk文件

    下面舉個例子說明,假設我要編譯android下的hardwarelibhardware_legacypower模塊,當前目錄為源碼根目錄,方法如下:
    1、. build/envsetup.sh
    2、mmm hardware/libhardware_legacy/power/
    或者 :
    1、. build/envsetup.sh
    2、cd hardware/libhardware_legacy/power/
    3、mm

    m沒有試過。默認上述兩個編譯命令,只編譯發生變化的文件。如果要編譯模塊的所有文件,需要-b選項,例如mm -b或者mmm -b

    make命令,也可以用來編譯。如果是include $(BUILD_PACKAGE),用makeLOCAL_PACKAGE_NAME值;如果是include $(BUILD_EXECUTABLE)或者include $(BUILD_JAVA_LIBRARY),用makeLOCAL_MODULE值(未驗證)。

    ❼ android中如何編譯出64位so文件

    如果是在Linux下編譯Android源碼,有可能是兩個原因:
    1. lunch命令有32位和64位的區別,注意選能夠編譯64位so的命令

    2. mk文件中有LOCAL_MODULE_PATH的值比如為$(TARGET_OUT_SHARED_LIBRARIES)/hw的改為LOCAL_MODULE_RELATIVE_PATH := hw,後一種可以分別在lib和lib64下分別生成32位和64位的so文件,這個看看編譯後的信息就知道了.

    ❽ 如何在Android系統源碼的環境下用make來編譯

    第一個方法簡單點,不過需要在Android系統源碼的環境下用make來編譯:
    1. 在應用程序的AndroidManifest.xml中的manifest節點中加入
    android:sharedUserId="android.uid.system"這個屬性。
    2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
    3. 使用mm命令來編譯,生成的apk就有修改系統時間的許可權了。

    ❾ android 怎樣編譯kernel 命令 make

    方法如下:
    在Linux的環境下:
    建立目錄:

    mkdir ~/android-kernel cd android-kernel

    下載源代碼, 大概有280MB, 慢慢等哈~~~ (當然你要先安裝git) git clone git://git.linuxtogo.org/home/groups/mobile-linux/kernel.git
    類似的屏幕信息:
    Initialized empty Git repository in /home/user/android-kernel/kernel/.git/ remote: Counting objects: 908251, done.
    remote: Compressing objects: 100% (153970/153970), done.
    remote: Total 908251 (delta 755115), reused 906063 (delta 753016) Receiving objects: 100% (908251/908251), 281.86 MiB | 292 KiB/s, done. Resolving deltas: 100% (755115/755115), done. Checking out files: 100% (22584/22584), done.
    然後去到htc-msm branch: cd kernel
    git checkout -b htc-msm origin/htc-msm
    屏幕信息:
    Branch htc-msm set up to track remote branch refs/remotes/origin/htc-msm. Switched to a new branch "htc-msm"

    下載ARM的toolchain, 大概64MB左右, 下到~/android-kernel: 下

    :
    http://www.codesourcery.com/gnu_toolchains/arm/portal/package2549/public/arm-none-linux-gnueabi/arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

    cd ~/android-kernel
    tar xjf arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
    編譯kernel

    准備預設的Kaiser 配置文件.config
    cd ~/android-kernel/kernel

    make htckaiser_defconfig ARCH=arm
    然後編譯zImage:
    export PATH=~/android-kernel/arm-2008q1/bin:$PATH
    make zImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
    編譯好的在: ~/android-kernel/kernel/arch/arm/boot/zImage

    如果你的機器是多核的, 可以編譯的時候用-j <cores/cpus_number>來加速:
    比如, 雙核的可以:
    make -j 2 zImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi
    滿意請採納謝謝

    熱點內容
    微信提示存儲空間不足 發布:2025-01-24 01:19:53 瀏覽:963
    安卓電腦管家如何清除緩存 發布:2025-01-24 00:55:42 瀏覽:148
    怎麼上傳歌曲到qq音樂 發布:2025-01-24 00:45:30 瀏覽:65
    養貓用什麼配置 發布:2025-01-24 00:37:58 瀏覽:812
    pythongps 發布:2025-01-24 00:37:51 瀏覽:813
    辦公編程滑鼠 發布:2025-01-24 00:37:07 瀏覽:386
    wpa加密類型 發布:2025-01-24 00:35:58 瀏覽:960
    如何用批處理實現ftp映射盤符 發布:2025-01-24 00:25:45 瀏覽:954
    win7sql版本 發布:2025-01-24 00:22:16 瀏覽:499
    安卓手機市場有什麼 發布:2025-01-23 23:48:56 瀏覽:26