无法使用 productFlavors 在库中导入 android 支持 v4 或 v7
Fail to import android support v4 or v7 in library using productFlavors
我正在设置具有不同 productFlavors 的 Android 库 。
该库具有 light 和 full 风格。文件设置正确:
src/main/java/com/example/...
主 类
src/full/java/com/example/...
完整 类
src/light/java/com/example/...
灯 类
Android Studio 正确地理解了这一点,并为完整的风格添加了 (full)
。
问题: okhttp
等依赖项按预期工作,但 appcompat-v7
没有。一切都使用 ViewPager
、FragmentActivity
、RecyclerView
。我已经尝试将依赖项添加到 fullCompile
但它也没有用。 Android Studio 未解决依赖关系,导入不工作,但可以 okhttp
、exoplayer
等。
我已经尝试 Invalidate Cache/Restart
、clean Project
、Resync gradle
、none 成功了。
图书馆 build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
...
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
minifyEnabled false
}
}
lintOptions {
abortOnError false
}
publishNonDefault true
productFlavors {
full {
}
light {
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:23.1.1'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.squareup.okhttp:okhttp:2.3.0'
fullCompile 'com.android.support:support-v4:23.1.1'
fullCompile 'com.android.support:appcompat-v7:23.1.1'
fullCompile 'com.android.support:recyclerview-v7:23.1.1'
fullCompile 'com.squareup.picasso:picasso:2.5.0'
}
应用程序 build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
buildTypes {
release {
}
}
productFlavors {
full {
}
light {
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.+'
compile 'com.android.support:support-v4:23.+'
compile 'com.google.android.gms:play-services-base:7.5.0'
compile 'com.google.android.gms:play-services-ads:7.5.0'
compile 'com.google.android.gms:play-services-location:7.5.0'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
fullCompile project(path: ':library', configuration: 'fullRelease')
lightCompile project(path: ':library', configuration: 'lightRelease')
}
您必须在应用程序中声明配置 gradle。当它与库相关时,配置未正确声明。尝试:
configurations {
fullDebugCompile
fullReleaseCompile
lightDebugCompile
lightReleaseCompile
}
dependencies {
...
fullDebugCompile project(path:":library", configuration:"fullDebug")
fullReleaseCompile project(path:":library", configuration:"fullRelease")
lightDebugCompile project(path:":library", configuration:"lightDebug")
lightReleaseCompile project(path:":library", configuration:"lightRelease")
}
详细解释
gradle android 插件对应用程序和库使用不同的实现,分别称为 AppVariant
和 LibraryVariant
。有时,变体和构建类型在两种项目中的工作方式是不同的。在这种情况下,前段时间库总是在给定变体中以发布构建类型编译,这使得库项目不像应用程序那样灵活。
这就是为什么他们决定启用 publishNonDefault
选项并在 Android Studio 中引入对此类行为的支持,这样您就可以在应用程序的不同构建中使用不同构建的库,但您必须指定哪个构建使用哪个库。这就是让您明确声明 configurations
的原因。
Android 构建工具团队使用的约定名称是 {buildType}{flavor}TaskName
,因此对于类路径配置,您必须使用相同的名称。
所有这些过程都有一个缺点,那就是如果您发布非默认依赖项,android 插件将确保在构建您的应用程序之前编译所有可能的库配置,因此构建时间可以增加一点(取决于库大小)
我正在设置具有不同 productFlavors 的 Android 库 。 该库具有 light 和 full 风格。文件设置正确:
src/main/java/com/example/...
主 类
src/full/java/com/example/...
完整 类
src/light/java/com/example/...
灯 类
Android Studio 正确地理解了这一点,并为完整的风格添加了 (full)
。
问题: okhttp
等依赖项按预期工作,但 appcompat-v7
没有。一切都使用 ViewPager
、FragmentActivity
、RecyclerView
。我已经尝试将依赖项添加到 fullCompile
但它也没有用。 Android Studio 未解决依赖关系,导入不工作,但可以 okhttp
、exoplayer
等。
我已经尝试 Invalidate Cache/Restart
、clean Project
、Resync gradle
、none 成功了。
图书馆 build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
...
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
minifyEnabled false
}
}
lintOptions {
abortOnError false
}
publishNonDefault true
productFlavors {
full {
}
light {
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:23.1.1'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.squareup.okhttp:okhttp:2.3.0'
fullCompile 'com.android.support:support-v4:23.1.1'
fullCompile 'com.android.support:appcompat-v7:23.1.1'
fullCompile 'com.android.support:recyclerview-v7:23.1.1'
fullCompile 'com.squareup.picasso:picasso:2.5.0'
}
应用程序 build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
buildTypes {
release {
}
}
productFlavors {
full {
}
light {
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.+'
compile 'com.android.support:support-v4:23.+'
compile 'com.google.android.gms:play-services-base:7.5.0'
compile 'com.google.android.gms:play-services-ads:7.5.0'
compile 'com.google.android.gms:play-services-location:7.5.0'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
fullCompile project(path: ':library', configuration: 'fullRelease')
lightCompile project(path: ':library', configuration: 'lightRelease')
}
您必须在应用程序中声明配置 gradle。当它与库相关时,配置未正确声明。尝试:
configurations {
fullDebugCompile
fullReleaseCompile
lightDebugCompile
lightReleaseCompile
}
dependencies {
...
fullDebugCompile project(path:":library", configuration:"fullDebug")
fullReleaseCompile project(path:":library", configuration:"fullRelease")
lightDebugCompile project(path:":library", configuration:"lightDebug")
lightReleaseCompile project(path:":library", configuration:"lightRelease")
}
详细解释
gradle android 插件对应用程序和库使用不同的实现,分别称为 AppVariant
和 LibraryVariant
。有时,变体和构建类型在两种项目中的工作方式是不同的。在这种情况下,前段时间库总是在给定变体中以发布构建类型编译,这使得库项目不像应用程序那样灵活。
这就是为什么他们决定启用 publishNonDefault
选项并在 Android Studio 中引入对此类行为的支持,这样您就可以在应用程序的不同构建中使用不同构建的库,但您必须指定哪个构建使用哪个库。这就是让您明确声明 configurations
的原因。
Android 构建工具团队使用的约定名称是 {buildType}{flavor}TaskName
,因此对于类路径配置,您必须使用相同的名称。
所有这些过程都有一个缺点,那就是如果您发布非默认依赖项,android 插件将确保在构建您的应用程序之前编译所有可能的库配置,因此构建时间可以增加一点(取决于库大小)