2015-04-21 97 views
14

我正嘗試使用Android Studio和gradle爲庫Android項目創建AAR文件。如何使用Gradle從.AAR Android庫存檔中排除文件

我想從此存檔中排除特定的文件夾和文件,但我找不到工作解決方案。

該項目有兩種口味。

app/ 
|--libs/ 
|--src/ 
    |--flavour1/ 
    | |--java/ 
    |  |--a1/ 
    |  | |--class_File1.java 
    |--flavour2/ 
    | |--java/ 
    |  |--a1/ 
    |  | |--class_File1.java 
    |--main/ 
     |--java/ 
     | |--... 
     |--res/ 
     | |--raw/ 
     | | |--comments.txt 
     | |--... 
     |--AndroidManifest.xml 

和我使用的build.gradle文件中像這樣一個

apply plugin: 'com.android.library' 

android { 
compileSdkVersion 21 
buildToolsVersion "21.1.2" 

defaultConfig { 
    minSdkVersion 10 
    targetSdkVersion 21 
} 
packagingOptions { 
    exclude 'assets' 
    exclude '**/comments.txt' 
} 


sourceSets { 

     flavour1 { 
      resources { 
       exclude '**/comments.txt' 
      } 
     } 
     flavour2 { 

     } 

} 

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

productFlavors { 

    flavour1 { 

     packagingOptions { 
      exclude 'assets' 
      exclude 'res/raw/comments.txt' 
     } 
    } 
    flavour2 { 
    } 
} 
} 

dependencies { 
compile 'com.google.android.gms:play-services:+' 
} 

一般而言,我已經嘗試了很多。我已經嘗試了packagingOptions,排除在sourceSets中,但似乎沒有任何工作。我試圖實現的是不包括例如在.AAR歸檔文件comments.txt和文件夾「資產」這是一個可選的文件夾。我通過重命名壓縮文件並查看包含的文件來檢查.AAR文件。

我也看過這裏的文檔:http://simpligility.github.io/android-maven-plugin/aar-mojo.html#configurations其中配置可能是一個解決方案,但我不知道如何使用它或如何前進。任何幫助將不勝感激。

+0

您是否只希望從某種味道或每一種構造中刪除這些味道? – Mike

+0

我想這兩種情況將有助於知道如何。 – andreasv

回答

3

認爲它與this問題有關。一般來說,你可以嘗試用:

  • 來源集排除
  • 包裝選項
  • AAPT選項

我不能讓任何一方的工作,雖然。

這就是說,你可以做一些醜陋的黑客就像這樣:

def filterVariant = { variantToFilter, filterTask-> 
     def vv = android.sourceSets."${variantToFilter}".res.srcDirs 
     println "${variantToFilter} --> ${vv*.toString()}" 

     def variantRes = android.sourceSets."${variantToFilter}".res 
     variantRes.srcDirs.each{ resDir-> 
      def filterOutput = "${buildDir}/res-filter" 
      if (resDir.toString().contains(filterOutput)) { 
       return 
      } 

      println "begin filter ${resDir} to ${filterOutput}/${variantToFilter}" 

      filterTask.from fileTree(dir: resDir, exclude: '**/comment.txt') 
      filterTask.into "${filterOutput}/${variantToFilter}" 


      variantRes.srcDirs = ["${filterOutput}/${variantToFilter}"] 
     } 
    } 

    project.task('filterMainResources', type: Copy) { 
     filterVariant 'main', it 
    } 

    android.libraryVariants.all{ variant -> 
     project.task("filter${variant.name}Resources", type: Copy) { filterTask -> 
      filterVariant "${variant.name}", filterTask 
      filterTask.dependsOn "filterMainResources" 
     } 
     variant.mergeResources.dependsOn("filter${variant.name}Resources") 
    } 
+0

你好Samuil,謝謝你的回覆。此解決方案工作。我只需要改變這行:filterTask.from fileTree(dir:resDir,exclude:'raw/comments.txt')來指定該文件在原始文件夾中,因爲**沒有工作。謝謝! – andreasv

0

我不能嘗試它的權利,但這或許是我的方法:

sourceSets { 
    main { 
     manifest.srcFile 'AndroidManifest.xml' 
     aidl.srcDirs = ['src'] 
     resources.srcDirs = ['src']   
     renderscript.srcDirs = ['src'] 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
    } 

    flavor1 { 
     java.srcDirs = ['src/main/java', 'src/flavor1/java']   
     res.srcDirs = ['src/flavor1/res'] //this differs from your structure 
     assets.srcDirs = [] 
    } 

    flavor2 { 
     java.srcDirs = ['src/main/java', 'src/flavor2/java'] 
     res.srcDirs = ['src/flavor2/res'] //this differs from your structure 
     assets.srcDirs = ['src/main/res/raw'] 
    } 
} 

同樣,我無法嘗試,所以這可能是完全廢話。這個想法是不排除的東西,但只包括你想要的味道文件/ dirs。這可能會導致每種風味的文件/文件夾重複!

作爲消息來源,我會推薦:Gralde Plugin User Guideanswer from Xavier Ducrohet以及此Gradle + Android, want to overwrite /assets with custom folder in buildFlavor

+0

你好SateliteSD,謝謝你的回答,但我不確定它是如何回答這個問題的。例如,在您提供的代碼中,我如何保留res/raw文件夾,但是從中排除特定文件,例如問題中所述的comments.txt?根據我的理解,您只需指定在何處查找src,資產和res中的不同風格,這裏沒有其他更實際的問題,因爲在構建時,項目風格的結構會查看正確的文件夾。 – andreasv

相關問題