2017-07-18 47 views
7

Tło:Wymusza używanie tego samego certyfikatu do podpisywania różnych "buildTypes" skonfigurowanych dla konkretnego "productFlavor"?

Generuję kompilacje przy użyciu wariantu kompilacji. Poniżej znajdują się konfiguracje:

signingConfigs { 
    production { 
     storeFile file("some_path/buildsystem/keystore/some.release.keystore.jks") 
     storePassword "somepassword" 
     keyAlias "somekeyalias" 
     keyPassword "some" 
     v2SigningEnabled false 
    } 

    develop { 
     storeFile file(".some_path./buildsystem/keystore/someother.debug.keystore.jks") 
     storePassword "someother" 
     keyAlias "someotherkeyalias" 
     keyPassword "someother" 
     v2SigningEnabled false 
    } 
} 

productFlavors { 
    production { 
     signingConfig signingConfigs.production 
     } 

    develop { 
     applicationIdSuffix ".develop" 
     signingConfig signingConfigs.develop 
    } 
} 

buildTypes { 
    debug { 
     minifyEnabled false 
    } 

    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 
} 

Problem

jak od teraz na przykład, jeśli mówię o smaku production następnie productionRelease wykorzystuje signingConfigs.production do podpisania apk. Ale, productionDebug nie używa signingConfigs.production.

Oczekiwany wyjście

Kiedy wygenerowania podpisanego apk chcę Gradle wykonać następujące czynności dla mnie:

  1. developRelease i developDebug powinien być podpisany tylko signingConfigs.develop

  2. productionRelease i productionDebug powinien być podpisany tylko signingConfigs.production

Inną kwestią, która jest podobna do tej, która doprowadziła mnie do powyższego: SHA-1 different for buildTypes (debug and release) for same productFlavors Firebase?

+0

myślę za pomocą podpisu produkcyjne do debugowania kompilacje mogą powodować błędy, takie jak przypadkowe zwolnienie wersji do debugowania w Google Play. Dlaczego chcesz to zrobić? – auval

+0

@auval Masz całkowitą rację. Chcę oddzielić podpis w celu debugowania kompilacji produkcyjnej, jeśli wystąpią jakiekolwiek problemy. Po drugie, istnieje ograniczenie na żądanie mapy api. Chcę zachować limit rzeczywistych użytkowników przy produkcji. W trybie deweloperskim testerzy lub programiści mogą kontynuować testowanie z podpisem rozwijającym. FYI https://stackoverflow.com/q/44584273/2870088 –

+0

Możesz ustawić inną nazwę pakietu, aby debugować kompilacje w Gradle, a za pomocą klucza debugowania nie użyjesz przydziału produkcyjnego dla map – auval

Odpowiedz

4

Zdjąć signingConfig signingCongigs.develop gdzie indziej w bloku kodu

I dodaj nową właściwość w ramach typu buildTypes, takiego jak

  • withProduction
  • withDevelop

Teraz dodaj signingConfig na to

Tym zaktualizowaną Gradle plik wyglądać jak poniżej

signingConfigs { 
    production { 
     storeFile file("some_path/buildsystem/keystore/some.release.keystore.jks") 
     storePassword "somepassword" 
     keyAlias "somekeyalias" 
     keyPassword "some" 
     v2SigningEnabled false 
    } 

    develop { 
     storeFile file(".some_path./buildsystem/keystore/someother.debug.keystore.jks") 
     storePassword "someother" 
     keyAlias "someotherkeyalias" 
     keyPassword "someother" 
     v2SigningEnabled false 
    } 
} 
productFlavors { 
    production { 
    } 

    develop { 
     applicationIdSuffix ".develop" 
    } 
} 
buildTypes { 
    /* NOTE: the debug block is not required because it is a default 
* buildType configuration; all of its settings are defined implicitly 
* by Gradle behind the scenes. 
*/ 
    debug { 
     minifyEnabled false 
    } 

    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     signingConfig signingConfigs.production 
    } 

    withProduction { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     signingConfig signingConfigs.production 
    } 

    withDevelop { 
     minifyEnabled false 
     signingConfig signingConfigs.develop 
debuggable true 

    } 
} 

W terminalu użyć poniżej Gradle commmand: gradle assembleProduction do generowania kompilacji z certyfikatami produkcyjnymi podobnie gradle assembleDevelop lub można również użyć gradle assemble

Nie można zmusić Gradle wybrać certyfikatów dla debug własności raczej można utworzyć własny buildTypes

zgodnie documentation

Automatyzacja podpisywaniu aplikacji. Warianty wersji debugowania są domyślnie podpisywane za pomocą klucza debugowania w celu instalacji na urządzeniach programistycznych. Zadeklaruj dodatkowe konfiguracje podpisywania do publikacji w sklepie Google Play.

Aktualizacja: Jako druga odpowiedź wskazał,

Dodaj debuggable prawdziwą własność pod niestandardowych buildTypes przeciwko którym chcesz debugowania i zobaczyć logi.

+0

Wystąpił problem podczas oceny projektu ": aplikacja". > Nazwy ProductFlavor nie mogą kolidować z nazwami BuildType. To nie zadziała –

+0

Czy możesz opublikować zaktualizowany plik gradle ze zmianami, które wprowadziłeś? – Mani

+0

Zaktualizowano odpowiedź, poprawiając konstrukcję błędów i dodatkową właściwość debuggable true, aby umożliwić debugowanie. – Mani

0

Dzięki @Mani za rzucenie światła na buildTypes.debug.

Zgodnie documentation Application Signing

Automatyzacja podpisywania aplikacji. Warianty wersji debugowania są domyślnie podpisywane za pomocą klucza debugowania w celu instalacji na urządzeniach programistycznych. Zadeklaruj dodatkowe konfiguracje podpisywania do publikacji w sklepie Google Play.

Powyższe informacje są bardzo poprawne. Nie trzeba usuwać signingConfig z productFlavors. Dodaj też właściwość debuggable true pod niestandardową nazwą buildTypes, przed którą chcesz zdebugować kompilację i wyświetlić dzienniki.

Możesz dodać poniżej właściwości w buildTypes jak na swoje potrzeby:

{name=withDevelopDebug, debuggable=false, testCoverageEnabled=false, 
jniDebuggable=false, pseudoLocalesEnabled=false, 
renderscriptDebuggable=false, renderscriptOptimLevel=3, 
minifyEnabled=false, zipAlignEnabled=true, signingConfig=null, 
embedMicroApp=true, buildConfigFields={}, resValues={}, 
proguardFiles= [], consumerProguardFiles=[], manifestPlaceholders={}} 

Jako, dodałem debuggable true pod withProductionDebug i withDevelopDebug

signingConfigs { 
    production { 
    storeFile file("some_path/buildsystem/keystore/some.release.keystore.jks") 
    storePassword "somepassword" 
    keyAlias "somekeyalias" 
    keyPassword "some"   
    } 

    develop { 
    storeFile file(".some_path./buildsystem/keystore/someother.debug.keystore.jks") 
    storePassword "someother" 
    keyAlias "someotherkeyalias" 
    keyPassword "someother" 
    } 
} 

buildTypes { 
    withProductionRelease{ 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 

    withProductionDebug{ 
     minifyEnabled false 
     debuggable true 
    } 

    withDevelopRelease{ 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 

    withDevelopDebug{ 
     minifyEnabled false 
     debuggable true 
    } 
} 

productFlavors { 
    production { 
     signingConfig signingConfigs.production 
    } 

    develop { 
     applicationIdSuffix ".develop" 
     signingConfig signingConfigs.develop 
    } 
} 
+1

W jaki sposób to odpowiada na twoje pytanie? Pytanie dotyczy tego samego "signingConfig" opartego na buildTypes, a nie na smakach produktu !! – Mani

+1

@Mani To samo oznaczenieConfig jest używane dla różnych typów buildTypes, zachowując ten sam certyfikat w productFlavors. Ponadto, istnieją dwa luki w twoim rozwiązaniu, o czym wspomniałem w mojej odpowiedzi. Najpierw w odniesieniu do problemu wystąpił problem oceny projektu ": aplikacja". > Nazwy ProductFlavor nie mogą kolidować z nazwami BuildType. Po drugie, ustaw debuggable true na debugowanie kompilacji. Nie ma znaczenia, jeśli umieścisz signingConfig w productFlavors lub buildTypes. –

+0

"Ta sama sygnaturaKonfiguracja jest używana dla różnych typów buildTypes, zachowując ten sam certyfikat w productFlavors." - Prowadziłoby to do niepotrzebnego zamieszania, chociaż ta sztuczka zadziała! – Mani