编译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路径和库的路径呢? //- ...
随机推荐
- HDOJ-6681(离散化+线段树)
Rikka With Cake HDOJ-6681 最终的答案为射线的交点数加一.当然,我们也可以证明.证明需要用到欧拉公式 V−E+F=2 V-E+F=2V−E+F=2 .设射线的交点共 c cc ...
- 鸿蒙的js开发模式19:鸿蒙手机下载python服务器端文件的实现
目录:1.承接上篇鸿蒙客户端上传文件2.域名通过内网穿透工具3.python服务器端代码4.鸿蒙手机的界面和业务逻辑5.<鸿蒙的js开发模式>系列文章合集 1.承接上篇鸿蒙客户端上传文件, ...
- python 操作符** (两个乘号就是乘方)
一个乘号*,如果操作数是两个数字,就是这两个数字相乘,如2*4,结果为8**两个乘号就是乘方.比如3**4,结果就是3的4次方,结果是81 *如果是字符串.列表.元组与一个整数N相乘,返回一个其所有元 ...
- slickgrid ( nsunleo-slickgrid ) 4 解决区域选择和列选择冲突
slickgrid ( nsunleo-slickgrid ) 3 解决区域选择和列选择冲突 之前启用区域选择的时候,又启用了列选择(CheckboxSelectColumn),此时发现选择状态与区域 ...
- WinFrom与百度地图完美交互
如何在WinFrom上显示百度地图,也许这个很多人会说这个很容易,但是如何实现WinFrom与百度地图的完美交互,如果在Winfrom的控制输入经纬度,准确定位出在百度地图上,并且还能显示出具体的地址 ...
- sqli-labs系列——第四关
less4 第四关的sql语句是这样的: select * from user where id=("$id"); ?id=1")–+回显正常 order by 4报错, ...
- python基础之赋值运算
之前的文章说明了变量的三大组成部分,详细说明了变量名与变量值,但是对于赋值这一块介绍相对较少,今天就来对这一部分进行补充,除了egon老湿所讲之外,本喵还参阅了<python3-cookbook ...
- 分享一次排查CLOSE_WAIT过多的经验
关键词:TCP.CLOSE_WAIT 问题背景 某日下午有测试人员急匆匆的跑来跟我反馈:"有客户反馈供应商附件预览不了,流程阻塞,需要紧急处理",我立马精神起来,毕竟都是付费客户( ...
- ACNet:用于图像超分的非对称卷积网络
编辑:Happy 首发:AIWalker Paper:https://arxiv.org/abs/2103.13634 Code:https://github.com/hellloxiaotian/A ...
- [DFS]排列的生成
排列的生成 Time Limit:1000MS Memory Limit:65536K Total Submit:150 Accepted:95 Description 输出P(n,m)的排列(n,m ...