2015-07-28 19 views
5

Tôi đang cố gắng trao đổi một số tài nguyên trong thư mục res/raw và thư mục jniLibs/armeabi dựa trên số liệu là release buildType hoặc debug buildType. Tôi hiện đang có hai hương vị sản phẩm.Tài nguyên jniLibs trao đổi gradle dựa trên hương vị xây dựng

File build.gradle:

apply plugin: 'com.android.application' 

android { 
    dexOptions { 
     preDexLibraries = false 
    } 

    compileSdkVersion 21 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "com.example.test" 
     minSdkVersion 17 
     targetSdkVersion 22 
     compileOptions { 
      sourceCompatibility JavaVersion.VERSION_1_7 
      targetCompatibility JavaVersion.VERSION_1_7 
     } 
    } 

    productFlavors{ 
     phone{ 
      applicationId "com.example.testPhone" 
     } 
     tablet{ 
      applicationId "com.example.testTablet" 
     } 
    } 

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

    sourceSets{ 
     release{ 
      res.srcDirs = ['androidRelease/res/raw'] 
     } 
    } 
} 

dependencies { 
    compile project(':facebook') 

} 

Đang sử dụng sourceSet đúng cách để làm như vậy? Nếu có, thư mục nào sẽ được tạo để nó hoán đổi các tài nguyên thích hợp dựa trên chỉ buildType và không phân biệt productFlavors?

EDIT: Thậm chí có thể hoán đổi các tài nguyên thư mục jniLibsraw thư mục không?

thư mục Cấu trúc:

src/main/jniLibs/armeabi 
phoneRelease/jniLibs/armeabi 
tabletRelease/jniLibs/armeabi 

là cấu trúc thư mục chính xác.?

EDIT 2: Dựa trên câu trả lời Xavier của nên giao diện gradle như thế này:

android { 

     sourcesets { 
     phone { 
      jniLibs.srcDirs = ['phoneRelease/jniLibs/'] 
      res.srcDirs = ['androidRelease/res/raw'] 
     } 
     tablet { 
      jniLibs.srcDirs = ['tabletRelease/jniLibs/'] 
      res.srcDirs = ['androidRelease/res/raw'] 
     } 
     } 
    } 

Tôi tiếp tục đọc nhiều câu trả lời mâu thuẫn, một số trong số họ đề cập rằng bạn chỉ cần thư mục riêng biệt dựa trên xây dựng biến thể và một số đề cập đến việc phải sử dụng sourceSet? Cảm ơn!

+0

hiểu biết của tôi là bạn không sử dụng xây dựng các loại cho điều này, nhưng thay vào đó là hương vị. Tôi thấy bạn đang tìm kiếm một giải pháp 2D tuy nhiên. –

+0

Làm thế nào về tôi đi về việc sử dụng hương vị? bạn có thể xây dựng được không? – user2511882

Trả lời

4

một số trong số họ đề cập rằng bạn chỉ cần thư mục riêng biệt dựa trên xây dựng biến thể và một số đề cập về việc phải sử dụng sourceSet?

Gradle/Gradle dành cho Android có cấu trúc dự kiến ​​cho một sourceset:

  • nguồn Android trong res/
  • Java cây nguồn trong java/
  • Pre-biên soạn các thư viện JNI trong jniLibs/
  • Nội dung trong số assets/
  • Vv

Trường hợp sourceSets đóng cửa đi vào chơi là nếu, một sourceset nhất định, bạn muốn có một cấu trúc khác nhau:

  • nguồn Android trong foo/
  • Java cây nguồn trong bar/
  • Pre thư viện JNI được biên soạn trong ickyNativeStuff/
  • Nội dung trong assetsBecauseThatSeemsLikeADecentName/
  • Vv

Mỗi loại xây dựng, hương vị sản phẩm, và xây dựng biến thể có thể có một sourceset riêng (như thể androidTest để thử nghiệm thiết bị đo đạc), để đi cùng với main. Chúng được đặt tên giống như kiểu biến thể/phiên bản sản phẩm/phiên bản sản phẩm. Đây sẽ là cấu trúc cổ phiếu, trừ khi bạn sử dụng sourceSets để thay đổi mọi thứ.

Vì vậy, để cuộn tất cả các cách trở lại:

Tôi cố gắng để trao đổi một số tài nguyên trong res/thư mục thô và jniLibs thư mục/armeabi dựa vào việc của mình một buildType phát hành hoặc một buildType debug

Trong trường hợp tài nguyên, các lớp phủ nguồn khác main. Vì vậy, nếu bạn có src/main/res/...src/main/debug/...src/main/release/..., và bạn đang làm một xây dựng debug, bất kể là trong src/main/release/... bị lờ đi (như chúng ta không làm release) và bất cứ thứ gì trong src/main/res/...src/main/debug/... sẽ được sử dụng. Nếu có cùng một tài nguyên ở cả hai (src/main/res/raw/boom.oggsrc/debug/res/raw/boom.ogg), thì debug một con số sẽ vượt trội hơn số main.

Tôi chưa thử nghiệm với các biến thể xây dựng khác nhau jniLibs/. Tôi đoán là nó sẽ hoạt động giống như mã Java, nơi bạn không thể có xung đột giữa những gì đang ở trong nguồn của biến thể xây dựng và cái gì là trong main, nhưng đó chỉ là phỏng đoán. Vì vậy, bạn có thể có phiên bản gỡ lỗi của mã JNI đã biên dịch của mình trong src/debug/jniLibs/ và phiên bản phát hành của mã JNI đã biên dịch của bạn trong src/release/jniLibs/. Chỉ có trong src/main/jniLibs/ bất kỳ thư viện nào không thay đổi. Điều đó đang được nói, như tôi đã đề cập, tôi đã không thử điều này, và do đó có thể có trục trặc ở đây.

Vì vậy, tôi mong chờ bạn không có một kết thúc sourcesets trong build.gradle, và chỉ sử dụng cấu trúc sourcesets chứng khoán, cho bit khác nhau của bạn:

src/ 
    main/ 
    ... 
    debug/ 
    jniLibs/ 
    res/ 
     raw/ 
    release 
    jniLibs/ 
    res/ 
     raw/ 
+1

Phát ngay. Tôi có thể xác nhận điều này làm việc với 'jniLibs /'. –

+0

Xin lỗi về cách trả lời quá chậm. Điều này đã làm việc. Cảm ơn! – user2511882

0

Để sử dụng hương vị thay đổi bộ nguồn,

productFlavors{ 
    phone{ 
    } 
    tablet{ 
    } 
} 

Bây giờ cấu trúc mã của bạn như thế nào,

src 
    main 
    phone 
    tablet 

Các mã trong main được phổ biến giữa hai hương vị, nhưng các mã trong phone hoặc tablet là chỉ được bao gồm khi hương vị tương ứng được tạo. Đó là nó, bạn không cần phải làm bất cứ điều gì khác.

Cấu trúc dưới phonetablet giống như dưới main (res, java, v.v ...). Bạn cũng có thể có một tùy chỉnh AndroidManifest.xml trong thư mục hương vị. Gradle cố gắng hợp nhất các hương vị của AndroidManifest.xml với một trong những chính. Trong một số trường hợp, bạn phải cung cấp các quy tắc về cách hợp nhất.

+0

cấu trúc trên phân biệt giữa loại xây dựng gỡ lỗi và bản phát hành như thế nào? Tôi chỉ muốn trao đổi tài nguyên dựa trên việc phát hành hoặc gỡ lỗi – user2511882

+0

Như tôi đã nói ở trên, bạn sử dụng các hương vị cho điều này, không xây dựng các loại. Sau đó bạn hỏi: "Làm thế nào về tôi đi về cách sử dụng hương vị?" trong đó tôi đã trả lời ở trên. –

+0

nhưng điều này không chỉ hoạt động cho các sản phẩm có hương vị? Ví dụ làm thế nào để làm cho nó làm việc cho phoneRelease chỉ – user2511882

4

Bất cứ điều gì đó là bình thường dưới src/main/ có thể được đặt trong một thư mục khác nhau:

src/<element>/AndroidManifest.xml 
src/<element>/java 
src/<element>/res 
src/<element>/assets 
src/<element>/resources 
src/<element>/jni 
src/<element>/jniLibs 
src/<element>/aidl 
src/<element>/rs 

đâu element là tên của một build type hay product flavor. Nếu biến thể của bạn bao gồm như một yếu tố (xây dựng loại hoặc hương vị), sau đó là bộ nguồn cũng được sử dụng ngoài-src/main

Lưu ý rằng vị trí thực sự là không có liên quan nếu bạn đã cấu hình nó. Điều đáng quan tâm là có một yếu tố android.sourcesets.main chứa nguồn chung cho tất cả các biến thể, và mỗi biến có một bộ sourcesets.

Ví dụ nếu bạn có một hương vị phoneRelease nó thực sự sử dụng sourcesets sau:

android.sourcesets.main 
android.sourcesets.phone 
android.sourcesets.release 
android.sourcesets.phoneRelease 

Nếu bạn có một biến thể tabletRelease, nó sẽ sử dụng như sau:

android.sourcesets.main 
android.sourcesets.tablet 
android.sourcesets.release 
android.sourcesets.phoneRelease 

Vì vậy, các phone/tablet nguồn khác nhau và là nơi bạn đặt nguồn biến thể cụ thể, trừ khi bạn muốn cụ thể hơn và sử dụng phoneRelease/Theo mặc định, chúng sẽ là src/phone/...src/tablet/... (hoặc src/phoneRelease/...) nhưng bạn có thể thay đổi tuy nhiên bạn muốn và miễn là nó được kết nối với các đối tượng android.sourcesets.* nó sẽ ổn thôi.

ví dụ, thực hiện:

android { 
    sourcesets { 
    phone { 
     jniLibs.srcDirs = ['phoneRelease/jniLibs/'] 
    } 
    tablet { 
     jniLibs.srcDirs = ['tabletRelease/jniLibs/'] 
    } 
    } 
} 

là tốt. Nhưng hãy lưu ý rằng bạn chỉ thay đổi thư mục jniLibs chứ không phải các phần tử nguồn khác (java, res, v.v.)

Nếu bạn giữ vị trí mặc định cho các nguồn main, tôi sẽ giữ mọi thứ dưới src/

bạn có thể xem thêm thông tin về sourcesets và làm thế nào sourcesets nhiều được kết hợp ở đây: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Sourcesets-and-Dependencies

+0

Cảm ơn bạn đã nhận được trở lại quá nhanh .. !! Tôi có thư mục riêng đã được tạo cho các productFlavors khác nhau. Nhưng đối với một số lý do nó có vẻ là chọn sai. Tôi sẽ chỉnh sửa câu hỏi của mình ở đây để làm nổi bật điều đó. Tôi đang cố gắng trao đổi một tập tin .so từ jniLibs/armeabi dựa trên productFlavors – user2511882

+0

Vị trí thực tế của các thư mục không quan trọng. Tôi sẽ chỉnh sửa câu trả lời của mình. –

+0

Xin lỗi vì phản hồi bị trì hoãn. Bây giờ tôi hoàn toàn bối rối. Tôi đã chỉnh sửa câu hỏi của mình. Đơn giản chỉ cần đặt tôi muốn trao đổi ra jniLibs và thư mục thô để xây dựng bản phát hành. Những gì cần phải được thực hiện? Cảm ơn!!! – user2511882

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