2015-07-02 26 views
7

Szukam dynamicznego nadawania nazwy pakietowi APK dla każdej kompilacji z datą/czasem (yyMMddHHmm). Ukończyłem to i stopniowo kompilowałem i nadawałem nazwę APK poprawnie, jednak Android Studio nie odbiera prawidłowej nazwy, aby spróbować przekazać do urządzenia.Studio Android/stopniowa nazwa dynamicznego apk nie jest zsynchronizowana

Istnieje pytanie na ten temat z kilkoma dobrymi informacjami, potwierdzające problem i wymagające ręcznej synchronizacji przed każdą kompilacją. Android Studio uploads sterile APK to device when Gradle has custom logic changing APK names

Dla pełnego obrazu Oto moja build.gradle

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    // grab the date/time to use for versionCode and file naming 
    def date = new Date(); 
    def clientBuildDate = date.format('yyMMddHHmm') 

    // for all client files, set the APK name 
    applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     output.outputFile = new File(output.outputFile.parent, "myapp-" + versionName.replace(".","_") + "-" + clientBuildDate + ".apk") 
    } 
    } 
    .... 
    defaultConfig{...} 
    buildTypes{...} 
    compileOptions{...} 
    signingConfigs{...} 
    } 

Wyjście powyżej wygeneruje jak:

myapp-1_0_0-1507021343.apk 
myapp-1_0_0-1507021501.apk 
myapp-1_0_0-1507021722.apk 

ale Android studio zawsze próbuje załadować 1. Do wersji telefon, ponieważ nie jest zsynchronizowany i nie jest świadomy zmiany nazwy po każdej kompilacji.

Czy są jakieś sugestie dotyczące wymuszania synchronizacji w każdej kompilacji/uruchomieniu studia Android? Ręczne wykonanie synchronizacji przed kompilacją jest ogranicznikiem show i wymagałoby ode mnie powrotu do domyślnego schematu nazewnictwa APK.

Użycie: AS 1.2.1.1 & „com.android.tools.build:gradle:1.2.3”

+0

Czy próbowałeś grać z 'własności archivesBaseName'? Myślę, że AS powinien rozpoznać zmianę nazwy pliku APK, jeśli jest zdefiniowany w bloku 'defaultConfig', zamiast skryptu do ręcznej zmiany nazwy plików. Zobacz przykład http://stackoverflow.com/a/28992851/937715. –

+0

@SeanBarbeau dziękuję za sugestię. Podejście do użycia 'archivesBaseName' nie zadziała dla dynamicznego nazewnictwa, w tym przykładzie nazwa jest budowana przy użyciu ciągów statycznych, więc z natury zmieniając te łańcuchy wymuszasz synchronizację grad, która wyrównuje AS/grad, w moim przypadku i ' Nie szukam ręcznej edycji wartości, które są połączone, ale mają je obliczone w trakcie kompilacji, tutaj pojawiają się problemy, ponieważ takie podejście nie rozpoczyna synchronizacji. –

+0

Czy próbowałeś używać 'gradle flavour''? Nie wiem, jak dobrze pracują z nazwami dynamicznymi, które zmieniają się z każdą nową kompilacją, ale tutaj jest [pytanie] (http://stackoverflow.com/questions/23226722/use-different-resources-graphics-and-strings- dla różnych smaków aplikacji) Pytałem w przeszłości o temat instalacji. – craned

Odpowiedz

3

Innym rozwiązaniem byłoby mieć swój zewnętrznie wydany buduje być dostarczone przez serwer CI (które powinny być tak), a następnie dodać można następujące ustawienia do Ciebie build.gradle

apply plugin: 'com.android.application' 
... 
def isCIBuild() { 
    return System.getenv('CI_BUILD') != null || hasProperty('CI_BUILD'); 
} 
... 
android { 
... 

    if(isCIBuild()){ 
     def clientBuildDate = new Date().format('yyMMddHHmm') 
     applicationVariants.all { variant -> 
      variant.outputs.each { output -> 
       output.outputFile = new File(output.outputFile.parent, "myapp-" + versionName.replace(".","_") + "-" + clientBuildDate + ".apk") 
      } 
     } 
    } 
... 
} 

następnie konfiguracja globalna zmienna CI_BUILD na serwerze CI które wyzwalają APK zmiana nazwy, jeszcze Android Studio użyłby APK nazwie jak zazwyczaj być.

Jeśli chcesz uruchomić lokalną budować i mieć APK przemianowany następnie zbudować poprzez linię poleceń i dodać -PCI_BUILD=true

./gradlew clean assemble -PCI_BUILD=true

+0

Znalazłem jeden problem. W zależności od tego, gdzie wywoływane jest wywołanie hasProperty() (miałem kopalnię w bloku ext), może nie być w kontekście projektu i zwracać wartość null. Aby być całkowicie bezpiecznym, użyj "project.hasProperty ('CI_BUILD')" i powinno działać w dowolnym miejscu skryptu. –

Powiązane problemy