2015-07-21 80 views
0

我目前正在使用gradle中的構建過程掙扎。我的目標是在特定風格的最終.apk中沒有特定的java類。 的邏輯是這樣的:Android Studio - Gradle組裝任務

1)編譯我的項目刪除MyClass.java和MyClass.java組裝APK副本回到我原來的文件夾

之後將其複製到一個臨時文件夾

2)前

3.)刪除臨時文件夾

只有當我建立一個特定的味道,所以它不會發生所有構建變種。當我僅構建一種風味和一種構建變體時,我的代碼完美工作,例如assembleFlavorRelease,但如果我不想讓我的代碼適用於多種構建類型;如果我運行assembleFlavor,它應該像flavorRelease一樣創建flavorDebug。 然而,我的邏輯僅在第一次出現低谷時才停止,因此flavorDebug是使用MyClass構建的,它不應該是這樣,而flavorRelease在.apk中不包含MyClass,因爲我的代碼第一次運行。

下面是代碼的樣子:

task copyResource << { 
    copy { 
     from 'src/main/java/MyClass.java' 
     into 'src/temp' 
    } 
} 

task deleteResource << { 
    delete { 
     'src/main/java/MyClass.java' 
    } 
} 

task deleteTemp << { 
    delete { 
     'src/temp' 
    } 
} 

task copyBackToSource << { 
    copy { 
     from 'src/temp/MyClass.java' 
     into 'src/main/java' 
    } 
    deleteTemp.execute() 
} 

android.applicationVariants.all { variant -> 
    if (variant.name.contains('flavor')) { 
     deleteResource.dependsOn copyResource 
     variant.javaCompile.dependsOn deleteResource 
     variant.assemble.doLast { 
      copyBackToSource.execute() 
     } 
    } 
} 

我認爲,我在我的代碼使用目錄在某種程度上鎖定試圖執行的全過程,第二次是什麼時候?

回答

1

我覺得你是以錯誤的方式接近問題。而不是想着

的把Java文件中的src/main/java和從flavorX

刪除

而應該將接近它作爲

添加額外的源代碼目錄到香味和香味的原料組合

一旦你接近這個問題,它變得更容易

如果你只是想在一種口味的文件,可以使用把文件中的味道特定源文件夾內置的約定(即src/flavorX/java

如果你想在一個以上的香味,你可以在文件把MyClass.java在src/common/java和做類似

android { 
    productFlavors { 
     flavor1 { 
     } 
     flavor2 { 
     } 
     flavor3 { 
     } 
    } 
} 
sourceSets { 
    flavor1.java = ['src/flavor1/java','src/common/java'] 
    flavor2.java = ['src/flavor2/java','src/common/java'] 
} 
+0

謝謝你的回答,我知道這種解決方案。問題是我的應用程序結構很複雜,我有7種不同的風格,這意味着我將不得不在包含它的src中多次複製MyClass.java,再加上src結構在Android Studio中不可見Android視圖,因爲我知道。我想避免這個解決方案,我更喜歡我的解決方案,我的應用程序結構。我有沒有其他的方式來排除特定的類? – box

+0

「這意味着我將不得不多次複製MyClass.java」是不正確的。我給出了兩個解決方案,一個是如果你需要一個單一的風格的文件,另一個包括一個單一的源目錄兩個或更多的味道,沒有重複的源文件。 「加上風格的src結構在Android視圖下不可見,因爲我知道」如果是這樣的話,我會感到驚訝。 –

+0

哦,是的,對不起,你是對的,我可以把班上的共同點。我之前曾嘗試過,但正如我所說的那樣,它在項目結構中不太好,而且會產生一些其他問題。我發佈了正確的解決方案,下面是乾淨的,很好地工作。 – box

0

好了,所以我就從這裏正確的解決方案:https://discuss.gradle.org/t/android-gradle-assemble-tasks/10711

如果你想避免編譯一個特定的類,然後用這個:

variant.javaCompile.exclude '**/SourceFileToExclude.java' 
+0

正如我所說,在我看來,這是解決問題的錯誤方法。單個文件排除是討厭的。添加源組更容易維護(想想看下代碼的下一個可憐的草皮)。 –

+0

就我而言,它表現更好。我將你的答案標記爲有用,儘管我不能將其標記爲對我的問題的回答。我感謝您的幫助。 – box