AGP 8 linter 要求向 API 中尚不存在的pendingIndent 添加标志

问题描述 投票:0回答:1

最近我更新了我的 Android 应用程序:

  • AGP:7.2.2 -> 8.5.2
  • 目标/编译 SDK 版本:34 -> 35
  • 摇篮:7.3.3 -> 8.7

在此之前,我的 linter 工作正常,没有显示任何代码问题。但是升级后它开始显示错误:

<Path to file>:<line> Error: Missing PendingIntent mutability flag [UnspecifiedImmutableFlag]
              pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

我知道从 API 31 开始,需要为所有挂起的意图提供可变性标志,因此这就是它被视为错误的原因,但这行来自片段:

if(Build.VERSION.SDK_INT >= VERSION_CODES.M){
    pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
} else {
    pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
}

如果我是正确的,FLAG_IMMUTABLE 是在 API 23 中引入的,所以如果我想也支持 API 21 和 22,我需要有“if 语句”。如果它是在 API 23 中引入的,为什么 linter 要求我将该标志放入旧 API 的代码中?

我遗漏了什么还是明显误报?

目前我用注释抑制了这个错误,但我觉得这不是正确的方法。

android android-intent flags linter
1个回答
0
投票

我在 AGP linter 中查看了该规则的单元测试源代码。他们正在以各种方式对其进行测试,但他们不会使用像我这样的代码进行测试。因此,基于Android代码搜索我能够使用如下代码解决我的问题:

PendingIntent pendingIntent = null;
int pendingIntentFlags;
if(Build.VERSION.SDK_INT >= VERSION_CODES.M){
    pendingIntentFlags = PendingIntent.FLAG_IMMUTABLE;
} else {
    pendingIntentFlags = 0;
}
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, pendingIntentFlags);

现在 linter 对该代码没有任何问题。

我仍然不知道为什么我之前的代码在 linter 上失败,所以如果有人有任何想法,请在评论中分享你的想法,因为我想知道。

© www.soinside.com 2019 - 2024. All rights reserved.