[Android Framework]Android 11系统Update-API时Lint检查问题解决和记录

1.什么是Lint检查

Android Lint 是 ADT 16(和工具 16)中引入的一个新工具,用于扫描 Android 项目源以查找潜在的错误。Android11之前,我们在进行Framework层进行系统定制和开发时,只要代码不出现明显的语法错误,都能正常编译。但是在Android 11中,对于系统层的代码进行了更严格的Lint检查,即使代码没有明显的语法错误,也很可能因为不规范和不够严谨等,在执行make update-api时报错,而且往往不止一个。

Lint检查出错会伴随如下的日志出现:

1 new API lint issues were found. See tools/metalava/API-LINT.md for how to handle these.
/************************************************************
Your API changes are triggering API Lint warnings or errors. To make these errors go away, fix the code according to the error and/or warning messages above. it is not possible to do so, there are workarounds
1.You can suppress the errors with @SuppressLint("")
2.You can update the baseline by executing the following
command:
cp \
out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/api_lint_baseline.txt \
frameworks/base/api/lint-baseline.txt
To submit the revised baseline.txt to the main Android\n repository, you will need approval.
************************************************************/

并且生成报错文件out/soong/.intermediates/frameworks/base/api-stubs-docs/android_common/api_lint_baseline.txt

2.解决方式

假设报错提示为:

Missing nullability on method csdn() return [MissingNullability]

当我们遇到Lint报错时,其实最好的方法是根据所报的错误去修改优化代码,让其符合代码规范,比如该例中提示的是return对象缺少判空注解,故将public static int csdn(int x)改为public static @NonNull int csdn(int x)或者public static @Nullable int csdn(int x),如果提示的是参数x缺少判空属性,则在参数前面加上注解即可,不过别忘了import android.annotation.NonNull;或者Nullable

但是有的情景下,如项目赶工期或者报的错误过多,短时间修改起来过于费时费力时,我们可以选择一些“缓兵之计”来绕过Lint检查。当前网络上的通用解决方法主要有以下两种,这两种实际上也是报错提示所建议的:

1.@SuppressLint注解

该方法的优点有两个,不用修改代码本身和比较稳定,即只要根据所报的错误老老实实添加@SuppressLint(“XXX”)注解,一般都能解决问题,缺点是当错误较多时,仍然费时费力。

修改方法:由于提示的错误类型为[MissingNullability],故我们只需要在代码上方添加注解即可。

@SuppressLint("MissingNullability")
public static int csdn(int x) { doWork() }

2.修改frameworks/base/api/lint-baseline.txt文件

该方法能使Lint直接跳过检查添加部分的问题,如果确定代码没问题,也可以尝试这个方法,但是目前网上有说这个方法并不是百分之百起作用。

修改方法:
根据报错文件中报错的内容,将其按格式copy到frameworks/base/api/lint-baseline.txt中,如果无效果,可以检查一下frameworks/base/StubLibraries.bp中name: "api-stubs-docs-non-updatable"项里是否有添加依赖:baseline_file: “api/lint-baseline.txt”。

3.api-lint-ignore

实际上,还有一种更简单的方法,可以直接忽略掉一整个文件甚至一整个目录的lint检查,即在framework/base/Android.bp文件中,搜索metalava_framework_docs_args字段,在下面加入"–api-lint-ignore-prefix xxx.xxx ",不过在该字段的上面有一个注释:

// TODO(b/145644363): move this to under StubLibraries.bp or ApiDocs.bp

所以如果没找到该字段,可以尝试去注释中的两个文件里找一下api-lint-ignore相关字段并加入自己的代码路径尝试一下。

PS:后续可能会在该文章中更新一些项目中遇到过的lint错误和代码修改方法。。。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值