一 概述

android Q build变化整体上越来越严格,语法上之前能够使用的Q上将不能使用。

二 主要变化

2.1  'USER' 弃用 ‘USER’后面的值会被设置成‘nobody',android后续的修改都是围绕着去除掉不同机器不同用户的差异,使得满足要求的任何机器或者用户编译结果相同。如果必须要使用的话,可以使用’BUILD_USERNAME‘来进行替代 2.2 ’BUILD_NUMBER‘ ’BUILD_NUMBER‘从Android.mk中移除 2.3 DIST_DIR, dist_goal, and dist-for-goals 在android.mk中DIST_DIR and dist_goal 不能再被使用,只能使用dist-for-goals 2.4 .PHONY 伪目标规则更加严格 .PHONY使用用户交互型好的名字替代真是文件,但是使用伪目标每一此编译都被识别成dirty,需要重新编译。如果编译目标是伪目标的话无额外开销但是如果编译目标依赖于伪目标的话,可能是一笔不小的开销。 我们现在在Q上编译,如果有如下的warning的话,.PHONY目标不允许使用'/'

...mk:42: warning: PHONY target "out/.../foo" looks like a real file (contains a "/")

如果是如下错误的话,有两个原因1) .PHONY的目标不是一个真正的文件 2) 目标是一个真实文件,但是不在outpu目录下,在执行m clean的时候不能够删除它

...mk:42: warning: writing to readonly directory: "kernel-modules"

在实际使用中,用的最多的是想bootloader kernel这种不属于android编译系统的模块。他们使用伪目标的目的是在android的makefile中,不知道依赖是否有变化,因此要使用伪目标。谷歌建议此类编译最好在android系统外进行编译,以Prebuild的形式存在android的工程中。 总结下来,对于非android编译系统的编译问题,建议单独编译,如果非要添加进去的话,不要使用.PHONY

out/target/.../zImage: $(sort $(shell find -L $(KERNEL_SRCDIR)))
...

谷歌认为像kernel这样的,如果不是debug kernel的话,不要每次都重新编译,如果需要重新编译的话,可以先clean在编译。 2.5 Makefile中export and unexport  将被弃用 export 和unexport 变量的方式不被使用,如果要使用的话,建议使用方法如下:

$(intermediates)/generated_output.img:
rm -rf $@
export MY_ENV_A="$(MY_A)"; make ...

如果要设置很多的变量的话,使用方法如下:

envsh := $(intermediates)/env.sh
$(envsh):
rm -rf $@
echo 'export MY_ENV_A="$(MY_A)"' >$@
echo 'export MY_ENV_B="$(MY_B)"' >>$@ $(intermediates)/generated_output.img: PRIVATE_ENV := $(envsh)
$(intermediates)/generated_output.img: $(envsh) a/b/c/package.sh
rm -rf $@
source $(PRIVATE_ENV); make ...
source $(PRIVATE_ENV); a/b/c/package.sh ...

2.6 Module name将不能使用'/' 举例来说

include $(CLEAR_VARS)
LOCAL_MODULE := ver1/code.bin
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/firmware
...
include $(BUILD_PREBUILT) include $(CLEAR_VARS)
LOCAL_MODULE := ver2/code.bin
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/firmware
...
include $(BUILD_PREBUILT)

上面的LOCAL_MODULE 不应该出现'/',可以将代码修改成下面这样

include $(CLEAR_VARS)
LOCAL_MODULE := ver1_code.bin
LOCAL_MODULE_STEM := code.bin
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/firmware/ver1
...
include $(BUILD_PREBUILT) include $(CLEAR_VARS)
LOCAL_MODULE := ver2_code.bin
LOCAL_MODULE_STEM := code.bin
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/firmware/ver2
...
include $(BUILD_PREBUILT)

在修改的同时,要将PRODUCT_PACKAGES和LOCAL_REQUIRED_MODULES对应的名字进行修改 2.7 Module 名字字符选择 Module的名字从 a-z, A-Z, 0-9, and the special characters _.+-=,@~选取 2.8 PATH Tools android的编译正朝着可重入性发展,也就是不依赖环境。为了实现这个目标PATH会指向android工程里的工具。目前的唯一区别就是删除 host GCC工具。对于违反规则使用build server PATH中的工具和命令的话,目前只是记录到LOG中,后面限制会更加严格,可能就无法使用。 在build/soong/ui/build/paths/config.go文件中包含相关配置,包含编译中使用到的工具,如果不在这个工具列秒中,在out/soong.log文件中将有相关warning显示。 为了解决这类问题,最好的方法就是使用,将相关tools放到prebuilt下,或者在编译的时候将他编译成host tools 可以通过设置TEMPORARY_DISABLE_PATH_RESTRICTIONS=true的方式暂时编译通过。 2.9 在envsetup.sh中弃用'/' 谷歌那边的编译是不需要运行envsetup.sh的,许多odm还是需要运行这个脚本,里面的许多变量使用了绝对路径

instead of use
OUT {#OUT} OUT_DIR
ANDROID_HOST_OUT {#ANDROID_HOST_OUT} HOST_OUT
ANDROID_PRODUCT_OUT {#ANDROID_PRODUCT_OUT} PRODUCT_OUT
ANDROID_HOST_OUT_TESTCASES {#ANDROID_HOST_OUT_TESTCASES} HOST_OUT_TESTCASES
ANDROID_TARGET_OUT_TESTCASES {#ANDROID_TARGET_OUT_TESTCASES} TARGET_OUT_TESTCASES

上面的envsetup.sh中的变量都取自makefile为,相对路径。如果要使用绝对路径的话,下面的方法,在单条规则中export

$(PRODUCT_OUT)/gen.img: my/src/path/gen.sh
export PRODUCT_OUT=$$(cd $(PRODUCT_OUT); pwd); cd my/src/path; ./gen.sh -o $${PRODUCT_OUT}/gen.img

2.9 ANDROID_BUILD_TOP 在android.mk文件中,可以设定当前的目录为代码目录,可以使用.来替代或者直接指定文件,如果要使用绝对路径的话,请参考上节的例子。 2.10 停止使用直接使用PATH 新的soong会修改PATH变量,不建议在Makefile中读取这个变量。如果要使用的话,建议如下:

$(TARGET): myscript my/path/binary
PATH=my/path:$$PATH myscript -o $@

2.11 不要使用PYTHONPATH 跟PATH变量一样,PYTHONPATH 变量也是有变化的,不建议在Mafile频繁读取。谷歌建议将修改song python building support.这部分主要是 packages the python interpreter, libraries, and script all into one file。不过还是建议使用如下方法,更简单一点:

$(TARGET): myscript.py $(sort $(shell find my/python/lib -name '*.py'))
PYTHONPATH=my/python/lib:$$PYTHONPATH myscript.py -o $@

2.12 PRODUCT_COMPATIBILITY_MATRIX_LEVEL_OVERRIDE和USE_CLANG_PLATFORM_BUILD  弃用

3 总结

android Q 主要的变化就是.PHONY伪目标使用更严格,除prebuilt下的命令使用除了config.go里面的,将不允许使用。

作者:Little熊猫 链接:https://www.jianshu.com/p/658ec93e84fd 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

android Q build 变化的更多相关文章

  1. Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分 (转载)

    本文参考了谷歌开发者文档:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional 如果 ...

  2. Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

    Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分 标签: build targetminSdkVersiont ...

  3. 【Android Studio安装部署系列】三十七、从Android Studio3.2升级到Android Studio3.4【以及创建Android Q模拟器】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 保持Android Studio开发环境的最新版本. 下载Android Studio3.4 使用Android Studio自带的 ...

  4. 谷歌的Android Q到底有哪些新特性及变更?

    Android Q 隐私更改相关介绍 存储范围变更 Android Q 改变了应用程序访问设备外部存储上文件的方式. 通过使用更细粒度的媒体特定权限替换以前的 READ_EXTERNAL_STORAG ...

  5. Android Gradle 构建工具(Android Gradle Build Tools)是什么?

    转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...

  6. Android Q 兼容那些事

    文章微信公众号「AndroidTraveler」首发 5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法. 会议主要是加深开发者对 Android Q ...

  7. 解决 Could not find com.android.tools.build:gradle 问题

    今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...

  8. Could not find com.android.tools.build:gradle:1.3.0.

    * What went wrong:          A problem occurred configuring project ':TZYJ_Android'.> Could not re ...

  9. Failed to apply plugin [id 'com.android.application'] 和 Could not find com.android.tools.build:gradle:2.XX的最正确的解决方法

    发现android studio是真的可爱啊,上一秒还没问题可以build运行,下一秒就出错...好,你任性,你牛逼.. 说下今天又遇到的两个问题:Failed to apply plugin [id ...

随机推荐

  1. [Swift]LeetCode199. 二叉树的右视图 | Binary Tree Right Side View

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  2. [Swift]LeetCode461. 汉明距离 | Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  3. [Swift]LeetCode914.一副牌中的X | X of a Kind in a Deck of Cards

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  4. git push每次提交都要输入用户名的解决方案

    前言 最近把代码从csdn转移到gitee后,每一次git push都需要输入用户名和密码,比较麻烦,那有没有一个办法可以去掉这个步骤呢? 原因 每次都需要输入用户名和密码是因为你采用的是https方 ...

  5. 文本编辑器激活系列(二):UltraEdit安装、激活、汉化教程

    如您激活出现问题,请点击这里加入:软件激活问题解决群 前言 推荐几款文本编辑器: Sublime:内嵌python解释器.大量插件 EditPlus:语法着色.内嵌浏览器 Notepad++:所见即所 ...

  6. Django+Bootstrap+Mysql 搭建个人博客(二)

    2.1.博客首页设计 (1)settings.py MEDIA_ROOT = os.path.join(BASE_DIR,'media').replace("//","/ ...

  7. Unity 本地坐标到世界坐标,世界坐标到本地坐标

    世界=>本地 public GameObject mTarget; public GameObject mPar; //这个注意一定要是mTarget的第一父物体. // Use this fo ...

  8. C#版 - Leetcode 504. 七进制数 - 题解

    C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...

  9. Spring Cloud中服务的发现与消费

    之前没注意,微信公众号的图片不能引用到其他地方,本文图片显示不正常,原图在写完博客后已经删了,,,,,,所以本文小伙伴可以移步这里https://mp.weixin.qq.com/s/GoIZdwt5 ...

  10. Solr04 - 在Jetty和Tomcat上部署Solr单机服务

    目录 1 准备安装环境 2 通过内部Jetty服务器启动 3 通过配置Tomcat服务器启动 3.1 删除不需要的应用 3.2 修改服务端口 3.3 部署solr.war 3.4 扩展: 虚拟目录发布 ...