2015-03-06 26 views
15

Tôi đang nhập khẩu một thư viện android trong một ứng dụng được xây dựng với gradle, như thế:Loại trừ tài sản cho phát hành xây dựng loại

dependencies { 
    compile 'com.example:great-lib:0.1-SNAPSHOT' 
} 

Thư viện này chỉ chứa tài sản, js, css và hình ảnh được sử dụng trong một webview , với bố cục như vậy:

assets/ 
|-> great.css 
|-> great.min.js 
|-> great.min.js.map 
|-> js/ 
| |-> plop.js 
| |-> foo.js 
| ... 
|-> img/ 
| ... 

Thư mục js chứa tệp nguồn (được sử dụng với bản đồ nguồn). Tôi muốn bao gồm nó và các tập tin .map để gỡ lỗi xây dựng, và chỉ có js minified trong bản phát hành xây dựng, nhưng tôi không thể tìm thấy một cách để làm điều đó.

Cho đến nay tôi đã cố gắng:

android { 
    // this doesn't exclude anything 
    packageOptions { 
     exclude 'assets/js' 
    } 
    buildTypes { 
     release { 
      // this does exclude the js folder, but in both release and debug 
      aaptOptions { 
       ignoreAssetsPattern "!js" 
      } 
     } 
    } 
} 

Bất cứ ý tưởng nếu những gì tôi muốn là có thể đạt được, và nếu như vậy như thế nào?

(Tôi cũng đã nghĩ đến việc xuất bản hai phiên bản của thư viện (great-libgreat-lib-debug), và có sự phụ thuộc vào debugCompilereleaseCompile, nhưng tôi muốn tránh điều đó và công bố một phiên bản duy nhất)

Trả lời

9

tôi đã kết thúc cách làm như sau:

android.applicationVariants.all { variant -> 

    if (variant.name.contains('Release')) { 
    // exclude source and sourcemap from release builds 
    def noJsSourceTask = task("delete${variant.name}JsSource", type: Delete) { 
     delete "${buildDir}/intermediates/assets/${variant.dirName}/js" 
     delete "${buildDir}/intermediates/assets/${variant.dirName}/great.min.js.map" 
    } 
    variant.mergeAssets.finalizedBy noCeJsSourceTask 
    } 
} 

Nó hoạt động ok, nhưng có một vài điều tôi không thực sự thích:

  • Tôi đang chạm vào các tập tin được tạo ra bởi một tác vụ sau khi nó được thực hiện (finalizedBy), vì vậy nó không hoạt động tốt với việc kiểm tra "cập nhật". Nhưng nó chỉ dành cho bản phát hành bản phát hành, tôi đang thực hiện các bản sửa lỗi thường xuyên hơn
  • đường dẫn của tệp cần xóa được tạo theo cách thủ công. Tôi không chắc liệu nó có đủ chung để được tái sử dụng trong các dự án khác như là
  • Tôi đang chọn các biến thể dựa trên tên của chúng. Tôi đã có thể thích một cái gì đó có cấu trúc hơn.
+1

Cảm ơn bạn đã chia sẻ giải pháp của mình! Tôi vẫn hy vọng cho một giải pháp ít cồng kềnh/mong manh hơn. –

1

Tôi nghĩ bạn có thể sử dụng công cụ bảo vệ. Proguard được bao gồm với android studio, mã obfuscate, và loại bỏ không sử dụng các lớp học, và nếu bạn muốn loại bỏ tất cả các nguồn lực mà ứng dụng không được sử dụng. Chỉ đưa vào build.gradle của bạn này:

release { 

      minifyEnabled true //remove classes, obfuscate code and zipalign 
      shrinkResources true //remove resources 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//autogenerated files 
     } 

Đây là thông tin liên kết về điều đó:

Bạn có thể cá nhân, loại trừ các file cụ thể hoặc bỏ qua các file đặc biệt

+0

Cảm ơn bạn đã đề xuất sử dụng proguard. Tôi đã sử dụng proguard, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về việc sử dụng nó để xóa/không bao gồm các tệp cụ thể. Bạn có thể cụ thể hơn không? –

+0

Vâng, bạn nên kích hoạt shrinkResources trong gradle.build, điều này sẽ loại bỏ tất cả các tài nguyên không được sử dụng trong dự án, điều này sẽ loại bỏ tất cả các tệp js, để giữ một số tài nguyên bạn nên tạo tệp xml, bên trong tệp này xác định tệp hoặc tài nguyên nào từ xóa. trong [link] này (http://tools.android.com/tech-docs/new-build-system/resource-shrinking) trong phần KeepResources. Sau đó bạn nên kiểm tra tốt, bảo vệ nó phức tạp để cấu hình và hiểu. Tôi hy vọng điều này sẽ giúp bạn – encastellano

+0

Tôi đã kích hoạt 'shrinkResources'. Nó không loại bỏ các tài sản tôi không muốn, kể từ thư viện mà tôi sử dụng, sử dụng các tập tin đó. Tuy nhiên tôi không sử dụng một phần của thư viện, vì vậy tôi có thể và muốn làm mà không có những tập tin đó. –

0

Không thể thông qua bộ lọc.

Mặc dù vậy, bạn có thể có 2 thư mục nội dung. một chính (src/main/asset) được sử dụng cho cả hai debugrelease và một (src/debug/asset) chỉ được sử dụng cho bản dựng gỡ lỗi.

source

+0

Xin chào, đó không phải là một lựa chọn cho tôi vì tài sản không mong muốn nằm trong thư viện tôi sử dụng. –

1

Gradle cung cấp "aaptOptions, ignoreAssetsPattern" để lọc/loại trừ tài sản thư mục và tập tin từ phát hành hoặc debug xây dựng.

Ví dụ cho debug build (js thư mục và great.css files):

debug {    
     aaptOptions { 
      ignoreAssetsPattern '!js:!great.css:' 
     } 
    } 

Ví dụ cho phát hành xây dựng (js thư mục và great.css files):

release { 
     aaptOptions { 
      ignoreAssetsPattern '!js:!great.css:' 
     } 
    } 
+0

Bạn đã thử cái này chưa? Đối với tôi nó không hoạt động. – DenisGL

+0

Có, nó làm việc cho tôi. –

+1

https://code.google.com/p/android/issues/detail?id=224167 – ecdpalma

9

Tôi đã thành công với phương pháp này:

applicationVariants.all { variant -> 
    if (variant.buildType.name == 'release') { 
     variant.mergeAssets.doLast { 
      delete(fileTree(dir: variant.mergeAssets.outputDir, includes: ['**/js', '**/*.js.map'])) 
     } 
    } 
} 

Điều này sẽ giải quyết các vấn đề với câu trả lời @ Xavier của:

  • Việc xóa được thực hiện như một phần của nhiệm vụ của biến thể mergeAssets nên xóa được phản ánh trong kết quả của nhiệm vụ và up-to-date kiểm tra nên không bị ảnh hưởng.
  • Đường dẫn được tính không có chuỗi ma thuật. Bạn có thể cần điều chỉnh các mẫu bao gồm trong trường hợp ví dụ của tôi quá dễ dãi.
  • Biến thể đang được chọn theo tên buildType, ít có vấn đề hơn so khớp với toàn bộ tên biến thể (mặc dù tên này vẫn được nhập bằng chuỗi).

Lưu ý rằng phương pháp này cũng làm việc cho res file chứ không phải assets: chỉ cần thay thế mergeAssets với mergeResources.

câu trả lời khác đề cập và aaptOptions đang sủa lên cây sai, vì đây là những scoped để tất cả biến thể (chúng được định nghĩa trong phạm vi android, không buildType hoặc productFlavor).

+0

Hoạt động như một sự quyến rũ! – Idolon

+0

Điều này có thể được thực hiện bên trong variants.outputs.mỗi? Và kiểm tra kiến ​​trúc đầu ra? –

+1

Điều đáng nói đến là mã này đi _inside_ phần 'buildTypes' nằm bên trong phần' android' của build.gradle của ứng dụng. – Drarok

Các vấn đề liên quan