calabash / calabash-android

Automated Functional testing for Android using cucumber
Other
1.68k stars 617 forks source link

Calabash-android resign with signature scheme v2 #951

Open abeljus opened 2 years ago

abeljus commented 2 years ago

I'm trying to install and run a debug APK with Calabash-android, but it is failing because the scheme of the signature.

My original APK is signed with the debug keystore using scheme v2 (signed when building it via gradle):

$ apksigner verify -v myapp.apk
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true

However, it cannot be used as it is with calabash-android (getting error No signature files found in META-INF. Cannot proceed.), so I need to resign it with calabash:

$ calabash-android resign myapp.apk

Signing process seems to work fine, but when I try to install the just signed APK I'm getting this error:

adb: failed to install /Users/acampos/myapp.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package com.myapp]

When trying to verify the signature of the new APK, this is the result:

$ apksigner verify -v myapp.apk
DOES NOT VERIFY
ERROR: Target SDK version 30 requires a minimum of signature scheme v2; the APK is not signed with this or a later signature scheme
...

It seems that the latest Android versions need scheme v2 for the signatures, but calabash resign action is still using v1.

I have already tried creating a new debug.keystore, changing to different versions (ruby, calabash-android, etc.),..., but no success.

Any idea about how to make calabash sign the APK using scheme v2?

Thank you!

olbartek commented 1 year ago

I was able to get around this by using apksigner instead of calabash-android for signing the app. Instead of resigning the app with calabash-android resign myapp.apk you can try to do the following:

Just make sure that you're signing the app with the same keystore that is being used to sign the test server.