Error: MainActivity must extend android.app.Activity [Instantiatable]

Error: MainActivity must extend android.app.Activity [Instantiatable]

我尝试使用 upgrade assistant 将 Android Gradle 插件从 4.2.2 升级到 7.0.1,该插件在 Android Studio 的工具 > AGP 升级助手中可用.它所做的唯一更改是我的项目级别 build.gradle 文件:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.0.1' // changed from 4.2.2 to 7.0.1
        // ...
    }
}

但是,现在当我 运行 ./gradlew assemble assembleAndroidTest 我得到以下错误:

/builds/locuslabs/android-team/locuslabs-android-sdk/app/src/main/AndroidManifest.xml:21: Error: MainActivity must extend android.app.Activity [Instantiatable]
            android:name="com.locuslabs.appsdk.MainActivity"
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Explanation for issues of type "Instantiatable":
   Activities, services, broadcast receivers etc. registered in the manifest
   file (or for custom views, in a layout file) must be "instantiatable" by
   the system, which means that the class must be public, it must have an
   empty public constructor, and if it's an inner class, it must be a static
   inner class.
1 errors, 0 warnings
Lint found fatal errors while assembling a release target.
To proceed, either fix the issues identified by lint, or modify your build script as follows:
...
android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}

我的项目是多模块的,但我不怀疑这是问题所在,因为它抱怨的是应用程序模块,而不是库模块。

我相信我的 <activity> 标签在我的 AndroidManifest.xml 中对于我的应用程序模块格式正确:

        <activity
            android:name="com.locuslabs.appsdk.MainActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustNothing">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

此外,我认为扩展 AppCompatActivity 而不是 android.app.Activity 没有任何问题,就像我在 MainActivity.kt:

中所做的那样
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    // ...
}

我担心 Android Gradle 插件 7.0.1 还没有真正准备好迎接黄金时段,因为 Android Gradle Plugin documentation 仍然说 classpath 'com.android.tools.build:gradle:4.2.0' 而不是 7.0。 1.

我看到 Android Gradle Plugin 7.0.1 release notes 提到了对 linting 的一些更改,但其中 none 似乎与我相关。

我还浏览了 Android Gradle Plugin source code 以查看是否可以找到 linting 阶段任何识别任何更改但看起来找到该代码并进行分析需要大量工作。

我搜索了答案,但我只能找到这两个 Whosebug 条目,其中错误是合法的,程序员只需要更改他们的代码以确保他们引用的是实际的 Activity:

我也试过Android Gradle Plugin 7.0.0 但也有同样的错误。只有 Android Gradle 插件 4.2.2 可以防止错误。

这是 Android Gradle 插件 7.0.1 中的错误吗?

更新:无法禁用 Instantiatable

我尝试通过以下方式禁用 Instantiatable lint 错误,但其中 none 阻止了错误。

首先,我尝试将 disable "Instantiatable" 添加到我的应用程序级 build.gradle 文件中:

android {
    lintOptions {
        disable "Instantiatable"
    }
}

其次,我尝试将 @SdkSuppress("Instantiatable") 添加到 class:

@SdkSuppress("Instantiatable")
class MainActivity : AppCompatActivity() {
   // ...
}

同样,我尝试了 @SuppressLint("Instantiatable"),但也没有用。

the Android Gradle Plugin documentation still says classpath 'com.android.tools.build:gradle:4.2.0' instead of 7.0.1.

您需要继续阅读页面下方的内容,直至 this and this。 table 仅与 7.0.0 之前的版本相关。

Is this a bug in Android Gradle Plugin 7.0.1?

很有可能。或者,也许更进一步,因为 Instantiatable Lint 检查 has a history of problems.

如果您的场景与 2021 年 8 月的这三个错误中的一个不匹配,并且您能够提供可重现的测试用例,请提交新问题!除此之外,如果清理和重建没有解决您的问题,您可能需要暂时禁用 Instantiatable Lint 检查,方法是将以下内容添加到 all 应用程序或库级别的 build.gradle 个文件(即除项目级别 build.gradle 之外的所有文件):

android {
    lintOptions {
        disable "Instantiatable"
    }
}

同样的问题在 Gradle 7.4.1 中以同样的方式“修复” 他们意识到这正在发生吗?