2013-10-28 3 views
12

나는 한동안 gradle 및 변형 변형에 어려움을 겪어 왔습니다.gradle 빌드 변형에 대한 폴더 명명 규칙

  • 디버그
  • 릴리스

그리고이 맛 :

  • 무료
0을 지불 내가 가진

는 이러한 정의 유형을 구축

특정 빌드 변형에 대해 고유 한 리소스와 자산을 어떻게 정의 할 수 있습니까? FreeDebug? 예를 들어, 빌드 변형에 따라 네 가지 앱 이름과 각 변형에 대해 다른 아이콘을 원합니다.

답변

12

나는 동일한 문제로 고심하고있다. 처음에는 소스 컨트롤에 두 개의 브랜치를 사용 했었지만 동기화를 유지하는 데 큰 어려움이있었습니다. Gradle은 매우 유연한 빌드 시스템이지만 기본 규칙만으로는 충분하지 않습니다. 여기 어떻게 내 코드베이스에서 마침내 해결했다. 나는 둘 다 맛에 대한 일반적인 모든 것을 유지

+ src 
    + main 
    | + res 
    | | + values 
    | | - strings.xml 
    | + java 
    | ... 
    + debug 
    | + free 
    | | + res 
    | | + values 
    | |  - strings.xml 
    | + paid 
    | + res 
    | + values 
    |  - strings.xml 
    + free 
    | + res 
    | | + values 
    | | - strings.xml 
    | + java 
    | ... 
    + paid 
    + res 
    | + values 
    | - strings.xml 
    + java 
     ... 

주요 폴더에서 :

나는 (간체) 기본적으로 다음 디렉토리 구조로 끝났다. 무료 폴더에서 나는 무료 버전 (유료)과 관련된 모든 것을 유지합니다. flavor 폴더에있는 파일들은 메인 위에 오버레이됩니다.

기본 오버레이 규칙은 동일한 이름의 "src"아래에있는 폴더를 사용하여 "무료"및 "유료"제품의 맛을 처리합니다. 나를 위해 시작된 문제는 빌드 유형의 오버레이에서 시작됩니다.

맛 내기 폴더와 동일한 구조로 디버그 폴더를 만든 경우 현재 사용 된 맛 내기 폴더 위에 덮어 씁니다. 이로 인해 두 가지 맛의 디버그 이름이 같았지만 맛에 따라 다른 디버그 이름이 필요했습니다. 몇 가지 연구 끝에 필자의 빌드 파일을 다음과 같이 수정했다.

... 

android { 
    buildTypes { 
     debug { 
      ... 
     } 
     release { 
      ... 
     } 
    } 

    productFlavors { 
     free {} 
     paid {} 
    } 
} 

android.applicationVariants.all { variant -> 
    if (variant.buildType.name == "release") { 
     ... 
    } 
    else if (variant.buildType.name == "debug") { 
     switch (variant.name) { 
      case "FreeDebug": 
       variant.mergeResources.doFirst { 
        android.sourceSets.debug.setRoot("src/debug/free") 
       } 
       break; 
      case "PaidDebug": 
       variant.mergeResources.doFirst { 
        android.sourceSets.debug.setRoot("src/debug/paid") 
       } 
       break; 
     } 
    } 
} 

... 

이제 빌드 변형은 먼저 다음 폴더를 오버레이로 지어 질 것이다 :

PaidRelease -> /src/main + /src/paid 
PaidDebug -> /src/main + /src/paid + /src/debug/paid 

FreeRelease -> /src/main + /src/free 
FreeDebug -> /src/main + /src/free + /src/debug/free 
11

Gradle Sourcesets and Dependencies guide마다 새 빌드 또는 src/paidRelease/res 등을 추가하여 각 빌드 변형에 대한 특정 특성을 사용자 지정할 수 있습니다.

+0

에 존재할 수 있도록 기본 폴더에서 삭제 그리고 당신은 하나 개의 아이콘을 변경하지하려면 전체 리소스 트리를 복제한다? – powder366

+2

src/main/res는 모든 빌드에 적용되므로 빌드 변형마다 다른 리소스를 빌드 변형 특정 폴더에 추가하기 만하면됩니다. – ianhanniballake

+0

감사합니다! 하지만 내가 이클립스에서 스튜디오로 프로젝트를 변환 할 때 나는 src/main/java를 얻지 못했다. 예를 들어 sourceSets의 경우 기본 (기본 설정 인 것처럼)을 가져야합니다. 이걸 어떻게 처리해야할지 모르겠다. – powder366

1

폴더 구조이어야한다 변종을 구축 만드는 동안 :

app 
    | 
    ->src 
     | 
     ->buildvariantname1(as defined in gradle) 
          | 
          ->java (follow the same structure here, as in main folder) 
          ->res (follow the same structure here, as in main folder)  

을 이제 특정 선택에 변형은 buildVariantname1debug와 마찬가지로이 변형에 따라 res 폴더에 작성된 변경 사항이 선택됩니다.

res-> values ​​폴더 아래에서 string.xml 아래에 앱 이름을 정의해야 앱 이름이 각 빌드 변수의 xml 값에 따라 반입됩니다. 앱 아이콘도 마찬가지입니다.

첫 번째 이미지는 빌드 변종을 (다른 패키지 이름을 가진 맛)
enter image description here

두 번째 이미지 쇼, 어떻게 프로젝트 구조는 각 맛이 다른 코드, 드로어 블을 갖고 싶어처럼 보이는를 선언하는 방법을 보여줍니다 명백히 나타납니다. 마음 MainActivity에 보관는 각 빌드 변형

enter image description here