我尝试使用Android中提供的升级助理将Android插件从4.2.2升级到7.0.1,这是在Tools > 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插件7.0.1还没有真正为黄金时段做好准备,因为Android Gradle插件文档仍然使用classpath 'com.android.tools.build:gradle:4.2.0'
而不是7.0.1。
我看到Android插件7.0.1发布说明提到了皮棉的一些变化,但这些变化似乎都与我无关。
我还浏览了一下Android Gradle插件源代码,看看是否能找到皮线阶段,任何识别任何更改,但它似乎是大量的工作,以找到该代码,并进行分析。
我搜索答案,但我所能找到的只有这两个堆栈溢出条目,其中错误是合法的,程序员只需更改他们的代码,以确保他们引用的是一个实际的Activity
。
我也尝试了Android插件7.0.0,但是得到了同样的错误。只有Android插件4.2.2才能防止错误。
这是Android插件7.0.1中的一个bug吗?
Instantiatable
更新:无法禁用
我试图通过以下方式禁用Instantiatable
lint错误,但没有一种方法阻止了错误。
首先,我尝试将disable "Instantiatable"
添加到应用程序级别的build.gradle文件中:
android {
lintOptions {
disable "Instantiatable"
}
}
其次,我尝试将@SdkSuppress("Instantiatable")
放在类的前面:
@SdkSuppress("Instantiatable")
class MainActivity : AppCompatActivity() {
// ...
}
类似地,我尝试了@SuppressLint("Instantiatable")
,但这也不起作用。
发布于 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之外的所有文件):
android {
lintOptions {
disable "Instantiatable"
}
}
https://stackoverflow.com/questions/68899665
复制相似问题