普法Android.mk和Android.bp相关转换

Android源码编译系列博客:

Android.bp你真的了解吗
Android.bp入门指南之Android.mk转换成Android.bp
Android.bp入门指南之浅析Android.bp语法
Android.bp正确姿势添加宏控制编译指南
Android高版本P/Q/R源码编译指南
如何在线查看Android源码自带学习文档docs
普法Android.mk中的一些宏和Android.bp对应关系


引言

  博客断更很久了,是时候动动我勤劳的双手,继续耕耘了!陆陆续续有不少小伙伴在后台咨询关于Android.mk怎么转换成Androdi.bp的问题,虽然也解答了不少,但是也有一些当时我没有能够给出及时的答复(不是我不想答复,而是确实有些我当时也没有一个具体的答案)。其中小伙们询问的最最多多的就是Android.mk中的一些预先定义的宏怎么在Android.bp中找到相对应的。这不我就抽空,来给大伙福利一波,来捯饬捯饬这个问题。

在开始本博客前,有两个非常重要的知识点我必须提前给出来,就是:
1.Android.mk可以引用Android.bp中的相关模块,但是不能反过来!这点非常重要。
2.Android.bp不直接支持条件宏控制语法编译,如果一定要条件宏控制可以借助go,参见博客Android.bp正确姿势添加宏控制编译指南


一.引出问题

  我们知道google为Android.mk到Android.bp的转换提供了一个工具androidmk(如果读者对该工具不是很熟悉,可以参见博客Android.bp入门指南之Android.mk转换成Android.bp)但是该工具非常鸡肋,转换效率不是非常好,对一些Android.mk中的宏基本不能正常转换,我这里简单举出一个例子,测试Android.mk如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \a.c
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)LOCAL_CFLAGS += -DXXXLOCAL_SRC_FILES += \b.c
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)LOCAL_CFLAGS += -DXXXLOCAL_SRC_FILES += \c.c
endifLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_MODULE := libyuv_static
LOCAL_MODULE_TAGS := optional
include $(BUILD_STATIC_LIBRARY)

有一定Android.mk语法的小伙们一定对上述的,一看就一目了然了,可是当我们需要使用androidmk转换成Android.bp的时候,却会有如下的尴尬一幕:

cc_library_static {name: "libyuv_static",srcs: ["a.c"] + ["b.c"] + ["c.c"], // ANDROIDMK TRANSLATION ERROR: unsupported conditional// ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)// ANDROIDMK TRANSLATION ERROR: else from unsupported conditional// else// ANDROIDMK TRANSLATION ERROR: unsupported conditional// ifeq ($(TARGET_ARCH_ABI),arm64-v8a)cflags: ["-DXXX"] + ["-DXXX"],// ANDROIDMK TRANSLATION ERROR: endif from unsupported conditional// endif// ANDROIDMK TRANSLATION ERROR: unsupported assignment to LOCAL_EXPORT_C_INCLUDES// LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includelocal_include_dirs: ["include"],

可以看到,我们的androidmk转换工具,无能为力了。那么要怎么解决上述出现的问题呢,这就需要我们了解Android.mk的一些宏和Android.bp的对应关系了。这也是我本篇博客的重点要说的了。

如果读者又对Android.mk中各种宏不是很熟悉的,可以参见博客Android.mk详解。有比较详细的分析!


二.解决问题

  对于上述Android.mk中的宏,我们要怎么正确的在Android.bp中找到替代关系呢。我这里个人提供两个解决思路:

2.1 参阅Android Aosp中的Androdi.bp

  这个方法虽然比较笨,但是也是最行之有效的,多看几个Android Aosp源码中的Android.bp,看多了自然就会了。

2.2 参阅Android Aosp的文档

  也许读者朋友会说,上面的方法说了等于白说,看来我不亮出点真本事,是不行了啊。好吗,上真家伙,我们可以到Android aosp的build/soong/androidmk/androidmk目录下面,查看android.go文件,里面有详细的Android.mk相关宏和Android.bp的对应关系,如下:

 //android.go"LOCAL_32_BIT_ONLY":           local32BitOnly,"LOCAL_AIDL_INCLUDES":         localAidlIncludes,"LOCAL_ASSET_DIR":             localizePathList("asset_dirs"),"LOCAL_C_INCLUDES":            localIncludeDirs,"LOCAL_EXPORT_C_INCLUDE_DIRS": exportIncludeDirs,"LOCAL_JARJAR_RULES":          localizePath("jarjar_rules"),"LOCAL_LDFLAGS":               ldflags,"LOCAL_MODULE_CLASS":          prebuiltClass,"LOCAL_MODULE_STEM":           stem,"LOCAL_MODULE_HOST_OS":        hostOs,"LOCAL_RESOURCE_DIR":          localizePathList("resource_dirs"),"LOCAL_SANITIZE":              sanitize(""),"LOCAL_SANITIZE_DIAG":         sanitize("diag."),"LOCAL_STRIP_MODULE":          strip(),"LOCAL_CFLAGS":                cflags,"LOCAL_UNINSTALLABLE_MODULE":  invert("installable"),"LOCAL_PROGUARD_ENABLED":      proguardEnabled,"LOCAL_MODULE_PATH":           prebuiltModulePath,

上述我只截取了一部分,更多的请使用时候具体参阅文档。

同时在同一个目录下面的androidmk_test.go,为我们提供了许多Android.mk转换为Android.bp的实例,这个非常值得我们借鉴。如下:

# Module Comment
include $(CLEAR_VARS)
# Name Comment
LOCAL_MODULE := test
# Source comment
LOCAL_SRC_FILES_EXCLUDE := a.c
# Second source comment
LOCAL_SRC_FILES_EXCLUDE += b.c
include $(BUILD_SHARED_LIBRARY)`,expected: `
//
// Copyright
//// Module Comment
cc_library_shared {// Name Commentname: "test",// Source commentexclude_srcs: ["a.c"] + ["b.c"], // Second source comment}`,},{desc: "split local/global include_dirs (1)",in: `
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)`,expected: `
cc_library_shared {local_include_dirs: ["."],
}`,},{desc: "split local/global include_dirs (2)",in: `
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(BUILD_SHARED_LIBRARY)`,expected: `
cc_library_shared {local_include_dirs: ["include"],
}`,},{desc: "split local/global include_dirs (3)",in: `
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := system/core/include
include $(BUILD_SHARED_LIBRARY)`,expected: `
cc_library_shared {include_dirs: ["system/core/include"],
}`,},{desc: "split local/global include_dirs (4)",in: `
input := testing/include
include $(CLEAR_VARS)
# Comment 1
LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/include system/core/include $(input)
# Comment 2
LOCAL_C_INCLUDES += $(TOP)/system/core/include $(LOCAL_PATH)/test/include
# Comment 3
include $(BUILD_SHARED_LIBRARY)`,expected: `
input = ["testing/include"]
cc_library_shared {// Comment 1include_dirs: ["system/core/include"] + input + ["system/core/include"], // Comment 2local_include_dirs: ["."] + ["include"] + ["test/include"],// Comment 3
}`,},{desc: "Convert to local path",in: `
include $(CLEAR_VARS)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res $(LOCAL_PATH)/res2
LOCAL_ASSET_DIR := $(LOCAL_PATH)/asset
LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
include $(BUILD_PACKAGE)

写在最后

  好了,打卡收工!今天的博客普法Android.mk中的一些宏和Android.bp对应关系就到这里了。总之,青山不改绿水长流先到这里了。如果本博客对你有所帮助,麻烦关注或者点个赞,如果觉得很烂也可以踩一脚!谢谢各位了!!这里最后留下一个小彩蛋,对于上述的Android.mk读者朋友看看能否正确的转换为Android.bp,当然也希望读者能我一起探讨是最好的了。

普法Android.mk中的一些宏和Android.bp对应关系相关推荐

  1. Android.mk中添加宏定义

    在Boardconfig.mk 中添加一个 IMAGE_FOR_FACTORY_TEST:= true 由于Boardconfig.mk和各目录的Android.mk是相互关联的 所以我们可以在And ...

  2. android.mk local_cppflags,android.mk中LOCAL_CFLAGS 介绍

    模块描述变量: 下面的变量用于向编译系统描述你的模块.你应该定义在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之间定义.正如前面描写的那样,$(CL ...

  3. android.mk多个module,Android.mk中的变量的使用介绍(二)

    废话不多说,直接分享,欢迎斧正. Android.mk中的变量(二) 1.LOCAL_PATH 这个变量用于给出当前文件的路径.你必须在Android.mk的开头定义.例如: LOCAL_PATH : ...

  4. Android 系统(140)---android.mk中几个常见配置

    android.mk中几个常见配置 1.LOCAL_JACK_ENABLED 这个变量可以禁止使用Jack编译工具链编译该模块.在工作中,个人感觉目前jack工具链不是很稳定,经常会出现一些错误,比如 ...

  5. 编写Android.mk中的LOCAL_SRC_FILES,使其自动查找源文件,不需要手动添加

    在使用NDK编译C/C++项目的过程中,免不了要编写Android.mk文件,其中最重要的就是android.mk源文件列表. cpp文件位于android项目下的的不同文件夹和子文件夹下 按照通常的 ...

  6. 【转】Update: Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES

    看原文请移步:Update: Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES 我在先前的两篇post 编写Android.mk中的LOCAL_SRC_F ...

  7. Android.mk中的LOCAL_OVERRIDES_PACKAGES

    关于Android.mk中的LOCAL_OVERRIDES_PACKAGES需要说明一下,此变量可以使其他的模块不加入编译, 如: 源码中DeskClock的android.mk有 LOCAL_OVE ...

  8. Android.mk中call all-subdir-makefiles和call all-makefiles-under,$(LOCAL_PATH)的区别

    Android.mk中call all-subdir-makefiles和call all-makefiles-under,$(LOCAL_PATH)的区别 在写Android.mk文件时,call ...

  9. Android.mk 编译c语言,编写 android.mk 中 LOCAL_C_INCLUDES 的技巧

    编写 android.mk 中 LOCAL_C_INCLUDES 的技巧 在编写android.mk的过程中,免不了要修改LOCAL_C_INCLUDES来设置头文件的include目录, 一般写成这 ...

  10. android.mk中几个常见配置

    1.LOCAL_JACK_ENABLED 这个变量可以禁止使用Jack编译工具链编译该模块.在工作中,个人感觉目前jack工具链不是很稳定,经常会出现一些错误,比如: ERROR: Security ...

最新文章

  1. el表达式 java_java基础学习:JavaWeb之EL表达式
  2. UNIX网络编程之旅-配置unp.h头文件环境
  3. 性能优化指南(5000 字小结)
  4. 腾讯下载视频转换MP4
  5. 性能优化之MySQL调优篇
  6. Java线程--BlockingQueue使用
  7. 西门子智能门锁设计_如何过度设计门锁
  8. 语言阿克曼函数_函数式的动态规划
  9. JAVA中整型常量的长度,Java基础入门篇(三)——Java常量、变量,
  10. Spring.Net学习笔记十(打造简易的依赖注入框架)
  11. umijs有什么好处_umijs核心代码解读
  12. VMware windows xp虚拟机设置静态ip
  13. vnr光学识别怎么打开_【教程】使用VNR后没有翻译,或文本设定无法提取完整文本解决方案...
  14. 5g理论速度_5G的速度到底能有多快?
  15. An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
  16. 对接支付宝App支付和网页支付接口详解
  17. Go 实现 json 格式定义 http 协议压测脚本
  18. [nssl132][jzoj cz 2106] 买门票 {dfs}
  19. TYVJ 1288 飘飘乎居士取能量块
  20. Django 模板引擎以及模板

热门文章

  1. java 颜色平滑渐变算法_颜色渐变算法
  2. 如何在SQL SERVER的windows身份验证添加一个SQL Server身份验证方式
  3. 《人类简史:从动物到上帝》读书摘记
  4. 域名抢注代码_如何停止域名抢注攻击
  5. 【绘制关系网络图】Gephi 入门使用
  6. 神仙打架!今年计算机考研爆炸实况!
  7. 一个很实用的造数工具—Spawner Data Generator
  8. Python 3的反驳
  9. 理解马尔可夫决策过程
  10. Visual Studio Code 编辑器