android - 为什么发布版本变体总是可调试的?

标签 android android-studio android-signing

我是否通过以下方式创建“发布”APK:

  • 在 Android Studio 中使用生成签名 APK
  • 选择“发布”构建变体并使用“工具”->“构建 APK”
  • 运行 assembleRelease 任务

...生成的 APK 始终具有 debuggable=true,我已通过尝试将它们上传到 Google Play 来确认这一点,其中显示:

“上传失败。您上传了可调试的 APK。出于安全原因,您需要先禁用调试,然后才能在 Google Play 中发布该 APK。”

(唯一的) list 没有指定可调试属性。 Gradle 为发布指定 debuggable=false,为调试指定 true,请参见下文。

我错过了什么?可调试状态从何而来,为什么发布构建类型声明中的 debuggable=false 被忽略?我不想将 debuggable=false 添加到 list 中,并且必须手动启用/禁用它。

应用程序/build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.0'
    defaultConfig {
        applicationId "com.myapp.android"
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 5
        versionName 5
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            storeFile rootProject.file("keystore.jks")
            if (storeFile.exists()) {
                def config = new Properties()
                config.load(new FileInputStream(rootProject.file("keystore.passwords")))
                storePassword config.KeystorePassword
                keyAlias config.KeyAlias
                keyPassword config.KeyPassword
            }
        }
    }

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

    dataBinding {
        enabled = true
    }

    lintOptions {
        disable 'RtlHardcoded'
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    // Copy release APK to project root
    task copyReleaseApk(type: Copy) {
        from 'build/outputs/apk'
        into '..'
        include '**/*release.apk'
    }

    afterEvaluate {
        if (tasks.findByPath("packageRelease") == null) {tasks.create("packageRelease")}
        tasks.findByPath("packageRelease").finalizedBy(copyReleaseApk)
    }

}

ext {
    // Single place to specify the support library version
    supportLibraryVersion = '26.0.0-beta2'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.google.code.findbugs'
        exclude module: 'espresso-idling-resource'
        exclude group: "javax.inject"
    })
    implementation 'com.android.support.test.espresso:espresso-contrib:2.2.2'

    // Dagger dependency injection
    implementation 'com.google.dagger:dagger:2.10'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.10'
    implementation 'com.google.dagger:dagger-android:2.10'
    implementation 'com.google.dagger:dagger-android-support:2.10'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.10'

    implementation "com.android.support:appcompat-v7:$supportLibraryVersion"
    implementation "com.android.support:design:$supportLibraryVersion"
    implementation "com.android.support.constraint:constraint-layout:1.0.2"

    implementation "com.jakewharton.timber:timber:4.5.1"
    implementation "com.squareup.phrase:phrase:1.1.0"
    implementation "com.squareup.retrofit2:retrofit:2.2.0"
    implementation "com.squareup.retrofit2:converter-gson:2.2.0"
    implementation "com.squareup.okhttp3:logging-interceptor:3.7.0"
    implementation 'net.danlew:android.joda:2.9.9'

    testImplementation 'junit:junit:4.12'
    implementation 'com.google.firebase:firebase-crash:11.0.0'
    androidTestImplementation 'junit:junit:4.12'
}

apply plugin: 'com.google.gms.google-services'

更新1:我尝试在 list 中添加 debuggable=false ,但没​​有什么区别,生成的 APK 仍然无法上传到 Google Play。

更新 2:我使用 APK 分析器将 APK 加载回 Android Studio,这样可以轻松查看 list ,并且它们都包括...... debuggable=true。它从哪里来?

更新 3:assembleRelease 在我的本地计算机和 CI 服务器 (BuddyBuild) 上生成可调试的 APK。

更新 4:彻底重建(包括删除构建文件夹)并在清除缓存的情况下重新启动 Android Studio 没有任何区别。

更新 5:假设 debuggable=true 状态可能来自其中一个依赖项似乎是合理的,但如果是这种情况,以及如何覆盖它?

最佳答案

由于该项目面向 API 26 并使用 android gradle 插件 3.0.0-alpha4、26.0.0-beta2 构建工具和 gradle 4.0-rc1,我认为我应该检查该问题是否与问题无关使用这些预发布工具。所以我恢复到 API 25 以及 gradle 3.3、gradle 插件 2.3.3 和构建工具 25.0.3 的稳定版本。这有点乏味,因为我必须将所有 Java 8 语法从源代码降级到 Java 7。但是完成此操作后,构建过程现在可以按预期工作,并生成不包含 debuggable="true"标志的发布 APK Artifact 并可以上传到 Google Play。 👍

我不清楚具体原因在哪里,但我已将其记录在 Android 工具错误跟踪器中,因为它似乎可能是一个错误: https://issuetracker.google.com/issues/62899843

更新:工具团队的回应是,这是预期行为,因为该应用程序面向 API 26 并且处于预览状态。我认为由于 26 个 API 是最终版本,因此可以根据它构建 APK 并将其发布到 Google Play,但显然不是。

关于android - 为什么发布版本变体总是可调试的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44681167/

相关文章:

git - Android Studio 项目的 .gitignore 中应该包含什么?

android - 权限拒绝 : opening provider com. android.providers.contacts.ContactsProvider2

android - Asynctask 在调试版本中正确执行,但在发布版本(已签名的 apk)中无法更新 UI

android - 无法在Samsung设备中播放mp3文件,但可以在其他Android设备上播放

android - AVDMANAGER -> 错误 : Invalid --tag default for the selected package

android-studio - 当我在设备上运行Flutter App时出现错误

java - 发布/调试 APK 上是否提供签名配置信息

android - 如何修复 Android 中的应用程序未安装错误

android - 使用 Visual Studio 进行跨平台移动应用程序开发的缺点

java - Android SQLite 无法从 Cursorwindow 读取行...