Я пытаюсь впервые опубликовать приложение в магазине Google Play. Я выбрал подписку в Google Play. Я точно знаю, что я подписываю комплект приложений Android правильным ключом, поскольку, когда я загружаю с помощью другого ключа, консоль скажет мне загрузить с помощью другого ключа с определенным идентификатором SHA1. Однако, когда я делаю загрузку с правильным ключом, я получаю эту ошибку:
Вы загрузили пакет APK или приложений для Android с недействительной или отсутствующей информацией для подписи некоторых его файлов.
Я создаю приложение с помощью Android Studio следующим образом: Build> Generate Signed Bundle / APK> Android App Bundle> Выбор хранилища ключей и ввод пароля> release> Finish
Приложение представляет собой приложение React Native, созданное отдельно от Expo / ExpoKit. Загрузка в Apple App Store работает нормально, у меня проблемы только с Play Store. Что мне не хватает?
Обновление 1 : теперь я полностью удалил приложение из Google Play и создал новое. Разве не выбрать в Google Play подписывающейся на этот раз и загрузил подписанный APK. Все та же ошибка.
Обновление 2 : Попробовал с совершенно новым хранилищем ключей и ключом. Все такой же.
Вот краткий обзор настроек проекта, если это как-то важно:
И вот android/app/build.gradle
:
buildscript {
repositories {
google()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.26.1'
}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'devicefarm'
repositories {
maven { url 'https://maven.fabric.io/public' }
}
def safeExtGet(prop, fallback) {
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}
android {
compileSdkVersion safeExtGet("compileSdkVersion", 28)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
applicationId 'de.***.android'
minSdkVersion safeExtGet("minSdkVersion", 21)
targetSdkVersion safeExtGet("targetSdkVersion", 28)
versionCode 1
versionName '1.0.2'
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// Deprecated. Used by net.openid:appauth
manifestPlaceholders = [
'appAuthRedirectScheme': 'host.exp.exponent'
]
}
dexOptions {
javaMaxHeapSize System.getenv("DISABLE_DEX_MAX_HEAP") ? null : "8g"
}
signingConfigs {
debug {
storeFile file('../debug.keystore')
}
release {
storeFile file(System.getenv("ANDROID_KEYSTORE_PATH") ?: "release-key.jks")
storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD")
keyAlias System.getenv("ANDROID_KEY_ALIAS")
keyPassword System.getenv("ANDROID_KEY_PASSWORD")
}
}
buildTypes {
debug {
debuggable true
ext.enableCrashlytics = false
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
lintOptions {
abortOnError false
}
packagingOptions {
pickFirst "**"
}
}
devicefarm {
projectName System.getenv("DEVICEFARM_PROJECT_NAME")
devicePool System.getenv("DEVICEFARM_DEVICE_POOL")
executionTimeoutMinutes 40
authentication {
accessKey System.getenv("AWS_ACCESS_KEY_ID")
secretKey System.getenv("AWS_SECRET_ACCESS_KEY")
}
}
configurations.all {
resolutionStrategy {
force 'org.webkit:android-jsc:r245459'
}
}
// WHEN_PREPARING_SHELL_REMOVE_FROM_HERE
apply from: 'expo.gradle'
// WHEN_PREPARING_SHELL_REMOVE_TO_HERE
apply from: "../../node_modules/react-native-unimodules/gradle.groovy"
dependencies {
implementation project(':react-native-torch')
implementation project(':react-native-twilio-video-webrtc')
implementation project(':react-native-exit-app')
implementation project(':react-native-fs')
implementation project(':react-native-document-picker')
implementation project(':rn-fetch-blob')
implementation project(':react-native-onesignal')
implementation project(':react-native-vector-icons')
implementation project(':react-native-randombytes')
implementation fileTree(dir: 'libs', include: ['*.jar'])
compile project(':tipsi-stripe')
implementation 'com.android.support:multidex:1.0.1'
// Our dependencies
implementation "com.android.support:appcompat-v7:$supportLibVersion"
// Our dependencies from ExpoView
// DON'T ADD ANYTHING HERE THAT ISN'T IN EXPOVIEW. ONLY COPY THINGS FROM EXPOVIEW TO HERE.
implementation "com.android.support:appcompat-v7:$supportLibVersion"
implementation 'com.facebook.android:facebook-android-sdk:5.0.1'
implementation('com.facebook.android:audience-network-sdk:5.1.1') {
exclude module: 'play-services-ads'
}
compileOnly 'org.glassfish:javax.annotation:3.1.1'
implementation 'com.jakewharton:butterknife:9.0.0'
implementation 'de.greenrobot:eventbus:2.4.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'com.google.android.gms:play-services-gcm:15.0.1'
implementation 'com.google.android.gms:play-services-analytics:16.0.1'
implementation 'com.google.android.gms:play-services-maps:15.0.1'
implementation 'com.google.android.gms:play-services-auth:15.0.1'
implementation 'com.google.android.gms:play-services-location:15.0.1'
implementation 'com.google.android.gms:play-services-ads:15.0.1'
//annotationProcessor 'com.raizlabs.android:DBFlow-Compiler:2.2.1'
//implementation "com.raizlabs.android:DBFlow-Core:2.2.1"
//implementation "com.raizlabs.android:DBFlow:2.2.1"
implementation "com.madgag.spongycastle:core:1.53.0.0"
implementation "com.madgag.spongycastle:prov:1.53.0.0"
debugImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
// debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.4-beta1'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
implementation 'com.facebook.device.yearclass:yearclass:2.1.0'
implementation 'commons-io:commons-io:1.4'
implementation 'me.leolin:ShortcutBadger:1.1.4@aar'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0'
implementation 'commons-codec:commons-codec:1.10'
implementation 'com.segment.analytics.android:analytics:4.3.0'
implementation 'com.google.zxing:core:3.3.3'
implementation 'net.openid:appauth:0.4.1'
implementation 'com.airbnb.android:lottie:2.5.6'
implementation('io.nlopez.smartlocation:library:3.2.11') {
transitive = false
}
implementation "com.android.support:exifinterface:${safeExtGet("supportLibVersion", "28.0.0")}"
implementation 'com.squareup.okio:okio:1.9.0'
implementation 'com.facebook.soloader:soloader:0.6.0'
// expo-file-system
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.10.0'
// Testing
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
// We use a modified build of com.android.support.test:runner:1.0.1. Explanation in maven-test/README
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation "com.android.support:support-annotations:${safeExtGet("supportLibVersion", "28.0.0")}"
androidTestImplementation 'com.google.code.findbugs:jsr305:3.0.0'
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
androidTestImplementation 'com.azimolabs.conditionwatcher:conditionwatcher:0.2'
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:1.10.19'
testImplementation 'org.robolectric:robolectric:3.8'
testImplementation 'com.android.support.test:runner:1.0.2-alpha1'
testImplementation 'com.android.support.test:rules:1.0.2-alpha1'
implementation('host.exp.exponent:expoview:35.0.0@aar') {
transitive = true
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
exclude group: 'com.squareup.okhttp3', module: 'okhttp-urlconnection'
}
api 'org.webkit:android-jsc:r245459' // needs to be before react-native
api 'com.facebook.react:react-native:35.0.0'
addUnimodulesDependencies([
modulesPaths : [
'../../node_modules'
],
configuration: 'api',
target : 'react-native',
exclude : [
// You can exclude unneeded modules here.
// By default we exclude FaceDetector
// and Stripe payments APIs.
'unimodules-face-detector-interface',
'expo-face-detector',
'expo-payments-stripe'
// Adding a name here will also remove the package
// from auto-generated BasePackageList.java
]
])
}
// This has to be down here for some reason
apply plugin: 'com.google.gms.google-services'
googleServices {
disableVersionCheck = true
}
Обновление 3 : я создал подписанный APK сейчас и попытался проверить его подпись с помощью jarsigner:
jarsigner -verify -verbose -certs /***/app-release.apk
Эта команда выдает следующую ошибку:
jarsigner: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
Мне кажется, что это может быть важной частью головоломки. Однако я не смог найти никакой полезной информации об этой ошибке.
источник
Ответы:
Пожалуйста, не забудьте выбрать загрузку в качестве псевдонима ключа при создании APK или AAB, см. Рисунок для справки.
источник
Возможно, это не тот ответ, который вы ищете, но вы пытались использовать командную строку для создания хранилищ ключей, в отличие от использования Android Studio.
Если это не сработает, то я начну изучать модули, особенно выставочные, так как они вызвали у меня некоторое горе в последние недели.
Реагируйте с родным руководством по публикации для Android
источник
Собираюсь ответить на мой собственный вопрос здесь, хотя это и не совсем решение исходной проблемы, а еще немного о ExpoKit.
Теперь я полностью удалил ExpoKit из нашего приложения. Ранее мы извлекли из управляемого рабочего процесса Expo в ExpoKit, так как нам были нужны другие, встроенные функции, такие как WebRTC, которые еще не поддерживались Expo. Однако, чтобы быть полностью честным здесь, мы, вероятно, должны были обнажить Реагировать Native вместо пола-оптимального ExpoKit.
Если вы можете использовать управляемый рабочий процесс, хорошо, сделайте это! Определенно делает некоторые вещи проще. Однако, если вам нужны другие, неподдерживаемые встроенные функции, сделайте себе одолжение и вернитесь к голой RN, если вы можете сделать это легко.
Потому что, идя от Экспо Кит к голой RN - это не очарование. Пришлось инициировать целый новый проект RN, скопировать JavaScript, переустановить модули один за другим, исправить некоторые собственные проблемы и т. Д. И т. Д. - два дня работы только для того, чтобы снова запустить приложение.
Однако, после всей этой работы, теперь мы стоим с тем же приложением, только без ExpoKit.
Плюсы:
Минусы: не смог найти пока.
источник