android Q build 变化
一 概述
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 变化的更多相关文章
- Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分 (转载)
本文参考了谷歌开发者文档:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#provisional 如果 ...
- Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分
Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分 标签: build targetminSdkVersiont ...
- 【Android Studio安装部署系列】三十七、从Android Studio3.2升级到Android Studio3.4【以及创建Android Q模拟器】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 保持Android Studio开发环境的最新版本. 下载Android Studio3.4 使用Android Studio自带的 ...
- 谷歌的Android Q到底有哪些新特性及变更?
Android Q 隐私更改相关介绍 存储范围变更 Android Q 改变了应用程序访问设备外部存储上文件的方式. 通过使用更细粒度的媒体特定权限替换以前的 READ_EXTERNAL_STORAG ...
- Android Gradle 构建工具(Android Gradle Build Tools)是什么?
转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...
- Android Q 兼容那些事
文章微信公众号「AndroidTraveler」首发 5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法. 会议主要是加深开发者对 Android Q ...
- 解决 Could not find com.android.tools.build:gradle 问题
今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...
- Could not find com.android.tools.build:gradle:1.3.0.
* What went wrong: A problem occurred configuring project ':TZYJ_Android'.> Could not re ...
- 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 ...
随机推荐
- [Swift]LeetCode171. Excel表列序号 | Excel Sheet Column Number
Given a column title as appear in an Excel sheet, return its corresponding column number. For exampl ...
- [Swift]LeetCode730. 统计不同回文子字符串 | Count Different Palindromic Subsequences
Given a string S, find the number of different non-empty palindromic subsequences in S, and return t ...
- 机器学习入门18 - 生产机器学习系统(Production ML Systems)
除了实现机器学习算法之外,机器学习还包含许多其他内容.生产环境机器学习系统包含大量组件.无需自行构建所有内容,而是应该尽可能重复使用常规机器学习系统组件.通过了解机器学习系统的一些范例及其要求,可以明 ...
- 当子查询内存在ORDER BY 字句时查询会报错
问题:当子查询内存在ORDER BY 字句时查询会报错 SQL: SELECT * FROM ( SELECT * FROM USER ORDER BY USER_CORD ) S. 解决办法:在子查 ...
- 在.NET中使用Redis
dll文件 namespace RedisDemo { public partial class RedisPage : System.Web.UI.Page { protected void Pag ...
- influxdb使用说明
前言 influxdb是目前比较流行的时间序列数据库. 何谓时间序列数据库?什么是时间序列数据库,最简单的定义就是数据格式里包含Timestamp字段的数据,比如某一时间环境的温度,CPU的使用率等. ...
- nginx部署~dotnetCore+mvc网站502
这个不是nginx的问题,也不是dotnet core的问题,也不是mvc的问题,更不是防火墙的问题! 原因在于这个SeLinux 把它关了就可以了 setsebool -P httpd_can_ne ...
- SpringBoot完美配置阿里云的文件上传
新建一个config类 AliyunOSS.java @Configuration @Data public class AliyunOSS { private OSSClient ossClient ...
- 如何用sysbench做好IO性能测试
sysbench 是一个非常经典的综合性能测试工具,通常都用它来做数据库的性能压测,但也可以用来做CPU,IO的性能测试.而对于IO测试,不是很推荐sysbench,倒不是说它有错误,工具本身没有任何 ...
- Java并发专题(一)认识线程
1.1 认识线程 线程是轻量级进程,也是程序执行的一个路径,每一个线程都有自己的局部变量表.程序计数器(指向正在执行的指令指针)以及各自的生命周期,现代操作系统中一般不止一个线程在运行.比如说,当我们 ...