2015-07-02 131 views
7

我在用日期/時間(yyMMddHHmm)爲每個版本動態命名APK。我已完成此操作,並且gradle可以正確構建並命名APK,但Android Studio無法使用正確的名稱嘗試推送到設備。Android Studio/gradle動態apk名不同步

有一個關於這個主題的問題,有一些很好的信息,確認問題,並且在每次構建之前需要手動同步。 Android Studio uploads sterile APK to device when Gradle has custom logic changing APK names

對於這裏的全貌是我的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{...} 
    } 

像上面會產生輸出:

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

而Android工作室將始終嘗試第一版本加載到因爲它不同步,並且在每次構建後都不知道名稱更改。

是否有任何關於如何強制每個構建/運行Android Studio的同步的建議?在構建展示制止器之前手動進行同步,並且需要我回到默認的APK命名方案。

使用:AS 1.2.1.1 &「com.android.tools.build:gradle:1.2.3」

+0

你有沒有試着用'archivesBaseName'物業玩?我認爲AS應該識別APK文件名中的變化,如果它在'defaultConfig'塊中定義的,而不是手動重命名文件的腳本。有關示例,請參閱http://stackoverflow.com/a/28992851/937715。 –

+0

@SeanBarbeau謝謝你的建議。使用'archivesBaseName'的方法不適用於動態命名,在這個例子中,名稱是使用靜態字符串構建的,所以通過改變這些字符串的性質,您強制執行一個gradle sync,使AS/gradle對齊,在我的情況下, m不想手動編輯concat'd的值,但在構建時計算它們,這是我遇到問題的地方,因爲這種方法不啓動同步。 –

+0

你嘗試過使用'gradle flavors'嗎?我不知道他們如何處理隨每個新構建而變化的動態名稱,但這裏有一個[問題](http://stackoverflow.com/questions/23226722/use-different-resources-graphics-and-strings-針對不同的應用程序風格)我在過去問過關於安裝的主題。 – craned

回答

3

另一種選擇是讓你的外部釋放通過構建CI服務器(提供他們應該是無論如何),然後添加那麼下面你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") 
      } 
     } 
    } 
... 
} 

您可以設置的CI服務器上的全球環境變量CI_BUILD這將觸發APK重命名,但Android的工作室將使用命名爲它通常會在APK是。

如果你想運行本地構建和擁有那麼APK改名通過命令行建立並添加-PCI_BUILD=true

./gradlew clean assemble -PCI_BUILD=true

+0

我遇到了一個問題。根據hasProperty()調用的調用方式(我有一個ext塊),它可能不在項目上下文中並返回null。爲了完全安全,請使用「project.hasProperty('CI_BUILD')」,它應該在腳本中的任何位置工作。 –