내 앱에는 여러 시장 인앱 결제 시스템에 대한 여러 가지 특징이 있습니다.
내 모든 프로젝트의 기본 코드를 공유하는 단일 라이브러리가 있습니다. 그래서 저는 이러한 결제 시스템을 제품 맛으로이 라이브러리에 추가하기로 결정했습니다.
문제는 Android 라이브러리에 제품 맛이있을 수 있습니까?
그렇다면 앱의 각 버전에 다른 버전을 어떻게 포함시킬 수 있습니까?
검색을 많이했지만이 시나리오에 대해 아무것도 찾을 수 없었습니다. 내가 찾은 유일한 가까운 점은 http://tools.android.com/tech-docs/new-build-system/user-guide입니다 .
dependencies {
    flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
    flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}
구성을 다른 것으로 변경했지만 작동하지 않았습니다!
Android Studio 0.8.2를 사용하고 있습니다.
답변
마지막으로이 작업을 수행하는 방법을 알아 냈으며 동일한 문제에 직면 한 다른 사용자를 위해 여기에서 설명하겠습니다.
핵심 부분은 라이브러리 build.gradle에서 publishNonDefault를 true로 설정하는 것입니다. 그런 다음 사용자 가이드에서 제안한대로 종속성을 정의해야합니다.
전체 프로젝트는 다음과 같습니다.
라이브러리 build.gradle :
apply plugin: 'com.android.library'
android {
    ....
    publishNonDefault true
    productFlavors {
        market1 {}
        market2 {}
    }
}
프로젝트 build.gradle :
apply plugin: 'com.android.application'
android {
    ....
    productFlavors {
        market1 {}
        market2 {}
    }
}
dependencies {
    ....
    market1Compile project(path: ':lib', configuration: 'market1Release')
    market2Compile project(path: ':lib', configuration: 'market2Release')
}
이제 앱 버전과 빌드 변형 패널을 선택할 수 있으며 그에 따라 라이브러리가 선택되고 선택한 버전에 따라 모든 빌드 및 실행이 수행됩니다.
라이브러리를 기반으로하는 여러 앱 모듈이있는 경우 Android Studio는 변형 선택 충돌에 대해 불평 할 것입니다. 괜찮습니다. 무시하면됩니다.
답변
알리 대답 에는 한 가지 문제가 있습니다 . 빌드 변형에서 하나의 매우 중요한 차원을 잃고 있습니다. 모든 옵션 (아래의 예에서는 4 (2 x 2))을 원하면 기본 모듈 build.gradle 파일 에 사용자 지정 구성 을 추가 하기 만하면 . 또한 라이브러리 모듈 build.gradle 에서 publishNonDefault를 true 로 설정 해야합니다 .Build Variants 파일 합니다.
솔루션 예 :
Lib build.gradle
android {
    publishNonDefault true
    buildTypes {
        release {
        }
        debug {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}
앱 build.gradle
android {
    buildTypes {
        debug {
        }
        release {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}
configurations {
    freeDebugCompile
    paidDebugCompile
    freeReleaseCompile
    paidReleaseCompile
}
dependencies {
    freeDebugCompile project(path: ':lib', configuration: 'freeDebug')
    paidDebugCompile project(path: ':lib', configuration: 'paidDebug')
    freeReleaseCompile project(path: ':lib', configuration: 'freeRelease')
    paidReleaseCompile project(path: ':lib', configuration: 'paidRelease')
}
답변
Android 플러그인 3.0.0 이상 업데이트
공식 Android 문서- 로컬 모듈에 대한 종속성 구성 마이그레이션 에 따르면 ,
변형 인식 종속성 해결을 사용하면 더 이상 로컬 모듈 종속성에 대해 freeDebugImplementation과 같은 변형 별 구성을 사용할 필요가 없습니다. 플러그인이이를 처리합니다.
대신 다음과 같이 종속성을 구성해야합니다.
dependencies {
    // This is the old method and no longer works for local
    // library modules:
    // debugImplementation project(path: ':library', configuration: 'debug')
    // releaseImplementation project(path: ':library', configuration: 'release')
    // Instead, simply use the following to take advantage of
    // variant-aware dependency resolution. You can learn more about
    // the 'implementation' configuration in the section about
    // new dependency configurations.
    implementation project(':library')
    // You can, however, keep using variant-specific configurations when
    // targeting external dependencies. The following line adds 'app-magic'
    // as a dependency to only the "debug" version of your module.
    debugImplementation 'com.example.android:app-magic:12.3'
}
그래서 Ali의 대답에서
dependencies {
    ....
    market1Compile project(path: ':lib', configuration: 'market1Release')
    market2Compile project(path: ':lib', configuration: 'market2Release')
}
에
implementation project(':lib')
플러그인은 변형 별 구성을 자동으로 처리합니다. Android Studio 플러그인을 3.0.0 이상으로 업그레이드하는 다른 사용자에게 도움이되기를 바랍니다.
답변
내 Android 플러그인은 3.4.0이며 지금 구성이 필요하지 않습니다. 애플리케이션의 flavorDimensions 및 productFlavors가 라이브러리에 동일한 flavorDimensions 및 productFlavor의 productFlavor 하나를 포함하는지 확인하기 만하면됩니다.
mylibrary의 build.gradle에서
apply plugin: 'com.android.library'
android {
    ....
    flavorDimensions "mylibFlavor"
    productFlavors {
        market1
        market2
    }
}
응용 프로그램의 build.gradle :
apply plugin: 'com.android.application'
android {
    ....
    flavorDimensions "mylibFlavor", "appFlavor"
    productFlavors {
        market1 {
            dimension "mylibFlavor"
        }
        market2 {
            dimension "mylibFlavor"
        }
        common1 {
            dimension "appFlavor"
        }
        common2 {
            dimension "appFlavor"
        }
    }
}
dependencies {
    ....
    implementation project(path: ':mylibrary')
}
답변
AAR 라이브러리에서 작동하는 플레이버를 얻으려면 Android 라이브러리 모듈의 build.gradle 파일에 defaultPublishConfig를 정의해야합니다.
자세한 내용은 도서관 출판물을 참조하십시오 .
도서관 출판
기본적으로 라이브러리는 릴리스 변형 만 게시합니다. 이 변형은 자체적으로 빌드하는 변형에 관계없이 라이브러리를 참조하는 모든 프로젝트에서 사용됩니다. 이것은 제거를 위해 노력하고있는 Gradle 제한으로 인한 일시적인 제한입니다. 게시 할 변형을 제어 할 수 있습니다.
android {defaultPublishConfig “debug”}
이 게시 구성 이름은 전체 변형 이름을 참조합니다. 릴리스 및 디버그는 플레이버가없는 경우에만 적용 가능합니다. 특징을 사용하는 동안 게시 된 기본 변형을 변경하려면 다음과 같이 작성합니다.
android {defaultPublishConfig “flavor1Debug”}
답변
현재로서는 가능하지 않지만 올바르게 기억하면 추가하려는 기능입니다. (편집 2 : link , link2 )
편집 : 현재 defaultPublishConfig어떤 라이브러리 변형이 게시되는지 선언하는 옵션을 사용하고 있습니다.
android {
    defaultPublishConfig fullRelease
    defaultPublishConfig demoRelease
}
답변
이 주제가 닫혔다는 것을 알고 있지만 gradle 3.0의 업데이트 일뿐입니다. https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware 및 grep을 참조하십시오. matchingFallbacks과missingDimensionStrategy . 이제 모듈 버전 간의 종속성을 선언하는 것이 훨씬 더 간단 해졌습니다.
… 그리고 gradle3.0의 정확한 경우에는 플레이버가 동일한 이름을 공유하기 때문에 gradle은 마법처럼 매핑 할 것이며 구성이 필요하지 않습니다.