내 앱에는 여러 시장 인앱 결제 시스템에 대한 여러 가지 특징이 있습니다.
내 모든 프로젝트의 기본 코드를 공유하는 단일 라이브러리가 있습니다. 그래서 저는 이러한 결제 시스템을 제품 맛으로이 라이브러리에 추가하기로 결정했습니다.
문제는 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은 마법처럼 매핑 할 것이며 구성이 필요하지 않습니다.