2017-04-07 4 views
7

위의 메시지로 인해 내 apk 업그레이드가 설치되지 않는 문제가 있습니다.패키지 이름이 같은 기존 패키지와의 충돌

나는 앱이 다른 릴리스 키로 서명 될 때이 메시지가 표시되는 게시물을 읽었습니다.

example post on different keys

. 내 로그에서 가 난 다음 내가 얻을 APK를 업그레이드하려고 같이

04-07 13:28:03.796 2072-2072/? W/InstallAppProgress: Replacing package:com.xxx.rr3 

04-07 13:28:04.326 3675-3845/? W/PackageManager: verifying app can be installed or not 

04-07 13:28:04.378 3675-3845/? W/PackageManager: Package com.xxx.rr3 signatures do not match the previously installed version; ignoring! 

. 기본 응용 프로그램은 4 년 넘게 제작 중이며 이전의 하드 드라이브에 설치된 Eclipse를 사용하여 작성되었습니다.

6 개월 전 내 보스가 나에게 SSD 드라이브를 구입했고 Android Studio를 설치했습니다. 이전 프로젝트를 마이그레이션했는데 제대로 빌드되어 이전 버전이 설치되지 않은 장치에 설치됩니다.

이전 하드 드라이브의 키 저장소를 새로운 SSD에 복사했는데이를 사용하여 Android Studio에서 새 버전의 응용 프로그램에 서명합니다. 그래서 나는 같은 패스워드와 별칭을 가진 하나의 동일한 키 저장소만을 사용했습니다.

Android에서 내 업그레이드가 다른 키로 서명되었다고 말하는 이유는 누구에게 말해 줄 수 있습니까?

는 [갱신 1]

I 모두 신구 APK 대한 CERT.RSA을 추출했다. 둘 다 동일한 키 저장소와 키를 사용하지만 잘못된 릴리스 별칭을 사용하고있는 것으로 나타났습니다. 아래는 두 APK의 지문이며, 맨 위는 오래된 것, 새것은 맨 아래입니다. '서명 생성 APK'를 클릭하면

C:\OpenSSL-Win64\bin>keytool -printcert -file CERT.RSA 
Owner: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire 
Issuer: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire 
Serial number: 6144ad2c 
Valid from: Fri Jan 11 08:55:29 GMT 2013 until: Thu May 14 09:55:29 BST 3012 
Certificate fingerprints: 
     MD5: 50:63:5E:54:9D:D3:C4:71:A9:4E:3C:F4:27:9E:50:CA 
     SHA1: 7C:2C:DB:7E:92:D2:01:46:43:8D:D2:B9:A4:D2:B0:F4:85:E7:16:D9 
     SHA256: 38:64:89:4D:A2:37:72:AA:CE:90:5E:34:46:B9:D0:A4:CA:18:B7:07:7A:E2:DB:1D:7C:60:CD:70:F6:77:C5:FF 
     Signature algorithm name: SHA256withRSA 
     Version: 3 

Extensions: 

#1: ObjectId: 2.5.29.14 Criticality=false 
SubjectKeyIdentifier [ 
KeyIdentifier [ 
0000: 3F 95 E8 FA 36 5B 26 07 33 72 8B 09 37 0C 18 C5 ?...6[&.3r..7... 
0010: 3B 5A 19 42          ;Z.B 
] 
] 


C:\OpenSSL-Win64\bin>keytool -list -keystore .keystore 
keytool error: java.lang.Exception: Keystore file does not exist: .keystore 

C:\OpenSSL-Win64\bin>keytool -printcert -file CERT.RSA 
Owner: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire 
Issuer: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire 
Serial number: 6144ad2c 
Valid from: Fri Jan 11 08:55:29 GMT 2013 until: Thu May 14 09:55:29 BST 3012 
Certificate fingerprints: 
     MD5: 50:63:5E:54:9D:D3:C4:71:A9:4E:3C:F4:27:9E:50:CA 
     SHA1: 7C:2C:DB:7E:92:D2:01:46:43:8D:D2:B9:A4:D2:B0:F4:85:E7:16:D9 
     SHA256: 38:64:89:4D:A2:37:72:AA:CE:90:5E:34:46:B9:D0:A4:CA:18:B7:07:7A:E2:DB:1D:7C:60:CD:70:F6:77:C5:FF 
     Signature algorithm name: SHA256withRSA 
     Version: 3 

나는 올바른 releasealias를 지정되었지만 오류가 다른 불구하고 여전히있다.

같은 이름

하여 기존 패키지와 패키지 충돌합니다. 나는 다음과 같은 링크를 사용하여 수동으로 새 APK를 구축하는 것을 시도했다 :

link

C:\Users\mattheww\StudioProjects\nfcscanner3>gradlew assembleRelease 
Downloading https://services.gradle.org/distributions/gradle-2.14.1-all.zip 


Unzipping C:\Users\mattheww\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv\gradle-2.14.1-all.zip to C:\Users\mattheww\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv 

FAILURE: Build failed with an exception. 

* Where: 
Build file 'C:\Users\mattheww\StudioProjects\nfcscanner3\app\build.gradle' line: 1 

* What went wrong: 
A problem occurred evaluating project ':app'. 
> java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Total time: 29.982 secs 

합니다.

두 앱에서 키 저장소와 지문이 일치하는 경우 누구나 새로운 앱이 업그레이드되지 않는 이유를 설명 할 수 있습니까?

[업데이트 2] 난 그냥 안드로이드 스튜디오에 이클립스 프로젝트를 가져올 때, 제대로 구축하지 않을 것을 기억 한

. Appication Object에 문제가 있습니다. 내 응용 프로그램 개체는 NfcScannerApplication이라고하며 동일한 이름 (매니페스트에도 설명되어 있음)으로 구현 된 클래스가 있습니다.

일단 Android Studio로 가져 와서 장치에 빌드하고 푸시하면 Android는 Application 클래스를 찾을 수 없다고 말했습니다. 그래서 문제를 해결하는 것 같은 다음 코드를 사용했습니다.

public static NfcScannerApplication getRealApplication (Context applicationContext) 
    { 
     Log.e(TAG, "inside NfcScannerApplication getRealApplication"); 
     NfcScannerApplication application = null; 

     if (applicationContext instanceof NfcScannerApplication) 
     { 
      application = (NfcScannerApplication) applicationContext; 
     } 
     else 
     { 
      Application realApplication = null; 
      Field magicField = null; 
      try 
      { 
       magicField = applicationContext.getClass().getDeclaredField("realApplication"); 
       magicField.setAccessible(true); 
       realApplication = (Application) magicField.get(applicationContext); 
      } 
      catch (NoSuchFieldException e) 
      { 
       Log.e(TAG, e.getMessage()); 
      } 
      catch (IllegalAccessException e) 
      { 
       Log.e(TAG, e.getMessage()); 
      } 

      application = (NfcScannerApplication) realApplication; 
     } 

     return application; 
    } 



    // the above method is commented out and this is used 
    //because the migration process from Eclipse to Android 
    //needed it. see below 
    //https://stackoverflow.com/questions/36495954/bootstrapapplication-cannot-be-cast-to-applicationclass 

응용 프로그램 클래스를 가져 오기 위해 리플렉션을 사용합니다. 이것이 내가 동일한 키 저장소 등을 사용하더라도 Android가 동일한 이름의 장치에 다른 앱을 있다고 생각하는 이유 일 수 있습니까?

[업데이트 3] 나는이 문제를 발견 한 것 같습니다. :) 나는 응용 프로그램이 처음로드 될 때 응용 프로그램 컨텍스트를 가져 오는 ContentProvider 있습니다. getContext를 호출하고이를 내 Application 클래스로 캐스팅합니다.

지금은 getContext.getApplicationContext()를 호출하면 제대로 작동합니다. 아래 코드는 내가 지금 사용하고 이전 코드는 위와 같이 주석 처리했다. 플레이 스토어의이 키 스토어가 원래 키가 아닌 말은 당신의 APK를 거부 할 경우

//old code 
//Context context = getContext(); 
     //nfcAppObj = (NfcScannerApplication) getContext(); 


//new code 
     Context applicationContext = getContext().getApplicationContext(); 
     nfcAppObj = getRealApplication(applicationContext); 
+0

당신은 키 스토어가 올바른지 확인입니까? 만약 당신이 shomehow 귀하의 키 스토어가 curropted 생각 확실 해요. 이 링크를 씹을 수 있습니다. http : // stackoverflow.com/questions/13535424/android-keystore-stopped-working – savepopulation

+0

@turtleboy Android Studio에서 릴리스 또는 디버그 모드로 빌드에 서명 하시겠습니까? –

+0

@savepopulation 안녕하세요, 저는 5 년 전에 내 서버에 원래 키 저장소의 사본을 저장했습니다. 오늘은 키 스토어를 다운로드하고 Android Studio를 가리켰습니다. 불행히도 나는 여전히 같은 메시지를 얻는다. 그래서 키 저장소의 로컬 사본이 손상된 것 같지 않습니다. – turtleboy

답변

0

이전 apk를 사용하는 경우이 인증서를 사용하여 서명에 사용 된 인증서의 세부 정보를 얻을 수 있습니다. (APK에에서 CERT.RSA 파일, IT-을 -unziping 그 파일에있는 OpenSSL aplication를 실행 압축을 풉니 다.)

unzip -p App.apk META-INF/CERT.RSA |openssl pkcs7 -inform DER -noout -print_certs -text 

그런 다음 키 저장소에서 인증서를 나열하는 (즉, 자바와 함께 제공) 키 도구를 사용, 당신이 성냥을 찾았는지, 또는 당신이 맞다고 생각하는 증명서가 정말로 맞는지보십시오. 참고로

:

Getting certificate details from an apk

How do I find out which keystore was used to sign an app?

+0

안녕하세요, 질문이 업데이트되었습니다. – turtleboy

0

베타 또는 알파 섹션에서 Play 스토어에 서명 된 APK를 게시합니다.

플레이 스토어에서 apk를 수락하면 설치된 apk를 플레이 스토어에서 업데이트 해보세요. 앱이 Play 스토어에없는 경우

당신이 장치에서 이전 APK를 당겨 당신이 특별한 무언가를하지 않는 한 APK How do I find out which keystore was used to sign an app?

+0

우리는 APK가 서버 응용 프로그램에 종속되어 있고 300 명의 고객 중 일부가 다른 버전의 서버 응용 프로그램에있을 수 있으므로 Play 스토어를 사용하지 않습니다. 그래서 개인용 서버에 apk를 호스팅하기로 결정 했으므로 일단 서버 앱 업그레이드가 완료되면 회사의 전화가 업그레이드되도록 제어 할 수 있습니다. – turtleboy

+0

에뮬레이터에서 APK를 가져 와서 apks를 모두 확인하십시오. SHA1 – amorenew

+0

답변을 업데이트했습니다. – amorenew

0

의 SHA1를 얻기 위해 모두의 APK에게

을 서명 SHA1을 비교할 수 있습니다 때 Android Studio에서 '재생'버튼을 클릭하면 앱에 서명 할 수있는 임시 AS 특정 디버그 키가 사용 된 다음 기기에 설치됩니다.

Eclipse는 매우 유사한 작업을 수행했습니다.

것은 당신이 안드로이드 스튜디오를 사용하는 방법에 대해 얘기하면 것은 "APK를 서명 생성"다음 디버그 단계를 수행하십시오 :

  • 수동 ADB 통해 APK를 설치, 오류가 계속 발생하는지 확인.
  • 직접 gradle을 통해 apk에 로그인하여 오류가 계속 발생하는지 확인하십시오.

이 두 단계가 모두 작동하지 않으면 이전에 사용하던 동일한 키를 사용하지 않는다고 가정하는 것이 합리적이라고 생각합니다.

+1

안녕하세요, 질문이 업데이트되었습니다. – turtleboy