编译libdvm.so: makefile,mm
操作系统:Ubuntu14.4 android版本:4.4 设备:nexus 5
android系统的编译使用make来操作,那make呢是执行对应的makefile即android的编译系统看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
编译libdvm.so: makefile,mm的更多相关文章
- 编译驱动的Makefile解析
一个典型的编译驱动模块的Makefile文件如下所示: KERN_DIR = /root/driver/kernel obj-m += module_test.o all: make -C $(KER ...
- Android编译中m、mm、mmm的区别
准备工作 在AndroidSource Code中有envsetup.sh档案,当执行过此档案后,可以大幅将build的过程简单化.自动化 此档案在src(android source code 位置 ...
- linux与Windows使用编译区别及makefile文件编写
一.Windows与:Linux嵌入式开发区别 Windows下编辑.编译.执行 编辑: sourceInsight:ADS: 编译:指定链接地址,指定链接顺序,编译 执行:烧写到单板再启动 Linu ...
- 一个简单的编译tex的Makefile
tex编译成pdf通常要经过以下步骤:tex-->dvi-->ps-->pdf.如果修改了tex文件想看一下效果,就要把命令重新敲一遍.虽然就几行命令,反复敲还是很烦人的.最直接的办 ...
- 程序编译时书写Makefile注意事项一例
在进行程序编译时,可能需要指定一些库的库的路径.头文件的路径,分别使用的参数选项是-L和-I,需要注意的是: 需要确保-L和-I后边的内容不为空,否则会出现意想不到的错误,而这种错误比较难以发现,引起 ...
- [编译] g++ 与 Makefile
g++ -c CppSoureFile -o ObjectCodeFile -c 编译而不链接 -lm 链接数学库 -static 生成静态链接的程序
- 编译模块的Makefile解析
Makefile # if not defined KERNELRELEASE, command is running from command line,need invoke kbuild sys ...
- 【转】Android源代码编译命令m/mm/mmm/make分析--不错
原文网址:http://blog.csdn.net/luoshengyang/article/details/19023609 在前文中,我们分析了Android编译环境的初始化过程.Android编 ...
- 编译android源码m、mm、mmm命令的使用
http://blog.163.com/zz_forward/blog/static/212898222201442873435471/ gcc怎么查看它的默认include路径和库的路径呢? //- ...
随机推荐
- 在windows 下查看ip 地址和 在ubundu 下查看IP地址
在windows 下查看ip 地址和 在ubundu 下查看IP地址 1.在windows 下查看 IP地址:ipconfig 2.在 ubundu 下查看IP地址:ifconfig
- 2.1 Python3基础-内置函数(print&input)
>>返回主目录 源代码 # 内置函数:输入/输出 name = 'Portos' age = 18 sex = 'man' score = 99.5 print('Hello World! ...
- CVE-2017-10271 XMLDecoder 反序列化
漏洞描述:WebLogic的 WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,可以构造请求对运行 ...
- spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析
知识点梳理 课堂讲义 1)事务回顾 1.1)什么是事务-视频01 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2)事务的作用 事务特征(ACID) 原子 ...
- P2766 最长不下降子序列问题 题解(网络流)
题目链接 最长不下降子序列问题 解题思路 分成三小问解决. 第一小问,求\(LIS\),因为\(n<=500\),直接\(O(N^2)\)暴力求解即可. 第二三小问,建立模型用网络流求解. 对于 ...
- Java 树结构实际应用 三(二叉排序树)
二叉排序树 1 先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加 2 解决方案分析 使用数组 数组未排序, 优点:直接在数组尾添 ...
- 生成元(JAVA语言)
package 第三章; import java.util.Scanner; public class 生成元 { public static void main(String[] args) { / ...
- async await Task 使用方法
使用概述 C#的使用过程中,除了以前的Thread.ThreadPool等用来开一个线程用来处理异步的内容.还可以使用新特性来处理异步.比以前的Thread和AutoResetEvent.delege ...
- 学《跟我一起写Makefile》笔记发博词
目录 笔记发博词 参考 笔记发博词 本系列笔记主要记录学了<跟我一起写Makefile>后的一些笔记 由于<跟我一起写Makefile>已经写得很详细了,所以我只是提取其中重要 ...
- Centos7安装以及设置Redis详细步骤
一.Redis安装: 1.指定文件夹下下载redis安装包: [root@bogon ~]# mkdir /usr/local/soft/redis [root@bogon ~]# cd /usr/l ...