Создаю ли я «выпуск» APK:
- Используйте Генерировать подписанный APK в Android Studio
- Выберите вариант сборки Release и используйте Tools -> Build APK.
- Запустите задачу assembleRelease
... произведенный APK всегда имеет debuggable=true, что я подтвердил, попытавшись загрузить их в Google Play, в котором говорится:
«Ошибка загрузки. Вы загрузили отлаживаемый APK. По соображениям безопасности вам необходимо отключить отладку, прежде чем его можно будет опубликовать в Google Play».
В (единственном) манифесте не указан атрибут отладки. Gradle указывает debuggable=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 обратно в Android Studio с помощью анализатора APK, который упрощает просмотр манифеста, и все они включают... debuggable=true. Откуда это?
Обновление 3: assembleRelease создает отлаживаемый APK как на моем локальном компьютере, так и на сервере CI (BuddyBuild).
Обновление 4: чистая перестройка (включая удаление папок сборки) и перезапуск Android Studio с очищенными кэшами не имеет значения.
Обновление 5. Кажется разумным предположить, что состояние debuggable=true может исходить от одной из зависимостей, но если это так, то какую и как это можно переопределить?
copyReleaseApk
? - person petey   schedule 21.06.2017aapt
, сообщает ли он также, что APK можно отлаживать? - person CommonsWare   schedule 22.06.2017aapt
говорит, что APK является отлаживаемым, то это может означать, что Gradle делает ваше приложение отлаживаемым, и я не понимаю, почему. Еслиaapt
говорит, что ваше приложение недоступно для отладки, вероятно, ваша проблема связана с Play Store. - person CommonsWare   schedule 22.06.2017release
сборки не подлежат отладке, а затем начните добавлять вещи, пока состояние не изменится. - person CommonsWare   schedule 22.06.2017