Gradle (android experimental plugin) ignores a project dependency
Asked Answered
C

4

10

I'm using Gradle Android Experimental plugin in the following project structure:

Root Project
|-- app
|-- my-library

settings.gradle

include ':my-library', ':app'

build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.2.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

app/build.gradle

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.0"

        defaultConfig.with {
            applicationId = "a.bundle.id"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }

    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.pro')
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile project(':my-library')
}

my-library/build.gradle

apply plugin: 'com.android.model.library'

model {
    android {
        compileSdkVersion = 'android-23'
        buildToolsVersion = '23.0.1'

        defaultConfig.with {
            minSdkVersion.apiLevel = 15
        }
    }

    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles += file('proguard-rules.txt')
        }
    }

    android.ndk {
        moduleName = "xxx"
        CFlags += "-I" + "${project.buildDir}".toString() + "/../src/main/jni/libabecs/include"
        CFlags += "-std=gnu99"
    }
    android.sources {
        main {
            jni {
                source {
                    srcDir 'src/main/jni/libxxx/src'
                }
            }
        }
    }
    android.productFlavors {
        create("arm") {
            ndk.abiFilters += "armeabi"
        }
        create("arm7") {
            ndk.abiFilters += "armeabi-v7a"
        }
        create("arm8") {
            ndk.abiFilters += "arm64-v8a"
        }
        create("x86") {
            ndk.abiFilters += "x86"
        }
        create("x86-64") {
            ndk.abiFilters += "x86_64"
        }
        create("mips") {
            ndk.abiFilters += "mips"
        }
        create("mips-64") {
            ndk.abiFilters += "mips64"
        }

        create("all")
    }
}

The library project builds perfectly fine. In Android Studio, it doesn't show any error. However, when attempting to build this project with Gradle, it'll only attempt to build the app project and will practically ignore the my-library dependency, rendering class not found errors.

How to solve this?

Chitchat answered 22/9, 2015 at 21:37 Comment(1)
it looks like a plugin issue, have you filed a bug report?Chally
C
5

Apparently it's a bug/feature not implemented in the build plugin.

I only found a dirty workaround to link the generated aar directly.

build.gradle (someappname)

repositories {
    flatDir {
        dirs '../my-library/build/outputs/aar'
    }
}

dependencies {
    compile project(':my-library')
    compile(name:'my-library-{flavour}', ext:'aar')
    //the rest
}
Chally answered 27/11, 2015 at 9:10 Comment(0)
S
0

I faced the exact same problem, and finally found out that the path to the ndk sources in my library project was wrong, and that I had to add:

dependencies {
    project ":myHybridLib"
}

in the android.sources.main.jni of the main project.

After correcting those errors, everything compiles just fine.

Scharaga answered 14/12, 2015 at 16:19 Comment(0)
P
0

change my_library/build.gradle to something like this :

apply plugin: 'com.android.model.library'

model {

android {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.1"

    defaultConfig.with {
        minSdkVersion.apiLevel = 15
        targetSdkVersion.apiLevel = 23
    }
}

android.ndk {
    moduleName = "FlatBuffersParser"
    cppFlags.addAll(['-std=c++11', '-fexceptions', '-Wall', '-Wno-literal-suffix'])
    cppFlags.add("-I${file("src/main/jni/flatbufferslib")}".toString())
    ldLibs.addAll(["android", "log"])
    stl = "gnustl_shared"
   }
}

for more info about structure see this project in github, it uses experimental v0.4.0 in two android module :

https://github.com/frogermcs/FlatBuffs

Presbytery answered 6/1, 2016 at 21:53 Comment(0)
R
-3

Faced the same issue. I workaround it by renaming app submodule to something else. So the project structure will be

Root Project
|-- someappname
|-- my-library

settings.gradle:

include ':my-library', ':someappname'
Replication answered 11/10, 2015 at 11:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.