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

2023-05-16

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错误和代码修改方法。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 删除视图并重新创建它

    有没有办法删除设置的视图 setContentView R layout set map center mapView MapView findViewById R id mapview 如果我再次调用此视图 则会收到一条错误消息 java
  • Android浏览器上的Web应用程序宽度问题

    所以到目前为止我只在 Android 浏览器上遇到过这个问题 基本上我的网站几乎一直运行良好 而且我还没有在 Dolphin Opera 或 Skyfire 上看到这个问题 但偶尔当我从手机主屏幕之一上的书签重新打开 Android 浏览器
  • Android 从键盘读取

    我的登录屏幕根本没有文本字段 当用户使用 RFID 扫描仪扫描他的 id 令牌时 我会得到一个 8 个字符长的字符串 其原理与使用键盘相同 只是更快 我希望我的登录活动在用户扫描其令牌时而不是之前执行 有一个聪明的方法来实现这个吗 我不能有
  • 无法找到/下载 AppCompat-v7:23.1.1

    怎么了 我遇到了很多 找不到 appcompat v7 23 1 1 的问题 许多解决方案都不起作用 经过几个小时的思考和寻找答案 我遇到了一个奇怪的问题 I have gotAndroid 支持库 23 1 1 已安装 所有功能 exce
  • 如何在我的 Android 应用程序中实现应用内购买?

    如何在我的 Android 应用程序中实现应用内购买 我提到 http developer android com guide market billing billing integrate html billing service ht
  • 错误 libGL.so:无法使用 Android 模拟器打开共享对象文件

    我试图在 Ubuntu 12 04 64 位 中运行 android 模拟器 但是 我收到以下错误 Starting emulator for AVD emulatr Failed to load libGL so error libGL
  • AOSP 中 android.Build.SERIAL 何时何地生成?

    我知道android Build SERIAL是在第一次设备启动时生成的 但我无法准确定位位置和时间 我正在建造AOSP Jelly Bean Android平板电脑 nosdcard 第二个问题 这个是序列号吗 really对所有人来说都
  • 仅在 Android 应用程序中使用 XHDPI 可绘制对象?

    如果您计划在不久的将来支持 LDPI MDPI HPDI 或许还有 XHDPI 那么是否可以在项目中仅包含 XHDPI 可绘制对象并让设备将其缩放到所需的分辨率 我已经测试过在 Photoshop 中将可绘制对象的大小调整为 MDPI 和
  • 返回主要活动(意图)时传递数据我做错了什么?

    我是安卓新手 这可能是最简单的问题 但我不明白这里出了什么问题 我试图创建一个通过意图传递值的基本示例 因此 当我关闭第二个活动时 我需要将数据传递到主活动 这是代码 意图测试1 主要活动 public void onClick View
  • 取消通知

    我使用Onesignal推送通知 需要取消所有onPause和onResume的通知 NotificationManager notificationManager NotificationManager getApplicationCon
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • 以编程方式应用样式资源

    我没有找到一种以编程方式做到这一点的方法 所以我在这里发布这个问题 我也没有找到与此相关的任何问题 我有一个资源样式 在 res values styles xml 中定义 我想做的是使用 java 将这种样式应用到我正在操作的 View
  • Android - 正确使用 invalidateOptionsMenu()

    我一直在寻找很多invalidateOptionsMenu 我知道它的作用 但我想不出这种方法在现实生活中有用的任何例子 我的意思是 例如 假设我们要添加一个新的MenuItem to our ActionBar 我们可以简单地获取菜单on
  • 确定视图是否在屏幕上 - Android

    我对这个有点困惑 首先也是最重要的是 以下链接很有用 但是我提出了一些可见性问题 链接 检查视图可见性 https stackoverflow com questions 4628800 android how to check if a
  • 为什么 ExpandableListView 更改 ChildView 设置(Android)?

    我对使用 ExpandableListView 有疑问 就我而言 我有两个组视图和两个子视图 而子视图由一个带有多个按钮 文本视图等的相对布局组成 例如 当首先扩展第二组并对视图持有者进行一些更改并随后扩展第一组时 先前所做的更改也会自动应
  • Android:如何在布局中放置纯色矩形?

    我有一个可以很好地膨胀的relativelayout 我想在顶部添加一个跨越布局宽度的纯色矩形 我尝试将以下内容放入我的 xml 中
  • 在上下文操作模式下选择时,ListView 项目不会在视觉上“突出显示”

    我关注了 Android 官方网站创建上下文操作菜单的教程 http developer android com guide topics ui menus html CAB 使用下面的代码 当我长按我的 ListView 项目之一时 它确
  • 当我使用 ListView 时,ListTile OnTap 正在工作。但是当我使用 ListWheelScrollView 时它不起作用

    当我使用 ListView 时 ListTile OnTap 正在工作 但是当我使用 ListWheelScrollView 时它不起作用 我的意思是它不会被窃听 观点发生变化 但我似乎无法点击它 我在很多地方和链接中寻找解决方案 但仍然找
  • Android BLE 扫描永远找不到设备

    几天以来 我尝试在我的应用程序中实现 BLE 连接 我知道我尝试连接的设备功能齐全 因此问题一定是我的代码 我用BluetoothLeScanner startScan 方法 但回调方法永远不会被调用 public void startSc
  • 如何让用户在android列表视图中选择主题?

    我有一个带有两个标签的列表视图 标题和副标题 我想要深色和浅色背景作为用户选项 标题具有 textAppearanceMedium 副标题具有 textAppearanceSmall 我希望样式 MyTheme Dark 具有白色文本 My

随机推荐