Android C编译
windows下eclipse集成cygwin编译android_NDK(即结合jni调用c-c++)

一、前言Google Android发布了NDK,引起了很多发人员的兴趣。
NDK全称:Native Development Kit,官方下载地址:/sdk/ndk/index.html1.NDK是什么The Android NDK is a toolset that lets you embed components that make use of native code in your Android applications.Android applications run in the Dalvik virtual machine. The NDK allows you to implement parts of your applications using native-code languages such as C and C++. This can provide benefits to certain classes of applications, in the form of reuse of existing code and in some cases increased speed.英语不好的,自己GOOGLE吧。
简而言之,NDK就是一套基于C和C++底层开发API的集成工具组件,使用NDK开发编译的应用程序同样可以基于虚拟机Dalvik上“疯跑”。
如果你问为啥推出NDK,敝人以为C和C++开发的应用程序其卓越性能不用提了,至少C和C++被反编译的可能性降低了很多,要比JAVA安全保密多了。
2.ANDROID NDK 带来了什么a)一套工具,基于本机编译的C和C++源代码库。
b)一种部署在ANDROID设备上,可以将so和java一起打包成APK的方法。
c) A set of native system headers and libraries that will be supported in all future versions of theAndroid platform, starting from Android 1.5. Applications that use native activities must be run onAndroid 2.3 or later.(自个理解吧,最好别用GOOGLE,我试过了不是人话。
Android源码编译

Android源码编译开发工具:Ubuntu10.04在Ubuntu下使用root用户登录,注意root一开始是锁定的,使用如下命令解锁:sudopasswd root 按回车铵,提示输入当前密码,在提示输入二次密码。
输入完成切换用户使用root用户登录。
Android源码结构Makefile (全局的Makefile)bionic (Bionic含义为仿生,这里面是一些基础的库的源代码)bootloader(引导加载器)build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)dalvik (JAVA虚拟机)development(程序开发所需要的模板和工具)external (目标机器使用的一些库)frameworks (应用程序的框架层)hardware (与硬件相关的库)kernel (Linux2.6的源代码)packages (Android的各种应用程序)prebuil (Android在各种平台下编译的预置脚本)recovery (与目标的恢复功能相关)system (Android的底层的一些库)Out (编译好的文件)编译Android源码必需的安装的软件包g++库文件有可能Ubuntu自带,使用g++ -v命令查找是否安装,如果没有自带请手动安装,使用如下命令,sudo apt-get-install g++-4.4.注意:g++分很多版本,如果使用了最新版本4.6将没办法编译,建议安装4.4版本Gcc库文件有可能Ubuntu自带,使用gcc–v命令查找是否安装,如果没有自带使用如下命令手动安装,sudo apt-get-install gcc-4.4.注意:gcc分很多版本,如果使用了最新版本4.6将没办法编译,建议安装4.4版本不过还有一些应该是linux系统自带的,如果缺少就按照提示install一下sudo apt-get install build-essentialsudo apt-get install makesudo apt-get install libc6-devsudo apt-get install patchsudo apt-get install texinfosudo apt-get install libncurses-devsudo apt-get install git-core gnupgsudo apt-get install flex bison gperflibsdl-dev libesd0-devlibwxgtk2.6-dev build-essential zip curlsudo apt-get install ncurses-devsudo apt-get install zlib1g-devsudo apt-get install valgrindsudo apt-get install python2.5安装java环境首先从sun官方网站下载jdk-6u16-linux-i586.bin文件并安装它。
android源码编译及rom制作

GNU make 3.81-3.82 JDK 6(生成 Gingerbread 或更高版本) JDK 5(Froyo 或旧版本) Git 1.7 或更高版本 gcc/g++ 4.4 (其他版本编译出错)
设置Linux编译环境
安装JDK: Java6:
$ sudo add-apt-repository "deb / lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk
一整套编译 100GB 选择编译分支
建议:不要使用虚拟机安装ubuntu编译 1、编译花费时间长,需要内存大 2、如果配置低,可能会卡住不动 3、虚拟机连接手机有问题,很可能不识别,编译前需要从手机拉 配置数据;不能使用fastboot模式刷机
设置Linux编译环境
|-- prebuilt
(x86和arm架构下预编译的一些资源)
|-- sdk
(sdk及模拟器)
|-- system
(文件系统库、应用及组件——C语言)
|-- vendor
(厂商定制代码)
Android源码编译
初始化编译环境 下载代码树 编译 编译内核
sudo chmod a+rx /etc/udev/rules.d/51-android.rules sudo /etc/init.d/udev restart
3.重启adb服务(必须为sudo 已配置android环境变量)
ANDROID源码编译流程

ANDROID源码编译流程编译Android源代码是一个相对复杂的过程,但是如果你按照正确的步骤进行,你就可以成功地编译出你自己的Android系统。
下面是一个大致的流程来编译Android源代码:1.环境准备:在开始编译Android源代码之前,你需要确保你的系统满足以下要求:- Linux系统(推荐使用Ubuntu)-64位操作系统-至少8GB的RAM-大规模存储空间(30GB或更多)你还需要安装一些必要的开发包和工具,例如JDK、Git等。
详细的要求可以在Android官方网站上找到。
2.获取源代码:要编译Android系统,你需要先获取源代码。
Android的源代码存储在Git仓库中,你可以使用Repo工具来管理多个Git仓库。
首先,你需要安装Repo工具。
你可以通过下面的命令来安装:```$ sudo apt-get install repo```之后,在一个合适的目录下创建一个新的文件夹来存放源代码:$ mkdir myandroid$ cd myandroid```使用Repo工具来初始化一个仓库:``````之后,同步源代码到你的本地仓库:```$ repo sync```这个过程可能需要花费几个小时甚至更长时间,取决于你的网络速度和计算机配置。
3.构建工具链:Android使用GNU Make和Ninja构建工具来构建系统。
你需要安装这些工具。
首先,安装GNU Make和一些必要的依赖库:```$ sudo apt-get install build-essential然后,安装Ninja:```$ sudo apt-get install ninja-build```4.配置构建环境:在构建Android系统之前,你需要进行一些配置操作。
首先,你需要选择要构建的目标设备和版本。
你可以在Android源代码的根目录中找到`lunch`脚本。
运行`lunch`脚本并选择你的目标:```$ source build/envsetup.sh$ lunch```然后,你需要选择编译时使用的编译器。
AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)

AndroidStudio⽤Cmake⽅式编译NDK代码(cmake配置.a库)1.cmake是什么?CMake是⼀个跨平台的安装()⼯具,可以⽤简单的语句来描述所有平台的安装(编译过程)。
他能够输出各种各样的makefile或者project⽂件,能测试所⽀持的C++特性,类似UNIX下的automake。
⾕歌从AndroidStudio2.2以上就添加了Cmake⽅式来编译NDK代码,并从NDK例⼦看出,默认编译的⽅式就是cmake⽅式。
2.⾕歌官⽅的⽤cmake⽅式编译NDK的教程⾕歌从AndroidStudio2.2以上就添加了Cmake⽅式来编译NDK代码,并从NDK例⼦看出,默认编译的⽅式就是cmake⽅式。
如果您希望向现有项⽬添加原⽣代码,请执⾏以下步骤:1. 并将其添加到您的 Android Studio 项⽬中。
如果您已经拥有原⽣代码或想要导⼊预构建的原⽣库,则可以跳过此步骤。
2. ,将您的原⽣源代码构建到库中。
如果导⼊和关联预构建库或平台库,您也需要此构建脚本。
如果您的现有原⽣库已经拥有CMakeLists.txt构建脚本或者使⽤ ndk-build 并包含构建脚本,则可以跳过此步骤。
3. 提供⼀个指向您的 CMake 或 ndk-build 脚本⽂件的路径,。
Gradle 使⽤构建脚本将源代码导⼊您的 Android Studio 项⽬并将原⽣库(SO ⽂件)封装到 APK 中。
配置完项⽬后,您可以使⽤从 Java 代码中访问您的原⽣函数。
要构建和运⾏应⽤,只需点击 Run 。
Gradle 会以依赖项的形式添加您的外部原⽣构建流程,⽤于编译、构建原⽣库并将其随 APK ⼀起封装。
创建新的原⽣源⽂件要在应⽤模块的主源代码集中创建⼀个包含新建原⽣源⽂件的cpp/⽬录,请按以下步骤操作:1. 从 IDE 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图。
2. 导航到您的模块 > src,右键点击 main ⽬录,然后选择 New > Directory。
android编译流程

android编译流程Android编译流程是将源代码转化为可执行的Android应用程序的过程。
编译流程包括以下几个主要步骤:1.获取源代码:首先,开发人员需要从Android Open Source Project (AOSP) 或者其他可靠的源代码库中获取Android源代码。
获取源代码可以通过使用版本控制工具如Git来完成。
2.准备构建环境:在编译之前,需要准备好构建环境。
这包括安装正确的开发工具、依赖库和配置。
- 开发工具:Android编译使用Java编程语言,因此需要安装Java Development Kit (JDK)。
同时还需要安装Android软件开发工具包(SDK),用于构建和测试Android应用。
- 依赖库:编译Android需要一些依赖库,包括C/C++编译器、make 工具、libc、libm和其他系统库。
这些库可以通过安装合适的软件包管理工具来获取。
-配置:开发人员需要根据构建计划配置构建环境。
这包括选择编译器版本、构建目标平台以及其他构建选项。
3.设置环境变量:为了让系统能够找到正确的构建工具和依赖库,开发人员需要设置一些环境变量。
这可以通过在命令行终端中设置系统环境变量或者使用脚本文件进行配置来实现。
4.执行初始化构建:在进行实际的编译之前,需要执行一些初始化构建操作。
这包括解压源代码文件、创建构建描述文件、设置编译选项等。
5.编译源代码:编译源代码是整个编译流程的核心步骤。
在此步骤中,构建系统将递归地遍历整个源代码树,并将每个源文件编译成目标文件。
编译过程通常分为以下几个阶段:-预处理:在编译之前,构建系统会首先对源代码进行预处理。
预处理器将处理预处理指令、宏定义等,并将源代码转化为可供编译器识别的形式。
-编译:编译器将源代码编译成汇编语言或者中间代码。
-汇编:汇编器将汇编语言代码转化为机器可执行的二进制指令。
android单独编译某个模块

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 modules in the current directory.- mmm: Builds all of the modules 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命令,也就是可以⽤它来编译指定⽬录的所有模块,通常这个⽬录只包含⼀个模块。
在你的android手机上写C和CPP程序

在你的android手机上写C/C++程序
2011-12-21 10:14
只要你是安卓的机子,无需root,那么你就可以在自己的手机上编写C/C++程序,并且可以本地编译运插件c4droid-gcc4droid,前一个1.4M后面插件18M。
C4droid是收费的,不过这才十块钱,晚上有破解的,注意安装步骤,否则你就等着系统的“应用程序未安装”的错误提示吧。
第一步,下载两个安装文件,网上搜索去。
第二步,先安装插件,然后点击图标运行软件。
你可以选择安装在本机内存或者存储卡中,安装在哪都无所谓,
第三步,将刚安装的插件卸载掉,没错就是卸载,不过请放心,相关文件仍然在手机里。
如果你不卸载,那你在误。
第四步,安装C4droid,没啥好说的。
然后就可以开始写代码了,打开C4droid。
上图:
看到了吧,编辑器支持代码高亮和格式化代码,选择菜单“format source”可以格式化代码,使代码自动对如果你编译未通过,可以用此菜单查看错误提示,提示到行哦!五个按钮菜单就不用说了吧,一看便知,但有点不会起到效果。
还有个图就是在本机上的输出,注意可以交互的。
这功能可不是一般需联网在线编译可以实现的
是C++编译。
用C++编译前要做个设置,否则你只能写ansi c代码。
点菜单“Preferences”如图,
点“select compiler”就可以选择编译器了。
其他菜单大家自己摸索,有代码高亮设置等。
好了,一个完美的手机C/C++开发环境就搭建成功了。
让你的代码飞起来吧!!!。
Android编译命令

Android编译命令⼀、引⾔先看下⾯⼏条指令,相信编译过Android源码的⼈都再熟悉不过的。
source setenv.shlunchmake -j12记得最初刚接触Android时,同事告诉我⽤上⾯的指令就可以编译Android源码,指令虽短但过⼏天就记不全或者忘记顺序,每次编译时还需要看看⾃⼰的云笔记,冰冷的指令总是难以让我记忆。
后来我决定认真研究下这个指令的含义。
知其然还需知其所以然,这样能更深层次的理解并记忆,才能与⾃⾝的知识体系建⽴强连接,或许还有意外收获,果然如此,接下来跟⼤家分享⼀下在研究上述⼏条指令含义的过程中,深⼊了解到的Android Build(编译)系统。
⼆、编译命令准备好编译环境后,编译Android源码的第⼀步是source build/envsetup.sh,其中source命令就是⽤于运⾏shell脚本命令,功能等价于”.”,因此该命令也等价于. build/envsetup.sh。
在⽂件envsetup.sh声明了当前会话终端可⽤的命令,这⾥需要注意的是当前会话终端,也就意味着每次新打开⼀个终端都必须再⼀次执⾏这些指令。
起初并不理解为什么新开的终端不能直接执⾏make指令,到这⾥总算明⽩了。
接下来,解释⼀下本⽂开头的引⽤的命令:source setenv.sh //初始化编译环境,包括后⾯的lunch和make指令lunch //指定此次编译的⽬标设备以及编译类型make -j12 //开始编译,默认为编译整个系统,其中-j12代表的是编译的job数量为12。
所有的编译命令都在envsetup.sh⽂件能找到相对应的function,⽐如上述的命令lunch,make,在⽂件⼀定能找到function lunch(){...}function make(){...}source envsetup.sh,需要cd到setenv.sh⽂件所在路径执⾏,路径可能在build/envsetup.sh,或者integrate/envsetup.sh,再或者不排除有些⼚商会封装⾃⼰的.sh脚本,但核⼼思路是⼀致的。
android 源码编译常见错误

6、错误:
Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l
/bin/bash: flex: command not found
make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127
解决:Байду номын сангаас
sudo apt-get install lib32ncurses5-dev
8、错误:
prebuilt/linux-x86/sdl/include/SDL/SDL_syswm.h:55: fatal error: X11/Xlib.h: No such file or directory
compilation terminated.
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/android/main-common.o] Error 1
解决:
sudo apt-get install libx11-dev
9、错误:
sh: gperf: not found
B.mini6410用户手册。
calling gperf failed: 32512 at ./makeprop.pl line 96.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] Error 25
Android编译系统(Android.mk文件详解)

Android编译系统(Android.mk⽂件详解)【Android-NDK(Native Development Kit) docs⽂档】NDK提供了⼀系列的⼯具,帮助开发者快速开发C(或C++)的动态库,并能⾃动将so和java应⽤⼀起打包成apk。
Android.mk⽂件是GNU Makefile的⼀⼩部分,它⽤来对Android程序进⾏编译。
因为所有的编译⽂件都在同⼀个 GNU MAKE 执⾏环境中进⾏执⾏,⽽Android.mk中所有的变量都是全局的。
因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
⼀个Android.mk⽂件可以编译多个模块,每个模块属下列类型之⼀:1)APK程序⼀般的Android程序,编译打包⽣成apk⽂件2)JAVA库java类库,编译打包⽣成jar⽂件3)C\C++应⽤程序可执⾏的C\C++应⽤程序4)C\C++静态库编译⽣成C\C++静态库,并打包成.a⽂件5)C\C++共享库编译⽣成共享库(动态链接库),并打包成.so⽂,有且只有共享库才能被安装/复制到您的应⽤软件(APK)包中。
可以在每⼀个Android.mk file 中定义⼀个或多个模块,你也可以在⼏个模块中使⽤同⼀个源代码⽂件。
编译系统为你处理许多细节问题。
例如,你不需要在你的 Android.mk 中列出头⽂件和依赖⽂件。
编译系统将会为你⾃动处理这些问题。
这也意味着,在升级 NDK 后,你应该得到新的toolchain/platform⽀持,⽽且不需要改变你的 Android.mk ⽂件。
注意,NDK的Anroid.mk语法同公开发布的Android平台开源代码的Anroid.mk语法很接近,然⽽编译系统实现他们的⽅式却是不同的,这是故意这样设计的,可以让程序开发⼈员重⽤外部库的源代码更容易。
在描述语法细节之前,咱们来看⼀个简单的"hello world"的例⼦,⽐如,下⾯的⽂件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是⼀个 JNI 共享库,实现返回"hello world"字符串的原⽣⽅法。
【转】Android编译系统详解(三)——编译流程详解

【转】Android编译系统详解(三)——编译流程详解原⽂⽹址:本⽂原创作者: 欢迎转载,请注明出处和1.概述编译Android的第三步是使⽤mka命令进⾏编译,当然我们也可以使⽤make –j4,但是推荐使⽤mka命令。
因为mka将⾃动计算-j选项的数字,让我们不⽤纠结这个数字到底是多少(这个数字其实就是所有cpu的核⼼数)。
在编译时我们可以带上我们需要编译的⽬标,假设你想⽣成recovery,那么使⽤mka recoveryimage,如果想⽣成ota包,那么需要使⽤mka otapackage,后续会介绍所有可以使⽤的⽬标。
另外注意有⼀些⽬标只是起到修饰的作⽤,也就是说需要和其它⽬标⼀起使⽤,共有4个⽤于修饰的伪⽬标:1) showcommands 显⽰编译过程中使⽤的命令2) incrementaljavac⽤于增量编译java代码3) checkbuild⽤于检验那些需要检验的模块4) all如果使⽤all修饰编译⽬标,会编译所有模块研究Android编译系统时最头疼的可能是变量,成百个变量我们⽆法记住其含义,也不知道这些变量会是什么值,为此我专门做了⼀个编译变量的参考⽹站,你可以在该⽹站查找变量,它能告诉你变量的含义,也会给出你该变量的⽰例值,另外也详细解释了编译系统⾥每个Makefile的作⽤,这样你在看编译系统的代码时不⾄于⼀头雾⽔。
编译的核⼼⽂件是和,main.mk主要作⽤是检查编译环境是否符合要求,确定产品配置,决定产品需要使⽤的模块,并定义了许多⽬标供开发者使⽤,⽐如droid,sdk等⽬标,但是⽣成这些⽬标的规则主要在Makefile⾥定义,⽽内核的编译规则放在build/core/task/kernel.mk我们将先整体介绍main.mk的执⾏流程,然后再针对在Linux上编译默认⽬标时使⽤的关键代码进⾏分析。
Makefile主要定义了各个⽬标的⽣成规则,因此不再详细介绍它的执⾏流程,若有兴趣看每个⽬标的⽣成规则,可查看2. main.mk执⾏流程2.1 检验编译环境并建⽴产品配置1) 设置Shell变量为bash,不能使⽤其它shell2) 关闭make的suffix规则,rcs/sccs规则,并设置⼀个规则: 当某个规则失败了,就删除所有⽬标3) 检验make的版本,cygwin可使⽤任意版本make,但是linux或者mac只能使⽤3.81版本或者3.82版本4) 设置PWD,TOP,TOPDIR,BUILD_SYSTEM等变量,定义了默认⽬标变量,但是暂时并未定义默认⽬标的⽣成规则5) 包含,该makefile定义了两个⽬标help和out, help⽤于显⽰帮助,out⽤于检验编译系统是否正确6) 包含,config.mk作了很多配置,包括产品配置,包含该makefile后,会建⽴输出⽬录系列的变量,还会建⽴PRODUCT系列变量,后续介绍产品配置时,对此会有更多详细介绍7) 包含,该makefile会包含所有⼯程的CleanSpec.mk,写了CleanSpec.mk的⼯程会定义每次编译前的特殊清理步骤,cleanbuild.mk会执⾏这些清除步骤8) 检验编译环境,先检测上次编译结果,如果上次检验的版本和此次检验的版本⼀致,则不再检测,然后进⾏检测并将此次编译结果写⼊2.2 包含其它makefile及编译⽬标检测1) 如果⽬标⾥含有incrementaljavac,那么编译⽬标时将⽤incremental javac进⾏增量编译2) 设置EMMA_INSTRUMENT变量的值,emma是⽤于测试代码覆盖率的库3) 包含,该makefile定义了许多辅助函数4) 包含,该makefile定义了⾼通板⼦的⼀些辅助函数及宏5) 包含,该makefile定义了优化dex代码的⼀些宏6) 检测编译⽬标⾥是否有user,userdebug,eng,如果有则告诉⽤户放置在buildspec.mk或者使⽤lunch设置,检测TARGET_BUILD_VARIANT变量,看是否有效7) 包含, PDK主要是能提⾼现有设备升级能⼒,帮助设备制造商能更快的适配新版本的android2.3 根据TARGET_BUILD_VARIANT建⽴配置1) 如果编译⽬标⾥有sdk,win_sdk或者sdk_addon,那么设置is_sdk_build为true2) 如果定义了HAVE_SELINUX,那么编译时为build prop添加属性ro.build.selinux=13) 如果TARGET_BUILD_VARIANT是user或者userdebug,那么tags_to_install += debug 如果⽤户未定义DISABLE_DEXPREOPT为true,并且是user模式,那么将设置WITH_DEXPREOPT := true,该选项将开启apk的预优化,即将apk分成odex代码⽂件和apk资源⽂件4) 判断enable_target_debugging变量,默认是true,当build_variant是user时,则它是false。
android 源码编译原理(一)

android 源码编译原理(一)Android源码编译本文将以浅入深的方式解释Android源码编译的相关原理。
为什么需要编译Android源码?在Android应用开发中,我们通常使用Android SDK提供的API来开发应用程序。
然而,有时候我们需要对Android系统进行修改或扩展,这就需要我们直接修改Android源代码。
为了让这些修改生效,我们需要将修改后的源码编译成可执行的Android系统镜像,然后将该镜像刷入设备。
编译环境的准备在编译Android源码之前,我们需要准备编译环境。
首先,确保我们的电脑上已经安装了必要的开发工具,如JDK、Python、Git等。
然后,下载Android源码,并进行必要的配置。
要编译Android源码,我们需要使用Linux环境。
如果我们使用的是Windows操作系统,可以通过安装虚拟机或使用Docker等方式创建一个Linux环境。
编译Android源码的基本步骤编译Android源码的基本步骤如下:1.初始化编译环境:在Android源码根目录下执行source build/envsetup.sh命令,初始化编译环境。
2.选择编译目标:执行lunch命令,选择我们要编译的目标设备和版本号。
3.开始编译:执行make命令,开始编译Android源码。
编译过程通常需要较长的时间,这取决于电脑性能和代码的规模。
4.生成镜像:编译完成后,我们可以在out/target/product目录下找到生成的Android系统镜像文件。
深入了解Android源码编译编译Android源码并不仅仅是简单执行几个命令那么简单,背后涉及到了诸多复杂的过程和原理。
下面简单介绍一些主要的原理:1. Android.mk文件在进行Android源码编译时,系统会通过读取每个模块下的Android.mk文件来确定编译的方式和依赖关系。
Android.mk文件是GNU make的一个Makefile脚本,用于描述模块的编译规则、依赖关系和生成产物等信息。
【转】Android源代码编译命令mmmmmmmake分析--不错

【转】Android源代码编译命令mmmmmmmake分析--不错在前⽂中,我们分析了Android编译环境的初始化过程。
Android编译环境初始化完成后,我们就可以⽤m/mm/mmm/make命令编译源代码了。
当然,这要求每⼀个模块都有⼀个Android.mk⽂件。
Android.mk实际上是⼀个Makefile脚本,⽤来描述模块编译信息。
Android编译系统通过整合Android.mk⽂件完成编译过程。
本⽂就对Android源代码的编译过程进⾏详细分析。
从前⾯这篇⽂章可以知道,lunch命令其实是定义在build/envsetup.sh⽂件中的函数lunch提供的。
与lunch命令⼀样,m、mm和mmm命令也分别是由定义在build/envsetup.sh⽂件中的函数m、mm和mmm提供的,⽽这三个函数⼜都是通过make命令来对源代码进⾏编译的。
事实上,命令m就是对make命令的简单封装,并且是⽤来对整个Android源代码进⾏编译,⽽命令mm和mmm都是通过make命令来对Android源码中的指定模块进⾏编译。
接下来我们就先分别介绍⼀下函数m、mm和mmm的实现,然后进⼀步分析它们是如何通过make命令来编译代码的。
函数m的实现如下所⽰:[plain]1. function m()2. {3. T=$(gettop)4. if [ "$T" ]; then5. make -C $T $@6. else7. echo "Couldn't locate the top of the tree. Try setting TOP."8. fi9. }函数m调⽤函数gettop得到的是Android源代码根⽬录T。
在执⾏make命令的时候,先通过-C选项指定⼯作⽬录为T,即Android源代码根⽬录,接着⼜将执⾏命令m指定的参数$@作为命令make的参数。
android源码编译流程

android源码编译流程Android系统源代码是开源的,任何有兴趣的人都可以下载、阅读和修改它。
但是,为了保证该系统在各种硬件上的流畅运行,需要对Android源码进行编译。
以下是Android源码编译的流程:1. 安装编译环境编译Android源码需要安装一些必要的工具。
首先需要安装JDK(Java Development Kit),其次需要安装Android SDK(Software Development Kit)和NDK(Native Development Kit)。
此外,还需要安装Git和Repo工具,用于获取和同步源代码。
2. 下载源代码在安装好编译环境之后,需要从官方网站下载Android源代码。
这个过程可能需要一段时间,并且需要高速稳定的网络连接。
下载完成后,将源代码存储在本地磁盘上。
3. 初始化和同步源代码使用Repo工具初始化本地文件夹和Git工作区。
初始化完成之后,需要对代码库进行同步操作以确保源代码是最新的。
同步的过程可能需要几个小时,取决于网络速度和源代码树的大小。
4. 设置编译环境针对不同的设备和平台,需要配置不同的编译环境。
在此步骤中,需要设置所需的环境变量和其他相关的参数,例如,配置JDK路径、选择目标平台和设备、设置NDK路径等等。
5. 生成MakefileAndroid源代码使用GNU Make来构建,因此需要生成一个Makefile列表。
这个过程使用根目录下的build/envsetup.sh文件来完成。
一旦生成了Makefile,就可以开始编译Android源代码了。
6. 执行编译执行编译操作是最耗时的部分,需要等待一段时间才能完成。
编译和构建过程是一个逐步递进的过程。
首先需要编译基础库,然后编译各个组件和应用程序。
这个过程需要在控制台中执行一系列的命令,并且需要注意一些错误和警告消息。
7. 生成系统映像一旦编译完成,在源代码树下的out目录中就会生成一个system.img文件,这是Android系统的镜像文件。
Android系统开发编译及系统移植

Android系统开发编译环境配置主机系统:Ubuntu9.04(1)安装如下软件包sudo apt-get install git-coresudo apt-get install gnupgsudo apt-get install sun-java5-jdksudo apt-get install flexsudo apt-get install bisonsudo apt-get install gperfsudo apt-get install libsdl-devsudo apt-get install libesd0-devsudo apt-get install build-essentialsudo apt-get install zipsudo apt-get install curlsudo apt-get install libncurses5-devsudo apt-get install zlib1g-devandroid编译对java的需求只支持jdk5.0低版本,jdk5.0 update 12版本和java 6不支持。
(2)下载repo工具curl /repo >/bin/repochmod a+x /bin/repo(3)创建源代码下载目录:mkdir /work/android-froyo-r2(4)用repo工具初始化一个版本(以android2.2r2为例)cd /work/android-froyo-r2repo init -u git:///platform/manifest.git -b froyo初始化过程中会显示相关的版本的TAG信息,同时会提示你输入用户名和邮箱地址,以上面的方式初始化的是android2.2 froyo的最新版本,android2.2本身也会有很多个版本,这可以从TAG信息中看出来,当前froyo的所有版本如下:* [new tag] android-2.2.1_r1 -> android-2.2.1_r1* [new tag] android-2.2_r1 -> android-2.2_r1* [new tag] android-2.2_r1.1 -> android-2.2_r1.1* [new tag] android-2.2_r1.2 -> android-2.2_r1.2* [new tag] android-2.2_r1.3 -> android-2.2_r1.3* [new tag] android-cts-2.2_r1 -> android-cts-2.2_r1* [new tag] android-cts-2.2_r2 -> android-cts-2.2_r2* [new tag] android-cts-2.2_r3 -> android-cts-2.2_r3这样每次下载的都是最新的版本,当然我们也可以根据TAG信息下载某一特定的版本如下:repo init -u git:///platform/manifest.git -b android-cts-2.2_r3(5)下载代码repo syncfroyo版本的代码大小超过2G,漫长的下载过程。
【IT专家】如何将C编译成可执行的二进制文件并从Android Shell在Android中运行?

本文由我司收集整编,推荐下载,如有疑问,请与我司联系如何将C编译成可执行的二进制文件并从Android Shell在Android中运行?如何将C编译成可执行的二进制文件并从Android Shell在Android中运行?[英]How to compile C into an executable binary file and run it in Android from Android Shell? I have Device on which i installed Android Gingerbread 2.3.4 Here i want to run C executable file on android device 我有Device安装Android Gingerbread 2.3.4这里我想在Android设备上运行C可执行文件 I am able to run android NDK application on Device and its run perfect But i want to run only one hello.c executable file on Device. 我能够在Device上运行android NDK应用程序并且运行完美但是我想在Device 上只运行一个hello.c可执行文件。
/* #includes #defines ... */int main(){ // Do something when this is executed return 0; Is there any way to compile this file with Android NDK tool chain and we can run this file’s executable 有没有办法用Android NDK工具链编译这个文件,我们可以运行这个文件的可执行文件 I found one thing here but this is not working for me i am using Android NDK, Revision 7b of linux There is no directory structure like this 我在这里发现了一件事,但这对我不起作用我使用的是Android NDK,Linux的修订版7b没有像这样的目录结构 37 First, let me say that my answer is dependent on your using NDK r7b (it’ll work for r7c as well) on Linux (change paths appropriately for other systems). 首先,让我说我的答案取决于你在Linux上使用NDK r7b(它也适用于r7c)(适。
C07_如何在手机上编译C语言程序

如何在手机上安装C编译器
1. 在手机的应用商城搜索“C编译器”,在WP系统 中可以看到“Code Compiler”,在Android系统 中可看到“C++编译器”,在 IOS系统中可看到 “C/C++编译器”; 4. 运行即可,下面以图形演示。
在手机的应用商城搜索c编译器在wp系统中可以看到codecompiler在android系统中可看到c编译器在ios系统中可看到cc编译器
指尖上的C编译系统的使用方法
对于那些想掌握C编程技术的初学者来说,多上 机不失为一种好的学习方法,但往往没有那么多时 间去实验室,也不可能整天背着个笔记本电脑,但 手机总是随身带着的,如果能在手机上安装C编译 器,便可随时随地的解决我们心中的疑问,或记录 我们脑中闪现的灵感!
进入手机的应用商城
点 击
点
点
击Hale Waihona Puke 击WP系统Android系统
IOS系统
搜索相应的软件并下载安装
搜
搜
索
索
搜 索
WP系统
Android系统
IOS系统
运行该软件
点
点
击
击
点 击
WP系统
Android系统
IOS系统
对源文件进行编辑-调试-并运行
运
行
编
编
辑
编
辑
辑
WP系统
运
运
行
行
Android系统
IOS系统
若程序无误便可看到运行结果
结
结
果
果
结 果
WP系统
Android系统
IOS系统
分布式编译Android

分布式编译Android – distcc分布式编译: 是一种通过在局域网内的多个节点上运行编译进程来提高构建速度的途径(转自:分布式编译环境中的负载均衡). 可以合理多台主机的空闲资源, 缩短编译时间.本文章主要介绍disctcc的配置和使用.1.distcc简介和工作原理distcc的介绍可以参考<<分布式编译环境中的负载均衡>>, distcc只支持c/c++. 这里只介绍其工作原理.先介绍distcc的两个程序.1.distcc: 替换原来的编译器(gcc/g++), 所以要编译android编译, 把原来的编译器替换2.distccd: distcc的服务. 运行在编译场内各个主机上的distcc 代理程序工作过程:我们会建立一堆g++, gcc, ar等链接到/usr/bin/distcc, 源码的编译就是要指定为那一堆链接. 所以编译时调用的是distcc, distcc会根据链接名在各个主机上找到对应的编译器进行编译工作.源码的共享是通过NFS实现的.2.安装配置distcc参考<<Android分布式编译学习(一)distcc实现分布式编译—— Ubuntu12.04上部署distcc分布式编译>>.配置步骤比较多, 所以已经把需要的工具打包和需要配置的项做成脚本, 只要运行脚本就可以配置好环境工具存入地址: \\newnas\Dep.Mid5.软件3.工具\分布式编译distcc把distcc_android.tar.gz和install_distcc.sh放到一个目录, 进入该目录, 并运行./install_distcc.sh就可以把环境搭好. Android源码需要修改的地方会上传到服务器.只要有环境变量USE_DISTCC=true就会启动分布式来编译, USE_DISTCC=true也是在脚本里配置了, 写到~/.bashrc里所以如果不想分布式编译只要把~/.bashrc里的USE_DISTCC=true修改成flase或者删除就可以.具体的配置如下:1.安装distccUbuntu系统可以直接用sudo apt-get install distcc安装.2.配置distccsudo vim /etc/default/distcc修改STARTDISTCC的值为true。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android.mk文件语法规范及使用模板Android.mk文件语法规范根据eoeandroid上的的连载,进行一些更新、修改和加亮。
今天翻译ANDROID-MK.TXT文件(英文原文件在/development/Ndk/Docs/android-mk.txt)Android.mk文件语法规范Introduction:Android.mk编译文件是用来向Android NDK描述你的C,C++源代码文件的,这篇文档描述了它的语法。
在阅读下面的内容之前,假定你已经阅读了docs/OVERVIEW.TXT文件,了解了它们的脚色和用途。
概述:一个Android.mk file用来向编译系统描述你的源代码。
具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。
因此,您应尽量减少您声明的变量,不要认为某些变量在解析过程中不会被定义。
-这个文件的语法允许把你的源代码组织成模块,一个模块属下列类型之一:静态库共享库只有共享库将被安装/复制到您的应用软件包。
虽然静态库能被用于生成共享库。
你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。
/******************************************************************** *********/-编译系统为你处理许多细节问题。
例如,你不需要在你的Android.mk中列出头文件和依赖文件。
NDK编译系统将会为你自动处理这些问题。
这也意味着,在升级NDK后,你应该得到新的toolchain/platform支持,而且不需要改变你的Android.mk文件。
注意,这个语法同公开发布的Android平台的开源代码很接近,然而编译系统实现他们的方式却是不同的,这是故意这样设计的,可以让程序开发人员重用外部库的源代码更容易。
简单的例子:---------------在描述语法细节之前,咱们来看一个简单的"hello world"的例子,比如,下面的文件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是一个JNI共享库,实现返回"hello world"字符串的原生方法。
相应的Android.mk文件会象下面这样:---------- cut here ------------------LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= helloworldLOCAL_SRC_FILES := helloworld.cinclude $(BUILD_SHARED_LIBRARY)---------- cut here ------------------好,我们来解释一下这几行代码:LOCAL_PATH := $(call my-dir)一个Android.mk file首先必须定义好LOCAL_PATH变量。
它用于在开发树中查找源文件。
在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
include $( CLEAR_VARS)CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。
这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
LOCAL_MODULE := helloworldLOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。
名称必须是唯一的,而且不包含任何空格。
注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。
重要注意事项如果你把库命名为‘libhelloworld’,编译系统将不会添加任何的lib前缀,也会生成libhelloworld.so,这是为了支持来源于Android平台的源代码的Android.mk 文件,如果你确实需要这么做的话。
LOCAL_SRC_FILES := helloworld.cLOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。
注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
【注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是定义为‘.cxx’,而不是‘cxx’)(当然这一步我们一般不会去改它)】include $(BUILD_SHARED_LIBRARY)BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GNU Makefile 脚本(应该就是在build/core目录下的shared_library.mk),负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。
并根据其规则生成静态库。
同理对于静态库。
/******************************************************************** ********/在sources/samples目录下有更复杂一点的例子,写有注释的Android.mk文件,你可以看看。
参考:这是一份你应该在Android.mk中依赖或定义的变量列表,您可以定义其他变量为自己使用,但是NDK编译系统保留下列变量名:-以LOCAL_开头的名字(例如LOCAL_MODULE)-以PRIVATE_, NDK_ or APP_开头的名字(内部使用)-小写名字(内部使用,例如’my-dir’)如果您为了方便在Android.mk中定义自己的变量,我们建议使用MY_前缀,一个小例子:---------- cut here ------------------MY_SOURCES := foo.cifneq ($(MY_CONFIG_BAR),)MY_SOURCES += bar.cendifLOCAL_SRC_FILES += $(MY_SOURCES)---------- cut here ------------------- - - - - - - - - - -这些GNU Make 变量在你的Android.mk文件解析之前,就由编译系统定义好了。
注意在某些情况下,NDK可能分析Android.mk几次,每一次某些变量的定义会有不同。
CLEAR_VARS指向一个编译脚本,几乎所有未定义的LOCAL_XXX变量都在"Module-description"节中列出。
你必须在开始一个新模块之前包含这个脚本。
include $(CLEAR_VARS)BUILD_SHARED_LIBRARY指向编译脚本,收集所有的你在LOCAL_XXX变量中提供的信息,并且决定如何把你列出的源代码文件编译成一个共享库。
注意,你必须至少在包含这个文件之前定义LOCAL_MODULE和LOCAL_SRC_FILES,使用例子:include $(BUILD_SHARED_LIBRARY)注意这将生成一个名为lib$(LOCAL_MODULE).so的文件。
BUILD_STATIC_LIBRARY一个BUILD_SHARED_LIBRARY变量用于编译一个静态库。
静态库不会复制到你的project/packages中,诞生能够用于编译共享库,(看下面描述的LOCAL_STATIC_LIBRARIES and LOCAL_STATIC_WHOLE_LIBRARIES)使用例子:include $(BUILD_STATIC_LIBRARY)注意,这将会生成一个名为lib$(LOCAL_MODULE).a的文件。
TARGET_ARCH目标CPU平台的名字,如同在android开放源码中指定的那样。
如果是’arm’,表示要生成ARM兼容的指令,与CPU架构的修订版无关。
TARGET_PLATFORMAndroid.mk解析的时候,目标Android平台的名字.详情可参考/development/ndk/docs/stable-apis.txt.android-3 -> Official Android 1.5 system imagesandroid-4 -> Official Android 1.6 system imagesandroid-5 -> Official Android 2.0 system imagesTARGET_ARCH_ABI暂时只支持两个value,armeabi和armeabi-v7a。
在现在的版本中一般把这两个值简单的定义为arm,通过android 平台内部对它重定义来获得更好的匹配。
其他的ABI将在以后的NDK版本中介绍,它们会有不同的名字。
注意所有基于ARM的ABI都会把'TARGET_ARCH'定义成‘arm’,但是会有不同的‘TARGET_ARCH_ABI’TARGET_ABI目标平台和ABI的组合,它事实上被定义成$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) 在你想要在真实的设备中针对一个特别的目标系统进行测试时,会有用。
在默认的情况下,它会是'android-3-arm'。
/******************************************************************** *********/下面是GNU Make‘功能’宏,必须通过使用'$(call <function>)'来求值,他们返回文本化的信息。
my-dir返回当前Android.mk所在的目录路径,相对于NDK编译系统的顶层。
这是有用的,在Android.mk文件的开头如此定义:LOCAL_PATH := $(call my-dir)all-subdir-makefiles返回一个位于当前'my-dir'路径的子目录列表。