操作系统:Ubuntu14.4  android版本:4.4  设备:nexus 5

  android系统的编译使用make来操作,那make呢是执行对应的makefile即android的编译系统看makefile。那什么是makefile看这里:

  makefile的语法及写法

  看完后应该对makefile有点了解了吧,你可以把它看成是一个脚本用来描述代码的编译关系。ok,不多说直接拿libdvm来练手,看对应的mankefile(/dalvik/vm/android.mk;这里只分析libdvm.so的编译):

LOCAL_PATH:= $(call my-dir)

#
# Build for the target (device).
# ifeq ($(TARGET_CPU_SMP),true)
target_smp_flag := -DANDROID_SMP=1
else
target_smp_flag := -DANDROID_SMP=0
endif
host_smp_flag := -DANDROID_SMP=1 # Build the installed version (libdvm.so) first
WITH_JIT := true
include $(LOCAL_PATH)/ReconfigureDvm.mk # Overwrite default settings
LOCAL_MODULE := libdvm
LOCAL_CFLAGS += $(target_smp_flag) # Define WITH_ADDRESS_SANITIZER to build an ASan-instrumented version of the
# library in /system/lib/asan/libdvm.so.
ifneq ($(strip $(WITH_ADDRESS_SANITIZER)),)
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/asan
LOCAL_ADDRESS_SANITIZER := true
LOCAL_CFLAGS := $(filter-out $(CLANG_CONFIG_UNKNOWN_CFLAGS),$(LOCAL_CFLAGS))
endif # TODO: split out the asflags.
LOCAL_ASFLAGS := $(LOCAL_CFLAGS) include $(BUILD_SHARED_LIBRARY)

  有点迷糊是吧,因为android.mk中大量包含android宏所以有一点难理解啦。那我们再来学习下这篇文章:Android.mk 文件语法详解。我们是要生成libdvm.so对吧,那直接从结果往前推看makefile执行流程:

  include $(BUILD_SHARED_LIBRARY)    这行代码去生成libdvm.so,那我们直接看BUILD_SHARED_LIBRARY    

BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。

它负责收集自从上次调用 include $(CLEAR_VARS)  后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY:编译为静态库。 
BUILD_SHARED_LIBRARY :编译为动态库 
BUILD_EXECUTABLE:编译为Native C可执行程序

  看下BUILD_SHARED_LIBRARY究竟是个嘛玩意。在android源码主目录下有makefile:

### DO NOT EDIT THIS FILE ###
include build/core/main.mk
### DO NOT EDIT THIS FILE ###

  build/core/main.mk:

BUILD_SYSTEM := $(TOPDIR)build/core
# Set up various standard variables based on configuration
# and host information.
include $(BUILD_SYSTEM)/config.mk

  config.mk:

BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk

  原来BUILD_SHARED_LIBRARY就是build/core/share_library.mk文件:

ifeq (,$(call if-build-from-source,$(LOCAL_MODULE),$(LOCAL_PATH)))

  以上就是编译libdvm.so的makefile代码。既然有代码了,那我们执行的命令呢。

m 在源码树的根目录执行 make
mm Build 当前目录下的模块
mmm Build 指定目录下的模块

 下面来实践:

  其实跟编译源码步骤差不多

  1 source build/envsetup.sh

  2 lunch

  3 在源码的dalvik目录下执行mm生成新的libdvm.so或者直接make system.img生成system.img

  若生成的是libdvm.so,则按以下命令替换系统的libdvm.so(adb要有root):

  1 adb root

  2 adb remount

  3 adb push libdvm.so /data/local/tmp/libdvm.so

  4 cat /system/lib/libdvm.so > /data/local/tmp/libdvm.so-bak

  5 cat /data/local/tmp/libdvm.so > /system/lib/libdvm.so

makefile的语法及写法

Android.mk 文件语法详解

Dalvik 虚拟机编译脚本 和 源代码树

编译libdvm.so: makefile,mm的更多相关文章

  1. 编译驱动的Makefile解析

    一个典型的编译驱动模块的Makefile文件如下所示: KERN_DIR = /root/driver/kernel obj-m += module_test.o all: make -C $(KER ...

  2. Android编译中m、mm、mmm的区别

    准备工作 在AndroidSource Code中有envsetup.sh档案,当执行过此档案后,可以大幅将build的过程简单化.自动化 此档案在src(android source code 位置 ...

  3. linux与Windows使用编译区别及makefile文件编写

    一.Windows与:Linux嵌入式开发区别 Windows下编辑.编译.执行 编辑: sourceInsight:ADS: 编译:指定链接地址,指定链接顺序,编译 执行:烧写到单板再启动 Linu ...

  4. 一个简单的编译tex的Makefile

    tex编译成pdf通常要经过以下步骤:tex-->dvi-->ps-->pdf.如果修改了tex文件想看一下效果,就要把命令重新敲一遍.虽然就几行命令,反复敲还是很烦人的.最直接的办 ...

  5. 程序编译时书写Makefile注意事项一例

    在进行程序编译时,可能需要指定一些库的库的路径.头文件的路径,分别使用的参数选项是-L和-I,需要注意的是: 需要确保-L和-I后边的内容不为空,否则会出现意想不到的错误,而这种错误比较难以发现,引起 ...

  6. [编译] g++ 与 Makefile

    g++ -c CppSoureFile -o ObjectCodeFile -c 编译而不链接 -lm 链接数学库 -static 生成静态链接的程序

  7. 编译模块的Makefile解析

    Makefile # if not defined KERNELRELEASE, command is running from command line,need invoke kbuild sys ...

  8. 【转】Android源代码编译命令m/mm/mmm/make分析--不错

    原文网址:http://blog.csdn.net/luoshengyang/article/details/19023609 在前文中,我们分析了Android编译环境的初始化过程.Android编 ...

  9. 编译android源码m、mm、mmm命令的使用

    http://blog.163.com/zz_forward/blog/static/212898222201442873435471/ gcc怎么查看它的默认include路径和库的路径呢? //- ...

随机推荐

  1. LightOJ-1074(SPFA判负圈+Bellman-Ford算法)

    Extended Traffic LightOJ-1074 这题因为涉及到减法和三次方,所以可能会出现负圈. 这里使用的算法叫做SPFA算法,这个可以用来判负圈和求解最短路.Bellman-Ford算 ...

  2. 用vue.js实现的期货,股票的实时K线

    用vue.js实现的期货,股票的实时k线 项目地址:https://github.com/zhengquantao/vue-Kline vue-kline 效果图 Build Setup 本项目基于V ...

  3. Android - Handler原理

    Handler的主要作用是收发消息和切线程 功能一:收发消息 简单流程介绍 希望你看完这篇文章后也可以把流程自己讲出来,并且每个环节还可以讲出很多细节 他的消息机制离不开Looper.MessageQ ...

  4. java内部类 的理解

    * 类的第5个成员:内部类 * 1.相当于说,我们可以在类的内部再定义类.外面的类:外部类.里面定义的类:内部类 * 2.内部类的分类:成员内部类(声明在类内部且方法外的) vs 局部内部类(声明在类 ...

  5. 翻译:《实用的Python编程》06_02_Customizing_iteration

    目录 | 上一节 (6.1 迭代协议) | 下一节 (6.3 生产者/消费者) 6.2 自定义迭代 本节探究如何使用生成器函数自定义迭代. 问题 假设你想要自定义迭代模式. 例如:倒数: >&g ...

  6. ch1_6_1求解两种排序方法问题

    考拉有n个字符串字符串,任意两个字符串长度都是不同的.  考拉最近学习到有两种字符串的排序方法:   1.根据字符串的字典序排序.例如: "car" < "carr ...

  7. 5、MyBatis教程之ResultMap

    6.ResultMap 要解决的问题:属性名和字段名不一致 1.查看之前的数据库的字段名 2.Java中的实体类设计 public class User { private int id; //id ...

  8. java例题_46 两个字符串拼接问题!

    1 /*46 [程序 46 字符串连接] 2 题目:两个字符串连接程序,将两个字符串拼接在一起 3 */ 4 5 /*分析 6 * 两个字符串的拼接方法 7 * concat方式 8 * 当两个量都为 ...

  9. Android Studio详解项目中的资源

    •目录结构 •作用 所有以 drawable 开头的文件都是用来放图片的: 所有以 mipmap 开头的文件都是用来放应用图标的: 所有以 value 开头的文件夹都是用来放字符串.样式.颜色等配置的 ...

  10. 无线网络的应用之aircrack-ng

    在kalilinux的aircracke-ng中.在这儿描述自己所遇到的问题并给予写blog 在使用之前,需要确定是否有对应的支持无线网卡监听的网卡,在虚拟机中需要先将网卡的驱动重定向到虚拟机内 在终 ...