2014-04-10 13 views
16

Budujemy aplikację na Androida, która łączy się z chmurą. Mamy testowy adres URL naszych interfejsów API i produkcyjnego adresu URL. Łączymy aplikację z naszymi lokalnymi urządzeniami programistycznymi, aby rozmawiać z bazą danych podczas tworzenia, ale za każdym razem, gdy generujemy pakiet APK dla Sklepu Play, modyfikujemy globalny URL interfejsu API pod adresem URL produkcji.Jak zarządzać wieloma środowiskami podczas tworzenia aplikacji na Androida?

Czy istnieje lepszy sposób zarządzania środowiskami dla Androida? Czy możemy również mieć dwie wersje aplikacji (wersję rozwojową) i wersję Play Store? Nie mogę mieć dwóch wersji, ponieważ obie aplikacje mają ten sam podpis. Jak najlepiej sobie z tym poradzimy?

Odpowiedz

3

Użyj Ant, aby zbudować przynajmniej wersje produkcyjne. W ten sposób możesz ustawić pewne wartości konfiguracyjne/flagi podczas budowania. Załóżmy, że masz plik config.xml, który zawiera adres URL serwera. Możesz mieć różne cele budowania Ant, które zmienią adres URL tak, by wskazywał na odpowiedni serwer. Sprawdź samouczek this. Wyjaśnia dokładnie, jak to się robi.

0

nie wiem co jest najlepsze praktyki w tym przypadku, ale robię to tak:

Można zrobić aplikacja lib i utworzyć 2 aplikacje: ok produkcja i testowanie aplikacji. Zaimportuj swoją bibliotekę dla tych aplikacji i utwórz ich manifesty (prawie jest to kopiuj poprzednią). Następnie zamieniasz pliki/res /, które są różne w każdej aplikacji ... (możesz utworzyć plik config.xml z adresem URL).

2

Uważam, że jest to uważana za basta w przypadku korzystania ze studia Android ze stopniem.

Możesz zajrzeć do tego artykułu: http://tulipemoutarde.be/2013/10/06/gradle-build-variants-for-your-android-project.html

Również dostępne w YouTube Video: https://www.youtube.com/watch?v=7JDEK4wkN5I

ta pozwala również mieć dwa różne nazwy pakietu dla tej samej aplikacji.

Używa stopniowanych smaków, aby osiągnąć dokładnie to, czego szukasz i jest bardzo łatwy do wdrożenia.

+0

Zamiast tworzyć nowy smak produktu, nie możesz dodać do typu debugowania lub wydania wersji? – vinnybad

24

Z androidem studio i stopniowanie jego proste teraz.

wewnątrz swojej aplikacji build.gradle edit podpisywania configs

signingConfigs { 
    debug { 
     storeFile file("debug.keystore") 
     storePassword "..." 
     keyAlias "..." 
     keyPassword "..." 
    } 

    prod { 
     storeFile file("prod.keystore") 
     storePassword "..." 
     keyAlias "..." 
     keyPassword "..." 
    } 

    dev { 
     storeFile file("dev.keystore") 
     storePassword "..." 
     keyAlias "..." 
     keyPassword "..." 
    } 
} 

dodać buildTypes

buildTypes { 

    debug { 
     buildConfigField 'String', 'BASE_URL', '"http://127.0.0.1:8080/"' 
     ...... 
     signingConfig signingConfigs.debug 
    } 

    prod { 

     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

     buildConfigField 'String', 'BASE_URL', '"http://prod.example.com"' 
     ...... 
     signingConfig signingConfigs.prod 
    } 


    dev { 
     buildConfigField 'String', 'BASE_URL', '"http://dev.example.com"' 
     ...... 
     signingConfig signingConfigs.dev 
    } 
} 

odbioru w kodzie bazowym URL skonfigurowanego w Gradle pliku przez ten kod.

public final static String BASE_URL = BuildConfig.BASE_URL; 

Można również umieścić inny klucz lub cokolwiek co jest zbudować specyficzny typ pliku w Gradle w kodzie potrwa w zależności od typu build używasz.

Jest nawet możliwe, że ma inną nazwę pakietu.

productFlavors { 
    my_prod { 
     applicationId "com.example.packtwo" 
    } 
    my_dev { 
     applicationId "com.example.packone" 
    } 
} 

W najnowszej konfiguracji gradle są pewne aktualizacje w określaniu nazwy pakietu. Musisz dodać flavourDimensions, jeśli używasz productFlavours. Zobacz poniżej kod z dodatkiem flavourDimensions

flavorDimensions "pack" 

productFlavors { 
    flavor_dev { 
     applicationId 'com.example.packtwo' 
     dimension "pack" 
    } 

    flavor_prod { 
     applicationId 'com.example.packone' 
     dimension "pack" 
    } 
} 

To daje więcej szczegółów na temat smaków produktów i wymiarów

https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html

Sprawdź więcej możliwości ...

Ale jeśli używasz inna smaki, które możesz mieć do czynienia z łączeniem Manifest i wszystkimi.

+0

Moje największe zawieszenie związane z tym podejściem polega na tym, że testowany pakiet APK nie jest apk, który został wdrożony. – CrashCodes

+0

W studiu Android możesz uruchomić jako kompilację produkcyjną lub dowolny inny typ kompilacji, który utworzyłeś. Możesz bezpośrednio uruchomić jako produkcję do swojego urządzenia. Sprawdź kartę viveants budowania w lewym dolnym rogu studia Android. – shijin

5

Można to osiągnąć za pomocą smaków produktu.

Dla osiągnięcia tego wymogu:

Przede wszystkim Tworzenie 2 pliki w folderze app projektu powiedzieć development.props i production.props. Lub możesz dodać te 2 pliki w pakiecie w folderze aplikacji powiedz config.

enter image description here

Zasadniczo, te 2 pliki zawierają klucze i wartości. Ten klucz jest taki sam dla obu plików. Ale ich wartości są różne. Te pliki zawierają jeden klucz, powiedz "SERVER_URL" i jego wartość. Byłoby to być napisane tak:

SERVER_URL =”Server_url_value”

W tym przypadku, tylko adres URL jest inna. Dlatego dodałem tylko jedną parę klucz-wartość w pliku rekwizytów. Możesz dodać więcej.

Następnie utwórz ProductFlavours w pliku build.gradle aplikacji, powiedz o rozwoju i produkcji. Teraz dostęp do różnych plików rekwizyty zawierające adresy URL w swoich smakach correseponding tak:

productFlavors { 
    development { 
     getProps('./config/development.props').each { p -> 
      buildConfigField 'String', p.key, p.value 
     } 
    } 
    production { 
     getProps('./config/production.props').each { p -> 
      buildConfigField 'String', p.key, p.value 
     } 
    } 
} 

def getProps(path) { 
    Properties props = new Properties() 
    props.load(new FileInputStream(file(path))) 
    return props 
} 

teraz, dla każdego smaku, nie jest typem budować i to BuildType dodaje się w app build.gradle. Na przykład typ kompilacji to Debugowanie i wydanie. Mam dwa smaki, tj. Rozwój i produkcję. W związku z tym zadanie gradle zostanie utworzone przy użyciu zarówno typu smaku, jak i typu kompilacji:

assemble{flavourName}{BuildType} 

Teraz należy wpisać tylko te polecenia. Wygenerowałby wymagany plik APK z odpowiednim adresem URL. Polecenia są następujące:

./gradlew assembleProductionRelease wygeneruje kompilację wydania z produkcyjnym adresem URL.

./gradlew assembleDevelopmentDebug generuje kompilację debugowania za pomocą adresu URL programowania.

./gradlew assembleProductionDebug generuje kompilację debugowania z produkcyjnym adresem URL.

./gradlew assembleDevelopmentRelease wygeneruje kompilację wydania z adresem rozwojowym.

Najlepsze trzy zadanie gradle byłoby bardzo pomocne. Ale ostatnie zadanie wygenerowałoby kompilację wydania z deweloperskim adresem URL. Ale nie jest to zalecane. Tak, powinniśmy przestać dewelopera do wykonania tego zadania tj ./gradlew assembleDevelopmentRelease

teraz, aby ograniczyć wywoływacz do generowania kompilacji uwolnienia używając URL Development, dodać ten fragment w swojej aplikacji pliku build.gradle:

android.variantFilter { variant -> 
    if(variant.buildType.name.equals('release') 
      && variant.getFlavors().get(0).name.equals('development')) { 
     variant.setIgnore(true); 
    } 
} 

Teraz, gdybyśmy spróbuj wykonać zadanie tj. ./gradlew DevelopmentRelease. Gradle przestałby generować kompilację i rzucił wyjątek i powiedziałby: To zadanie assembleDevelopmentRelease nie zostało znalezione w projekcie głównym.

+0

Jest to bardziej odpowiednie jako komentarz do pytania. Aby sformatować go jako odpowiedź, należy wyjaśnić wiedzę o tym, jak interesuje i jak odnosi się do sytuacji pytającego. Zachowaj podaną referencję i dodaj wszelkie inne, które były szczególnie pomocne w badaniu Twojej Odpowiedzi. – toonice

+0

Mam nadzieję, że będzie to teraz pomocne :) –

+0

Wygląda o wiele lepiej, jednak teraz podjąłeś odpowiedź, którą podałeś w odpowiedzi na link. http://stackoverflow.com/a/43364551. – g00glen00b

Powiązane problemy