Сгенерированный APK не подписан, если выбрана подпись v2

Я пытаюсь создать подписанный APK для своего приложения, и он работает, если я использую только подпись V1. Когда я использую подпись V2, а затем проверяю apk с помощью keytool, вывод:

keytool -list -printcert -jarfile app-release.apk
Not a signed jar file

Вот build.gradle:

def getProps(path) {
    Properties props = new Properties()
    props.load(project.rootProject.file(path).newDataInputStream())
    return props
}

android {
    ...
    signingConfigs {
        debug {
            try {
                Properties props = getProps('./local.properties')
                storeFile file(props.getProperty('DEBUG_STORE_FILE', ''))
                keyAlias props.getProperty('DEBUG_KEY_ALIAS', '')
                keyPassword props.getProperty('DEBUG_STORE_PASSWORD', '')
                storePassword props.getProperty('DEBUG_STORE_PASSWORD', '')
                v1SigningEnabled true
                v2SigningEnabled false // enabling this generates unsigned apk
            }
            catch (ex) {
                throw new InvalidUserDataException("You should define RELEASE_STORE_FILE, RELEASE_KEY_ALIAS, RELEASE_STORE_PASSWORD in local.properties.")
            }
        }
        release {
            try {
                Properties props = getProps('./local.properties')
                storeFile file(props.getProperty('RELEASE_STORE_FILE', ''))
                keyAlias props.getProperty('RELEASE_KEY_ALIAS', '')
                keyPassword props.getProperty('RELEASE_STORE_PASSWORD', '')
                storePassword props.getProperty('RELEASE_STORE_PASSWORD', '')
                v1SigningEnabled true
                v2SigningEnabled false // enabling this generates unsigned apk
            }
            catch (ex) {
                throw new InvalidUserDataException("You should define RELEASE_STORE_FILE, RELEASE_KEY_ALIAS, RELEASE_STORE_PASSWORD in local.properties.")
            }
        }
    }

    defaultConfig {
        ...
        // Only productionRelease flavour uses signingConfigs.release;
        // other flavours(i.e. productionDebug, developmentDebug, developmentRelease)
        // use signingConfigs.debug
        // https://stackoverflow.com/questions/30898611/gradle-signing-flavors-with-different-keys-on-android
        signingConfig signingConfigs.release
    }
    buildTypes {
        release {
            ...
        }
        debug {
            ...
            signingConfig signingConfigs.debug
        }
    }
    // Dimensions: environment can be one of [development, production]
    flavorDimensions "environment"
    productFlavors {
        development {
            ...
            signingConfig signingConfigs.debug
            ...
        }
        production {
            dimension "environment"
        }
    }
    ...
}

Я также создал новый проект Android с нуля, и у него такая же проблема.

Обратите внимание, что у меня есть еще один проект Android, который может создать подписанный APK, выбрав как V1, так и V2.

Почему добавление подписи V2 приводит к созданию неподписанного APK?


person garrik    schedule 15.11.2019    source источник
comment
какова ваша minSdkVersion?   -  person Euporie    schedule 03.03.2020
comment
minSdkVersion 24, targetSdkVersion 27, compileSdkVersion 28   -  person garrik    schedule 05.03.2020
comment
Кстати, на сегодняшний день я не могу воспроизвести проблему с Android Studio 3.5.3 в Windows. Я думаю, что использовал Android Studio 3.5.2, когда столкнулся с этим.   -  person garrik    schedule 05.03.2020
comment
Я столкнулся с этим в Android Studio 3.6.1, см. мой пост позже   -  person Euporie    schedule 09.03.2020


Ответы (1)


Подпись v2 была представлена ​​в Android 7.0 (24), поэтому, когда ваш minSdkVersion равен 24 или выше, включите и v1, и v2 следующим образом:

signingConfigs {
        debug {
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

подписанный apk не будет иметь v1, он просто подписан v2. Это может быть проверено apksigner следующим образом:

java -jar apksigner.jar verify -v your-signed-apkfile.apk

введите здесь описание изображения

В противном случае keytool не сможет идентифицировать сигнатуру v2, поэтому запросит Not a signed jar file. И подписанный apk только с подписью v2 тоже является доступным apk, просто его можно установить на Android 7.0 или выше.

Если вы хотите подписать как с v1, так и с v2, вы должны изменить minSdkVersion на 23 или ниже.

Надеюсь, поможет.

person Euporie    schedule 09.03.2020
comment
Действительно, на момент написания вопроса у меня был minsdk 24, и я пытался понять, почему моя настройка Gradle с включенной подпиской перестала работать (для одного из двух моих проектов). Это сработало до того, как я заметил проблему, поэтому я отключил подписание v1 в качестве обходного пути. Теперь он снова работает с обеими подписями. - person garrik; 12.03.2020