Gradle 将所有内容都包含在一个 flavors libs 文件夹中(编译 fileTree 整个 libs 文件夹)编辑:为 so 文件设置每个 flavor 的 sourcedir
Gradle include all in a flavors libs folder (Compile fileTree whole libs folder)Edit: set sourcedir per flavor for so files
所以我想将所有文件和子目录包含在一个风格文件结构中。我在这里所做的是将所有 jar 和 so 文件包含在 libs 文件夹中,但我还想包含目录。
我试过包含 include ['*']
但没用。我也四处寻找了一段时间的答案,但没有找到答案。完成此任务的正确方法是什么?
dependencies {
//format for including lib files for all flavors
compile fileTree(dir: 'libs', include: ['*.jar'])
//format for including all jars and so's in pdf flavor
//pdfCompile fileTree(dir: 'libs', include: ['*.jar'])
pdfCompile fileTree(dir: 'src/pdf/libs', include: ['*.jar','*.so'])
}
当 运行 app 出现以下异常时,告诉我并非所有 .so 文件都包含在内。
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.company.appname-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libPDFNetC-v7a.so"
编辑:下面是我的文件结构。仅供参考:src 是我的模块的子项,并且是 libs 的兄弟。
你是说不同的口味还是不同的模块?
每个模块应该只有 1 个 libs 文件夹。风味是模块的一部分,它们通常位于 myModule/src/flavourName 中。由于每个模块有 1 build.gradle,因此所有版本都共享该模块的库目录。
我猜你想包含所有模块的 libs 文件夹。通常这是通过在模块目录级别创建一个文件夹,将所有共享库放入其中,然后在每个模块的 build.gradle 文件中引用它来完成的。有点难看,但有效。
编辑:@Theyouthis,能否请您添加您目前的目录结构。通常,说到口味,我见过这样的结构:
module1/
libs/
src/
flavour1/
flavour2/
flavour3/
build.gradle
所以在这样的结构中,您将把所有的库放在 libs/ 中,然后它们将被共享给您的所有口味。
我想我可以通过改变我的搜索条件找到解决方案,但对于那些犯同样错误的人,我将展示我是如何解决这个问题的。
似乎真正的问题是 gradle 在使用 flavorCompile filetree 方法时只能处理指定 libs 文件夹中的 jar 文件。
您可以通过在 android 下的 sourceSets 中指定一个 flavor.jniLibs.srcDir
来解决这个问题。对于下面的文件结构(在我拒绝展示的模块中),您可以像这样分离一个 flavors libs 文件。
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
publishNonDefault true
defaultConfig {
minSdkVersion 16
targetSdkVersion 21
}
//product flavors merge their respective folders in src with main
productFlavors{
pdf{}
nopdf{}
}
buildTypes {
release{
minifyEnabled false
//proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{ minifyEnabled false }
}
sourceSets{
pdf.jniLibs.srcDirs = ['src/pdf/libs']
}
}
dependencies {
//format for including lib jar files for all flavors
compile fileTree(dir: 'libs', include: ['*.jar'])
//libs jar files for specific flavor
pdfCompile fileTree(dir: 'src/pdf/libs', include: ['*.jar'])
}
所以我想将所有文件和子目录包含在一个风格文件结构中。我在这里所做的是将所有 jar 和 so 文件包含在 libs 文件夹中,但我还想包含目录。
我试过包含 include ['*']
但没用。我也四处寻找了一段时间的答案,但没有找到答案。完成此任务的正确方法是什么?
dependencies {
//format for including lib files for all flavors
compile fileTree(dir: 'libs', include: ['*.jar'])
//format for including all jars and so's in pdf flavor
//pdfCompile fileTree(dir: 'libs', include: ['*.jar'])
pdfCompile fileTree(dir: 'src/pdf/libs', include: ['*.jar','*.so'])
}
当 运行 app 出现以下异常时,告诉我并非所有 .so 文件都包含在内。
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.company.appname-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libPDFNetC-v7a.so"
编辑:下面是我的文件结构。仅供参考:src 是我的模块的子项,并且是 libs 的兄弟。
你是说不同的口味还是不同的模块?
每个模块应该只有 1 个 libs 文件夹。风味是模块的一部分,它们通常位于 myModule/src/flavourName 中。由于每个模块有 1 build.gradle,因此所有版本都共享该模块的库目录。
我猜你想包含所有模块的 libs 文件夹。通常这是通过在模块目录级别创建一个文件夹,将所有共享库放入其中,然后在每个模块的 build.gradle 文件中引用它来完成的。有点难看,但有效。
编辑:@Theyouthis,能否请您添加您目前的目录结构。通常,说到口味,我见过这样的结构:
module1/
libs/
src/
flavour1/
flavour2/
flavour3/
build.gradle
所以在这样的结构中,您将把所有的库放在 libs/ 中,然后它们将被共享给您的所有口味。
我想我可以通过改变我的搜索条件找到解决方案,但对于那些犯同样错误的人,我将展示我是如何解决这个问题的。
似乎真正的问题是 gradle 在使用 flavorCompile filetree 方法时只能处理指定 libs 文件夹中的 jar 文件。
您可以通过在 android 下的 sourceSets 中指定一个 flavor.jniLibs.srcDir
来解决这个问题。对于下面的文件结构(在我拒绝展示的模块中),您可以像这样分离一个 flavors libs 文件。
apply plugin: 'com.android.library'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
publishNonDefault true
defaultConfig {
minSdkVersion 16
targetSdkVersion 21
}
//product flavors merge their respective folders in src with main
productFlavors{
pdf{}
nopdf{}
}
buildTypes {
release{
minifyEnabled false
//proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug{ minifyEnabled false }
}
sourceSets{
pdf.jniLibs.srcDirs = ['src/pdf/libs']
}
}
dependencies {
//format for including lib jar files for all flavors
compile fileTree(dir: 'libs', include: ['*.jar'])
//libs jar files for specific flavor
pdfCompile fileTree(dir: 'src/pdf/libs', include: ['*.jar'])
}