React Native의 Android 앱 번들 : 일부 파일에 대한 서명 정보가 유효하지 않거나 누락 된 APK 또는 Android 앱 번들을 업로드했습니다.


10

앱을 Google Play 스토어에 처음으로 게시하려고합니다. Google Play 서명을 선택했습니다. 다른 키를 사용하여 업로드 할 때 콘솔에서 특정 SHA1 식별자가있는 다른 키를 사용하여 업로드하라는 메시지가 표시되므로 올바른 키로 Android 앱 번들에 서명한다는 사실을 알고 있습니다. 그러나 올바른 키로 업로드하면 다음 오류가 발생합니다.

일부 파일에 대한 서명 정보가 유효하지 않거나 누락 된 APK 또는 Android 앱 번들을 업로드했습니다.

빌드> 서명 된 번들 / APK 생성> Android 앱 번들> 키 저장소 선택 및 비밀번호 입력> 릴리스> 완료와 같이 Android Studio를 사용하여 앱을 빌드하고 있습니다.

이 앱은 분리 된 Expo / ExpoKit으로 빌드 된 React Native 앱입니다. Apple App Store에 업로드하면 제대로 작동하지만 Play 스토어에 문제가 있습니다. 내가 무엇을 놓치고 있습니까?

업데이트 1 : 이제 Google Play에서 앱을 완전히 삭제하고 새 앱을 만들었습니다. 이번에는 Google Play Signing을 선택 하지 않고 서명 된 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

나에게는 이것이 퍼즐의 중요한 부분 인 것 같습니다. 그러나 지금까지이 오류와 관련된 유용한 정보를 찾을 수 없습니다.


android / app / build.gradlew를 보여줄 수 있습니까?
André Pinto

@ AndréPinto 질문에 추가했습니다. defaultConfig에서 applicationId를 검열했습니다.
막시밀리안 크라우스

답변:


0

APK 또는 AAB를 만들 때 반드시 키 별칭으로 업로드를 선택하십시오 (참조 사진 참조).

여기에 이미지 설명을 입력하십시오


0

당신이 찾고있는 대답은 아니지만 Android Studio를 사용하는 대신 명령 줄을 사용하여 키 저장소를 생성하려고 시도했습니다.

이것이 작동하지 않으면 지난 몇 주 동안 저를 슬프게 만든 모듈, 특히 엑스포를 살펴보기 시작했습니다.

Android 게시에 대한 기본 가이드를 반응


0

원래 문제에 대한 해결책은 아니지만 ExpoKit에 대한 환기가 더 많이 있지만 여기에서 내 자신의 질문에 대답하려고합니다.

이제 앱에서 ExpoKit을 완전히 제거했습니다. 우리는 이미 Expo에서 지원하지 않는 WebRTC와 같은 다른 기본 기능이 필요했기 때문에 관리되는 Expo 워크 플로우에서 ExpoKit으로 배출했습니다. 그러나 정직 여기에, 우리는 아마로 배출해야 베어 반 최적의 ExpoKit 대신 기본 반응.

관리되는 워크 플로를 이용할 수 있다면 그렇게하십시오! 확실히 물건을 더 쉽게 만듭니다. 그러나 지원되지 않는 다른 기본 기능이 필요한 경우 쉽게 수행 할 수있는 한 자신에게 유리한 입장을 취하고 베어 RN으로 돌아가십시오.

엑스포 키트 에서 베어 RN으로 이동하는 것은 그다지 매력적이지 않기 때문입니다. 완전히 새로운 RN 프로젝트를 시작하고 JavaScript를 복사하고 모듈을 하나씩 다시 설치하고 몇 가지 기본 문제 등을 수정했습니다. 앱을 다시 실행하기 위해 이틀간의 작업이 필요했습니다.

그러나 모든 작업이 끝나면 ExpoKit없이 동일한 앱을 사용합니다.

장점 :

  • 앱을 Google Play에 업로드하면 마침내 작동합니다.
  • 앱 다운로드 크기를 70 % 이상 줄였습니다 (!)
  • RN 0.60을 통한 자동 링크의 용이성 (ExpoKit에서 최신 SDK로 iirc도 지원하지만 Expo SDK 업데이트는 종종 과학 자체 임)
  • 우리는 실제로 유니 모듈을 통해 expo-secure-store와 같이 사랑하는 Expo 모듈을 사용할 수 있습니다.
  • 위약 일지 모르지만 앱의 성능도 향상 된 것 같습니다.
  • 출시 앱 빌드 시간은 iOS에서 약 50 %, 안드로이드에서 60 % 증가
  • 앱 실행 속도가 빠른 것 같습니다. 이전에 iPhone 11 Pro를 실행하는 데 약 2 ~ 3 초가 걸렸지 만 이제는 밀리 초입니다.

단점 : 지금까지 찾지 못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.