从google gradle插件3.1.4更新到最新的3.2.1之后,我试图重新构建我的应用程序,我认为我使Instantapp首先工作的方法可能存在问题,因此我发布此问题以放弃或确认该问题,并在这种情况下要求采用其他方法。
简而言之,我的应用程序是一个资产文件夹中包含许多图形的游戏。为了使Instantapp适应Google Play规定的10兆字节的限制,我必须删除一些我在即时版本中不需要的资产以及更高分辨率的资产,同时保留其余资产。另外,instantapp的代码与已安装的代码略有不同,因此我在此处覆盖了一些方法和类。
看来,最小的com.android.instantapp模块不能包含资产和代码,因此我创建了一个中间功能模块来保存这些资产和代码。
因此,经过大量的努力(主要是使用Firebase和com.google.gms.google-services插件),我想出了这种方法,该方法最终适用于gradle插件的3.1.4版本(com.android .tools.build:gradle:3.1.4)
唯一奇怪的是,我必须将android_instant_feature和android_common功能模块的标志都设置为“ baseFeature”。但这有效,我终于可以发布游戏的即时版本,而安装的版本也可以继续构建。
现在,一旦我更新到Google Gradle插件的3.2.1版本,即使我没有进行任何其他更改,问题也开始出现。尝试构建项目时,我遇到了很多此类错误:
Unable to find a matching variant of project :android_common:
- Variant 'debugApiElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found compatible value 'debug'.
- Found com.android.build.api.attributes.VariantAttr 'debug' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Aar'.
- Found org.gradle.usage 'java-api' but wasn't required.
- Variant 'debugFeatureApiElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found compatible value 'debug'.
- Found com.android.build.api.attributes.VariantAttr 'debugFeature' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Feature'.
- Found org.gradle.usage 'java-api' but wasn't required.
- Variant 'debugFeatureRuntimeElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found compatible value 'debug'.
- Found com.android.build.api.attributes.VariantAttr 'debugFeature' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Feature'.
- Found org.gradle.usage 'java-runtime' but wasn't required.
- Variant 'debugRuntimeElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found compatible value 'debug'.
- Found com.android.build.api.attributes.VariantAttr 'debug' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Aar'.
- Found org.gradle.usage 'java-runtime' but wasn't required.
- Variant 'releaseApiElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found incompatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Aar'.
- Found org.gradle.usage 'java-api' but wasn't required.
- Variant 'releaseFeatureApiElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found incompatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'releaseFeature' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Feature'.
- Found org.gradle.usage 'java-api' but wasn't required.
- Variant 'releaseFeatureRuntimeElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found incompatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'releaseFeature' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Feature'.
- Found org.gradle.usage 'java-runtime' but wasn't required.
- Variant 'releaseRuntimeElements':
- Required com.android.build.api.attributes.BuildTypeAttr 'debug' and found incompatible value 'release'.
- Found com.android.build.api.attributes.VariantAttr 'release' but wasn't required.
- Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Metadata' and found incompatible value 'Aar'.
- Found org.gradle.usage 'java-runtime' but wasn't required.
在对gradle脚本进行了一些调整之后,包括从android_instant_feature模块中删除了baseFeature true标志,我得到了一个更简短的错误,但是我无法真正说出自己是否比以前更好。错误是这样的:
预期的配置 ':android_instant_feature:debugFeatureCompileClasspath'包含 只是一个文件,但是不包含任何文件。
现在我只是被封锁在这里,不知道该怎么做或下一步去哪里,所以我想知道我的方法是否存在根本性的缺陷,因为我是经过反复尝试后才想到的, “不确定是否可以,在这种情况下,我可以使用哪种其他方法满足我的要求以及Google的要求,无论哪种方法。
根据@TWL的请求,这些是这些模块的我的Gradle文件。我已经用com.myapp.id替换了真实的应用程序ID,其余的正是我所拥有的,包括很多我认为与该问题无关的libGDX内容,尽管我更愿意以准确性的名义将其保留在此处:
android_common :
apply plugin: "com.android.feature"
configurations { natives }
android {
baseFeature true
compileSdkVersion 28
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
androidTest.setRoot('tests')
}
defaultConfig {
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
sourceSets {
all {
manifest.srcFile "AndroidManifest.xml"
}
}
multiDexEnabled true
}
buildTypes {
release {
setMinifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
buildToolsVersion '28.0.2'
lintOptions {
abortOnError false
}
dexOptions {
jumboMode true
}
}
dependencies {
application project(':android')
implementation project(':core')
api 'com.android.support:multidex:1.0.3'
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
implementation "com.android.billingclient:billing:$playBillingLibVersion"
implementation "com.google.firebase:firebase-core:16.0.3"
implementation "com.google.firebase:firebase-ads:15.0.1"
implementation fileTree(include: ['*.jar'], dir: 'libs')
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.guava:guava:24.0-android'
}
task copyAndroidNatives() {
file("libs/armeabi/").mkdirs();
file("libs/armeabi-v7a/").mkdirs();
file("libs/arm64-v8a/").mkdirs();
file("libs/x86_64/").mkdirs();
file("libs/x86/").mkdirs();
configurations.natives.files.each { jar ->
def outputDir = null
if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
if (jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
if (jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
if (jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
if (outputDir != null) {
copy {
from zipTree(jar)
into outputDir
include "*.so"
}
}
}
}
android_instant_feature :
apply plugin: "com.android.feature"
android {
// baseFeature true
buildToolsVersion "28.0.2"
compileSdkVersion 28
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ["${project(':android_common').projectDir}/res"]
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
defaultConfig {
versionCode 4031
versionName "4.1.2.1i"
minSdkVersion 16
targetSdkVersion 28
multiDexEnabled true
}
dexOptions {
jumboMode true
}
// Proguard configuration
buildTypes {
release {
//minifyEnabled true will turn proguard ON
// minifyEnabled true
//proguardFiles let you add your own proguard rules ('proguard-project.txt') in this case, as its already created by gdx-setup
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
debug {}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
productFlavors {
}
lintOptions {
abortOnError false
}
}
task run(type: Exec) {
def path
def localProperties = project.file("../local.properties")
if (localProperties.exists()) {
Properties properties = new Properties()
localProperties.withInputStream { instr ->
properties.load(instr)
}
def sdkDir = properties.getProperty('sdk.dir')
if (sdkDir) {
path = sdkDir
} else {
path = "$System.env.ANDROID_HOME"
}
} else {
path = "$System.env.ANDROID_HOME"
}
def adb = path + "/platform-tools/adb"
commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.marzoa.ruletafree/com.marzoa.ruletafree.AndroidLauncher'
}
dependencies {
implementation project(":core")
feature project(":android_common")
api 'com.android.support:multidex:1.0.3'
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
implementation "com.google.firebase:firebase-core:16.0.3"
implementation 'com.google.android.gms:play-services-instantapps:16.0.0'
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'
android_instant :
apply plugin: 'com.android.instantapp'
android {
defaultConfig {
applicationId "com.myapp.id"
minSdkVersion 16
targetSdkVersion 28
multiDexEnabled true
}
}
dependencies {
implementation project(":android_common")
implementation project(":android_instant_feature")
}
android :
apply plugin: "com.android.application"
apply plugin: 'io.fabric' // Needed by crashlytics. DO NOT REMOVE.
android {
buildToolsVersion "28.0.2"
compileSdkVersion 28
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ["${project(':android_common').projectDir}/res"]
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
androidTest.setRoot('tests')
}
defaultConfig {
applicationId "com.myapp.id"
versionCode 4032
versionName "4.1.2.1"
minSdkVersion 16
targetSdkVersion 28
multiDexEnabled true
}
dexOptions {
jumboMode true
}
// Proguard configuration
buildTypes {
release {
//minifyEnabled true will turn proguard ON
minifyEnabled true
//proguardFiles let you add your own proguard rules ('proguard-project.txt') in this case, as its already created by gdx-setup
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
productFlavors {
}
lintOptions {
abortOnError false
}
}
task importPuzzles(type: Exec) {
// TODO
}
task run(type: Exec) {
def path
def localProperties = project.file("../local.properties")
if (localProperties.exists()) {
Properties properties = new Properties()
localProperties.withInputStream { instr ->
properties.load(instr)
}
def sdkDir = properties.getProperty('sdk.dir')
if (sdkDir) {
path = sdkDir
} else {
path = "$System.env.ANDROID_HOME"
}
} else {
path = "$System.env.ANDROID_HOME"
}
def adb = path + "/platform-tools/adb"
commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.marzoa.ruletafree/com.myapp.id.AndroidLauncher'
}
dependencies {
implementation project(":core")
implementation project(":android_common")
api 'com.android.support:multidex:1.0.3'
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
implementation "com.android.billingclient:billing:$playBillingLibVersion"
implementation "com.google.firebase:firebase-core:16.0.3"
implementation "com.google.firebase:firebase-ads:15.0.1"
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.5'
implementation fileTree(include: ['*.jar'], dir: 'libs')
}
// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'
非常感谢!
答案 0 :(得分:1)
感谢您提供gradle文件,并且您的gradle依赖项看起来很混乱。
包含com.android.feature
的{{1}}模块应该是依赖项也同时包含baseFeature true
和application project()
的模块。那是造成您错误的主要原因:
预期的配置':___:debugFeatureCompileClasspath'要包含 只是一个文件,但是不包含任何文件。
因此,从您提供的内容看来,feature project()
和application project()
是分开的。
要解决此问题,您的“ 基本” feature project()
应该为:
android_common
您的“ 非基本功能” application project(':android')
feature project(":android_instant_feature")
应该为:
android_instant_feature
这不会改变项目的整体结构。
implementation project(':android_common)
将使用以下库进行编译:{{1}}和com.android.application
。core
将使用即时应用apk编译:{{1}}和android_common
。现在,为什么以前使用2x com.android.instantapp
?我不知道,它不应该...
过去{@ {3}}的页面解释了即时应用程序的结构,但是您可以参考我以前写过的一篇文章中的概述和参考链接:https://g.co/instantapps < / p>
旁注:我注意到您在整个模块中都拥有一个android_common.apk
(减去Instantapp)。如果那纯粹是android_instant_feature.apk
之类的库,那么您就不必像这样进行设置。实际上,您可以将其作为baseFeature
放在 base 中,并删除其他所有引用。将其声明为implementation project(":core")
意味着任何同时实现基础的模块也将暴露于此依赖关系。 (尝试一下,在极少数情况下,这取决于您的com.android.library
所具有的其他库,但是请尝试看看。)