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

时间:2017-06-21 16:06:25

标签: android android-studio android-signing

我是否创建"发布" APK by:

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

...制作的APK总是有debuggable = true,我已经通过尝试将它们上传到Google Play来确认:

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

(仅)清单没有指定debuggable属性。 Gradle指定releasegable = false表示发布,true表示调试,参见下文。

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

应用程序/的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:我尝试在清单中添加debuggable = false,但没有区别,制作的APK仍然无法上传到Google Play。

更新2:我使用APK分析器将APK加载回Android Studio,以便轻松查看清单,并且它们都包含.... debuggable = true。它来自哪里?

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

更新4:清理重建(包括删除构建文件夹)并重新启动Android Studio及其缓存已无效。

更新5:假设debuggable = true状态可能来自其中一个依赖项似乎是合理的,但是如果是这样的话,那怎么能被覆盖呢?

2 个答案:

答案 0 :(得分:3)

由于该项目针对的是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工件并且可以上传到Google Play。

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

更新:工具团队的响应是这是预期的行为,因为该应用程序的目标是API 26并且处于预览状态。我认为26个API是最终的,APK可以针对它构建并发布到Google Play但显然不是。

答案 1 :(得分:0)

这是因为您可能有增量构建,默认情况下,所有增量构建都假定为debuggable

General Notes of the SDK Tools Revision 8下,它声明:

  

支持真正的调试版本。开发人员不再需要添加   android:debuggable属性到清单中的标签    - 构建工具自动添加属性。在Eclipse / ADT中,全部   假设增量构建是调试构建,因此插入工具   机器人:可调试="真&#34 ;.导出已签名的发布版本时,   工具不添加属性。在Ant中,一个ant调试命令   自动插入android:debuggable =" true"属性,而   蚂蚁释放没有。如果android:debuggable =" true"手动设置,   那么ant release实际上会进行调试构建,而不是发布   建立。