首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误: MainActivity必须扩展android.app.Activity [不可更改]

错误: MainActivity必须扩展android.app.Activity [不可更改]
EN

Stack Overflow用户
提问于 2021-08-23 22:21:10
回答 1查看 9.2K关注 0票数 22

我尝试使用Android中提供的升级助理将Android插件从4.2.2升级到7.0.1,这是在Tools > AGP升级助手上提供的。它所做的唯一更改是对我的项目级build.gradle文件进行了更改:

代码语言:javascript
运行
复制
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时,我得到了以下错误:

代码语言:javascript
运行
复制
/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中有很好的格式:

代码语言:javascript
运行
复制
        <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中所做的那样:

代码语言:javascript
运行
复制
import androidx.appcompat.app.AppCompatActivity

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

我担心Android插件7.0.1还没有真正为黄金时段做好准备,因为Android Gradle插件文档仍然使用classpath 'com.android.tools.build:gradle:4.2.0'而不是7.0.1。

我看到Android插件7.0.1发布说明提到了皮棉的一些变化,但这些变化似乎都与我无关。

我还浏览了一下Android Gradle插件源代码,看看是否能找到皮线阶段,任何识别任何更改,但它似乎是大量的工作,以找到该代码,并进行分析。

我搜索答案,但我所能找到的只有这两个堆栈溢出条目,其中错误是合法的,程序员只需更改他们的代码,以确保他们引用的是一个实际的Activity

  1. Android错误:活动必须扩展android.app.activity
  2. 不能将MainActivity转换为android.app.Activity

我也尝试了Android插件7.0.0,但是得到了同样的错误。只有Android插件4.2.2才能防止错误。

这是Android插件7.0.1中的一个bug吗?

Instantiatable更新:无法禁用

我试图通过以下方式禁用Instantiatable lint错误,但没有一种方法阻止了错误。

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

代码语言:javascript
运行
复制
android {
    lintOptions {
        disable "Instantiatable"
    }
}

其次,我尝试将@SdkSuppress("Instantiatable")放在类的前面:

代码语言:javascript
运行
复制
@SdkSuppress("Instantiatable")
class MainActivity : AppCompatActivity() {
   // ...
}

类似地,我尝试了@SuppressLint("Instantiatable"),但这也不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 22:38:58

Android插件文档仍然显示classpath 'com.android.tools.build: Gradle :4.2.0‘而不是7.0.1。

您需要更深入地阅读该页面,即。该表仅与前7.0.0版本相关。

这是Android插件7.0.1中的一个bug吗?

很有可能。或者,也许超出了Instantiatable Lint 有问题的历史的范围。

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

代码语言:javascript
运行
复制
android {
    lintOptions {
        disable "Instantiatable"
    }
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68899665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档