Android wear 应用程序打包失败,出现了flavours相关问题。

18
我有一个包含穿戴应用程序的应用程序。在使用真实设备进行调试时,一切正常。我还可以创建包含穿戴应用程序的发布apk文件。但是,只有当我的应用程序中只有一个版本时才能这样做。
我想要维护两个具有不同applicationId的应用程序版本,尽管它们编译没有错误,但在这种情况下,两个发布apk文件(每个版本一个)都不包含相应的穿戴应用程序。
以下是移动应用程序build.gradle的相关部分:
    productFlavors {
    Trial {
        applicationId "com.example.myapp.trial"
        versionName "3.0.1"
        versionCode 301
    }
    Full {
        applicationId "com.example.myapp"
        versionName "3.0.1"
        versionCode 301
    }
}

}

dependencies {
    compile 'com.google.android.gms:play-services:6.1.+@aar'
    wearApp project(':myWearApp')
}

这是相应的穿戴应用 build.gradle 文件:

productFlavors {
    Trial {
        applicationId "com.example.myapp.trial"
        versionName "3.0.1"
        versionCode 301
    }
    Full {
        applicationId "com.example.myapp"
        versionName "3.0.1"
        versionCode 301
    }
}

}

dependencies {
    compile 'com.google.android.support:wearable:1.0.0'
    compile 'com.google.android.gms:play-services-wearable:6.1.71'
}

欢迎提供任何帮助,感谢。

4个回答

31

由于Scott给我的线索,这是完整的解决方案:

1.) 口味必须为小写

2.) 依赖配置必须包含 flavorRelease

3.) 在穿戴应用程序buil gradle中,在android{}下,我们必须包括publishNonDefault true

因此对于移动应用程序build.gradle:

android {

......

productFlavors {
    trial {
        applicationId "com.sample.myapp.trial"
        versionName "3.0.1"
        versionCode 301
    }
    full {
        applicationId "com.sample.myapp"
        versionName "3.0.1"
        versionCode 301
    }
 }
}

dependencies {
    trialWearApp project(path: ':myWearApp', configuration: 'trialRelease')
    fullWearApp project(path: ':myWearApp', configuration: 'fullRelease')
}

对于 Wear 应用的 build.gradle:

android {

  publishNonDefault true
......

productFlavors {
    trial {
        applicationId "com.sample.myapp.trial"
        versionName "3.0.1"
        versionCode 301
    }
    full {
        applicationId "com.sample.myapp"
        versionName "3.0.1"
        versionCode 301
    }
 }
}

以前我的编译根本无法通过。当我做了这个之后,现在可以编译了,但是当我将发布的 APK 安装到手机上时,它并没有将 Wear 应用添加到手表中。 - tasomaniac
您必须分别使用相同的密钥库为两个 APK 进行签名。请确保在 build.gradle 文件中都有签名部分。 - Miguel Sesma
非常感谢您的回答。这是一个与手表相关的问题。它决定什么都不做。我重新启动了所有设备,现在一切正常。 :) - tasomaniac
我们如何为移动设备和可穿戴设备合并不同的 buildTypes? - arne.jans
如何在应用程序和手表项目中使用3个BuildConfigs组合3种flavors? - Tormod
显示剩余7条评论

6
父应用程序的风格不会自动传播到Wear项目中。您需要显式地进行映射。
而不是这样:
dependencies {
    wearApp project(':myWearApp')
}

请按照以下步骤操作:

在您的Wear应用程序中:

android {
    publishNonDefault true
}

在您的父级应用程序中:
dependencies {
    TrialWearApp project(path: ':myWearApp', configuration: 'Trial')
    FullWearApp project(path: ':myWearApp', configuration: 'Full')
}

谢谢Scott。TrialWearApp和FullWearApp这些词在Gradle中没有被识别,我需要在其他地方定义它们吗? - Miguel Sesma
好的,我发现为了使这个工作正常,口味必须以小写字母开头。一旦更改为:trialWearApp和fullWearApp,这些单词就被识别了,但现在我得到了一个错误:模块版本MyApp:myApp:未指定,配置“fullWearApp”声明对未在MyApp:myWearApp:未指定的模块描述符中声明的配置“full”的依赖项。 - Miguel Sesma

1

我看到你已经找到了解决问题的方法,但是这里是我的版本,将构建配置与风味和应用程序后缀组合在一起,以防将来可能需要。对于那些通过谷歌进入此帖子的人来说,这也可能是相关信息。

app/build.gradle:

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'

    signingConfigs {
        debug { ... }
        release { ... }
    }

    defaultConfig {
        applicationId "com.sample.myapp"
        minSdkVersion 14
        targetSdkVersion 23
        versionName "3.0.1"
        versionCode 301
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            embedMicroApp = true
            minifyEnabled false
            debuggable true
        }
        release {
            embedMicroApp = true
            minifyEnabled true
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

    productFlavors {
        trial {
            applicationIdSuffix ".trial"
        }
        full {
            applicationIdSuffix ".pro"
        }
    }
}

configurations {
    trialDebugWearApp
    fullDebugWearApp
    trialReleaseWearApp
    fullReleaseWearApp
}

dependencies {
    ...

    trialDebugWearApp project(path: ':myWearApp', configuration: 'trialDebug')
    fullDebugWearApp project(path: ':myWearApp', configuration: 'fullDebug')
    trialReleaseWearApp project(path: ':myWearApp', configuration: 'trialRelease')
    fullReleaseWearApp project(path: ':myWearApp', configuration: 'fullRelease')
}

wear/build.gradle:

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'

    publishNonDefault true

    signingConfigs {
        debug { ... }
        release { ... }
    }

    defaultConfig {
        applicationId "com.sample.myapp"
        minSdkVersion 20
        targetSdkVersion 23
        versionName "3.0.1"
        versionCode 301
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            minifyEnabled false
            debuggable true
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

    productFlavors {
        trial {
            applicationIdSuffix ".trial"
        }
        full {
            applicationIdSuffix ".pro"
        }
    }

    dependencies {
        ...
    }
}

请问您能解释一下 embedMicroApp = true 的含义吗? - GabrielOshiro
如果将其设置为true,则您的Android Wear应用程序(在依赖项中定义)将包含在给定构建类型或风味的构建中。如果您希望始终嵌入Wear应用程序,请在defaultConfig中设置embedMicroApp = true,并从构建类型和风味中删除它。 - Tormod
实际上,您忘记在wear模块的gradle文件中包含publishNonDefault true。您能否包含它?如果没有这个,gradle会抱怨,我花了大约1个小时来解决这个问题。不过,您的答案应该被接受为更完整的构建类型和风味。 - Jimmy Kane
很抱歉让你浪费时间,我的答案只是一个简化版本,以便更专注于真正的问题。但我现在已经更新了它,使其更完整,更容易复制粘贴。 - Tormod

0
我会在@tormod的回答中补充一些内容,因为他忽略了一些关键点,包括publishNonDefault true

这里有一些示例Gradle文件,用于打包带有口味和构建类型的穿戴模块。

模块移动build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 85
        versionName "2.5.2"
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            embedMicroApp = true
            minifyEnabled false
        }
        release {
            embedMicroApp = true
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            zipAlignEnabled true
        }
    }
    productFlavors {
        free{
            applicationId "com.example.app"
        }
        pro{
            applicationId "com.example.app.pro"
        }
    }
}

configurations {
    freeDebugWearApp
    proDebugWearApp
    freeReleaseWearApp
    proReleaseWearApp
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'

    freeDebugWearApp project(path: ':wear', configuration: 'freeDebug')
    proDebugWearApp project(path: ':wear', configuration: 'proDebug')

    freeReleaseWearApp project(path: ':wear', configuration: 'freeRelease')
    proReleaseWearApp project(path: ':wear', configuration: 'proRelease')
}

模块 Wear build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    publishNonDefault true

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 20
        targetSdkVersion 23
        versionCode 85
        versionName "2.5.2"
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            minifyEnabled false
        }
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            zipAlignEnabled true
        }
    }
    productFlavors {
        free {
            applicationId "com.example.app"
        }
        pro {
            applicationId "com.example.app.pro"
        }
    }
}

dependencies {

    ...

}

不需要复制我的答案,然后再加一行与问题无关的代码。我已按照你的要求更新了我的答案,请删除这个回答。 - Tormod
1
@Tormod,老兄,我从来不抄袭。请自行解决你的问题,别来烦我。你的回答并没有产生你所描述的结果,你也没有修复它,所以我必须为新用户提供答案。就这样吧,接受现实吧。 - Jimmy Kane
1
@Tormod,另外你不应该对那些更完整的答案进行负评。你只应该对那些不正确的答案进行负评。我建议你再次阅读一下SO的规则和FAQ。这不是关于声望,而是关于互相帮助。但我看你的行为有所不同。 - Jimmy Kane
1
我为我的负评道歉,那是我的错误。但这不是关于声望,而是为了保持问题的答案尽可能少而精确,以避免混淆读者(当然,如果没有新内容被提出)。你给了我11分钟来回应你的评论,所以你不能说我没有解决它。我尽快修复了它(第二天)。但再次,对我的反应不佳感到抱歉。 - Tormod
1
@Tormod,没事的,我也没有最清晰的头脑。我们都吸取了教训。感谢你的回答,它帮助了我。继续加油! - Jimmy Kane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接