Junior Buckeridge
Junior Buckeridge

Reputation: 2085

Referencing external library projects in Android Studio (v0.8.9)

I have a custom library that needs to be referenced in about 10 projects. Everything works fine in Eclipse but I want to migrate them to Android Studio in order to take advantage of the build system. I've already check

Android studio add external project to build.gradle

How to share a single library source across multiple projects

and some other links and docs in Gradleware but I don't get to make my projects compile.

My file structure is like:

+projects

|+libraryProject

|+---workspace

|+------projectSrc

|

|+project0

|+---workspace

|+------projectSrc0

|

|+project1

|+---workspace

|+------projectSrc1

. .

|+projectN

|+---workspace

|+------projectSrcN

Each project contains docs, design files, etc... and therefore is no convenient to have the src in the same root folder.

In my "project1", settings.gradle file I've used:

include ':module-custom-lib'
project(':module-custom-lib').projectDir = new File(settingsDir, '../../../libraryProject/workspace/projectSrc')

In my build.gradle file, dependencies section I add:

dependencies {
    compile project(':..:..:..:libraryProject:workspace:projectSrc')
    ....
}

But I get an error saying that the project wasn't found.

I've also used the following approach:

def customLib = file('../../../libraryProject/workspace/projectSrc')
settings.createProjectDescriptor(rootProjectDescriptor, 'module-custom-lib', customLib)
include ':module-custom-lib'

Then in the build.gradle

dependencies {
    compile project(':module-custom-lib')
    ....
}

Please help. Thanks for your time.

EDIT: I've managed to get it working by adding the module app as a suffix in the project dir.:

include ':module-custom-lib'
project(':module-custom-lib').projectDir = new File(settingsDir, '../../../libraryProject/workspace/projectSrc/app')

Now the library members resolve perfectly, but the project's 'R' resource class can not be resolved. So if I do:

setContentView(R.layout.main);

it fails to find that resource. Cleaning and rebuilding the project doesn't fixes the issue.

EDIT 2: Apparently, there was a problem with the manifest merging 'cause the problem was fixed once I adjusted the minSdk and targetSdk of both projects. The previous solution work perfectly.

Upvotes: 1

Views: 4321

Answers (2)

Code-Apprentice
Code-Apprentice

Reputation: 83557

You should consider bundling "releases" of your library to a Maven repository (possibly your local Maven repo). This way you can reference your library from any other project that needs to use it just like you do with 3rd party libraries.

Upvotes: 0

Scott Barta
Scott Barta

Reputation: 80020

Your first attempt has a simpler syntax, and should work. Your settings.gradle file looks okay:

include ':module-custom-lib'
project(':module-custom-lib').projectDir = new File(settingsDir, '../../../libraryProject/workspace/projectSrc')

though you should be cautious about including a relative path there -- Android Studio may not use the same working directory as a build you do from the command line, so referencing things relative to rootDir may help alleviate problems.

In the dependencies block of a module's build file, you need to reference a module the same way you do in settings.gradle, so you'd use something like this:

dependencies {
    compile project(':module-custom-lib')
}

In dependencies blocks, you're linking to projects using Gradle's project namespace, and since you've already explicitly set up the root directory of the library module, you don't need to try to locate it in the filesystem here. That :..:..:.. syntax wouldn't work anyway to reference a module that's outside of your project's root directory, as this one is.

Upvotes: 4

Related Questions