当前位置:首页 » 安卓系统 » 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 05:11:22 浏览:846
    笔记本x17配置怎么选 发布:2025-01-24 05:05:53 浏览:7
    python如何封装 发布:2025-01-24 05:05:46 浏览:843
    csgo怎么连接服务器 发布:2025-01-24 05:05:45 浏览:322
    408哪个配置合适 发布:2025-01-24 05:01:54 浏览:882
    oraclesql删除重复 发布:2025-01-24 05:01:12 浏览:408
    少儿编程排行 发布:2025-01-24 04:40:46 浏览:698
    搭建服务器怎么使用 发布:2025-01-24 04:19:34 浏览:444
    平行进口霸道哪些配置有用 发布:2025-01-24 04:19:32 浏览:874
    ngram算法 发布:2025-01-24 04:03:16 浏览:659