You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cordova.apache.org by "Maffett, Ian" <ia...@intel.com> on 2015/05/18 15:18:16 UTC

Cordova 5 - Android and 3rd party libraries question

I’ve run into a few issues with Cordova CLI5, Android 4 and libraries/frameworks.  I will try to explain below, but the issue appears to be related to the dependency section in build.gradle and each librarie’s build.gradle file.

We’ve developed a plugin to enable expansion files on Android.  It is dependent on three custom Android libraries, which declare in the plugin.xml file.

<framework src="AndroidLibrary/GoogleExtras/play_licensing/library" custom="true" />
<framework src="AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library" custom="true"/>
<framework src="AndroidLibrary/GoogleExtras/play_apk_expansion/zip_file" custom="true" />’


The first problem we ran into we will be submitting a patch to fix.  The issue is that the project’s folder name was prepended to the path when it was created. We could not reference this in the build-extras.gradle due to the constant name change.  Below is an example where my project’s directory from cordova create is “foobar"

org.apache.cordova.xapkreader/foobar-library

I spoke with Andrew Grieve via email and he recommend changing the build.js file in cordova-android to enable the following in creating the settings.gradle .  We can now properly reference the library in a build-extras.gradle

include ":org.apache.cordova.xapkreader:library"
project(":org.apache.cordova.xapkreader:library").projectDir = new File("org.apache.cordova.xapkreader/foobar-library”)


The second issue we are running into is bigger.  Whenever we run a build, we get DEX errors.  There are two specific cases we are running into.  The first is for general Cordova errors, the second is specific to our AndroidLibrary/GoogleExtras/play_licensing/library .

com.android.dex.DexException: Multiple dex files define

I believe this is due to the following

  1.  The main build.gradle has dependencies to all the sub projects/libraries which get built
  2.  The libraries each have their own build.gradle which has a dependency on CordovaLib

In the general case, it appears that with each library CordovaLib is being compiled into the jar and causes the error for DEX since it includes multiple definitions.  If I open up Android studio and change each libraries build.gradle dependency to only have the following (the reference to CordovaLib was removed)


dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

This removes the DEX errors for Cordova.   The issue specific to our plugin is that I have to modify the main build.gradle dependency to remove the references for the following, which is a custom library we’ve declared.


debugCompile project(path: ":org.apache.cordova.xapkreader:library", configuration: "debug")
releaseCompile project(path: ":org.apache.cordova.xapkreader:library", configuration: "release")

Removing those references allows the AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library build-extras.gradle file to reference it and build successfully.

dependencies {
    compile(project(':org.apache.cordova.xapkreader:library'))
    compile fileTree(dir: 'libs', include: '*.jar')
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@cordova.apache.org
For additional commands, e-mail: dev-help@cordova.apache.org


Re: Cordova 5 - Android and 3rd party libraries question

Posted by Andrew Grieve <ag...@chromium.org>.
Finally got around to looking at this.

Cloned & was able to reproduce the error.

Changing the build-extras.gradle to:

dependencies {
    debugCompile project(path: ':org.apache.cordova.xapkreader:library',
configuration: "debug")
    releaseCompile project(path: ':org.apache.cordova.xapkreader:library',
configuration: "release")
}

Fixed it for me. Probably gradle's not de-duping correctly when mixing
compile("foo"), and debugCompile("foo")

On Thu, May 21, 2015 at 9:19 AM, Maffett, Ian <ia...@intel.com> wrote:

> Thanks for the info Andrew.  I did confirm I was able to build with your
> plugin fine.  It looks like that was a red herring on my end.
>
> I¹ve pushed up a github repo showing the DEX issue.  You should be able to
> clone it and
> run cordova commands.  This does have the fix to generate the proper
> settings.gradle file.
>
> https://github.com/imaffett/gradle-dex-issue
>
>
> One thing to note -
> https://github.com/imaffett/gradle-dex-issue/blob/master/platforms/android/
> org.apache.cordova.xapkreader/foobar-downloader_library/build-extras.gradle
>
> If I do not have compile in there, then I get reference errors trying to
> build.  I think
> this is causing the DEX issue since the main build.gradle is building
> project(':org.apache.cordova.xapkreader:library¹)
>
>
> Thanks,
> Ian
>
> On 5/19/15, 8:05 PM, "Andrew Grieve" <ag...@chromium.org> wrote:
>
> >Hmm, I've written a couple of other plugins that don't suffer from
> >multiple
> >dex exceptions. I forget the first, but the second is:
> >
> >https://github.com/MobileChromeApps/cordova-plugin-background-app
> >
> >So, I think there might be something else going on besides the plugin's
> >lib
> >having a dependency on CordovaLib (this is what allows plugin library
> >projects to reference Cordova APIs)
> >
> >On Mon, May 18, 2015 at 9:18 AM, Maffett, Ian <ia...@intel.com>
> >wrote:
> >
> >> I¹ve run into a few issues with Cordova CLI5, Android 4 and
> >> libraries/frameworks.  I will try to explain below, but the issue
> >>appears
> >> to be related to the dependency section in build.gradle and each
> >>librarie¹s
> >> build.gradle file.
> >>
> >> We¹ve developed a plugin to enable expansion files on Android.  It is
> >> dependent on three custom Android libraries, which declare in the
> >> plugin.xml file.
> >>
> >> <framework src="AndroidLibrary/GoogleExtras/play_licensing/library"
> >> custom="true" />
> >> <framework
> >> src="AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library"
> >> custom="true"/>
> >> <framework src="AndroidLibrary/GoogleExtras/play_apk_expansion/zip_file"
> >> custom="true" />¹
> >>
> >>
> >> The first problem we ran into we will be submitting a patch to fix.  The
> >> issue is that the project¹s folder name was prepended to the path when
> >>it
> >> was created. We could not reference this in the build-extras.gradle due
> >>to
> >> the constant name change.  Below is an example where my project¹s
> >>directory
> >> from cordova create is ³foobar"
> >>
> >> org.apache.cordova.xapkreader/foobar-library
> >>
> >> I spoke with Andrew Grieve via email and he recommend changing the
> >> build.js file in cordova-android to enable the following in creating the
> >> settings.gradle .  We can now properly reference the library in a
> >> build-extras.gradle
> >>
> >> include ":org.apache.cordova.xapkreader:library"
> >> project(":org.apache.cordova.xapkreader:library").projectDir = new
> >> File("org.apache.cordova.xapkreader/foobar-library²)
> >>
> >>
> >> The second issue we are running into is bigger.  Whenever we run a
> >>build,
> >> we get DEX errors.  There are two specific cases we are running into.
> >>The
> >> first is for general Cordova errors, the second is specific to our
> >> AndroidLibrary/GoogleExtras/play_licensing/library .
> >>
> >> com.android.dex.DexException: Multiple dex files define
> >>
> >> I believe this is due to the following
> >>
> >>   1.  The main build.gradle has dependencies to all the sub
> >> projects/libraries which get built
> >>   2.  The libraries each have their own build.gradle which has a
> >> dependency on CordovaLib
> >>
> >> In the general case, it appears that with each library CordovaLib is
> >>being
> >> compiled into the jar and causes the error for DEX since it includes
> >> multiple definitions.  If I open up Android studio and change each
> >> libraries build.gradle dependency to only have the following (the
> >>reference
> >> to CordovaLib was removed)
> >>
> >>
> >> dependencies {
> >>     compile fileTree(dir: 'libs', include: '*.jar')
> >> }
> >>
> >> This removes the DEX errors for Cordova.   The issue specific to our
> >> plugin is that I have to modify the main build.gradle dependency to
> >>remove
> >> the references for the following, which is a custom library we¹ve
> >>declared.
> >>
> >>
> >> debugCompile project(path: ":org.apache.cordova.xapkreader:library",
> >> configuration: "debug")
> >> releaseCompile project(path: ":org.apache.cordova.xapkreader:library",
> >> configuration: "release")
> >>
> >> Removing those references allows the
> >> AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library
> >> build-extras.gradle file to reference it and build successfully.
> >>
> >> dependencies {
> >>     compile(project(':org.apache.cordova.xapkreader:library'))
> >>     compile fileTree(dir: 'libs', include: '*.jar')
> >>  }
> >>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscribe@cordova.apache.org
> >> For additional commands, e-mail: dev-help@cordova.apache.org
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@cordova.apache.org
> For additional commands, e-mail: dev-help@cordova.apache.org
>
>

Re: Cordova 5 - Android and 3rd party libraries question

Posted by "Maffett, Ian" <ia...@intel.com>.
Thanks for the info Andrew.  I did confirm I was able to build with your
plugin fine.  It looks like that was a red herring on my end.

I¹ve pushed up a github repo showing the DEX issue.  You should be able to
clone it and
run cordova commands.  This does have the fix to generate the proper
settings.gradle file.

https://github.com/imaffett/gradle-dex-issue


One thing to note -
https://github.com/imaffett/gradle-dex-issue/blob/master/platforms/android/
org.apache.cordova.xapkreader/foobar-downloader_library/build-extras.gradle

If I do not have compile in there, then I get reference errors trying to
build.  I think
this is causing the DEX issue since the main build.gradle is building
project(':org.apache.cordova.xapkreader:library¹)


Thanks,
Ian

On 5/19/15, 8:05 PM, "Andrew Grieve" <ag...@chromium.org> wrote:

>Hmm, I've written a couple of other plugins that don't suffer from
>multiple
>dex exceptions. I forget the first, but the second is:
>
>https://github.com/MobileChromeApps/cordova-plugin-background-app
>
>So, I think there might be something else going on besides the plugin's
>lib
>having a dependency on CordovaLib (this is what allows plugin library
>projects to reference Cordova APIs)
>
>On Mon, May 18, 2015 at 9:18 AM, Maffett, Ian <ia...@intel.com>
>wrote:
>
>> I¹ve run into a few issues with Cordova CLI5, Android 4 and
>> libraries/frameworks.  I will try to explain below, but the issue
>>appears
>> to be related to the dependency section in build.gradle and each
>>librarie¹s
>> build.gradle file.
>>
>> We¹ve developed a plugin to enable expansion files on Android.  It is
>> dependent on three custom Android libraries, which declare in the
>> plugin.xml file.
>>
>> <framework src="AndroidLibrary/GoogleExtras/play_licensing/library"
>> custom="true" />
>> <framework
>> src="AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library"
>> custom="true"/>
>> <framework src="AndroidLibrary/GoogleExtras/play_apk_expansion/zip_file"
>> custom="true" />¹
>>
>>
>> The first problem we ran into we will be submitting a patch to fix.  The
>> issue is that the project¹s folder name was prepended to the path when
>>it
>> was created. We could not reference this in the build-extras.gradle due
>>to
>> the constant name change.  Below is an example where my project¹s
>>directory
>> from cordova create is ³foobar"
>>
>> org.apache.cordova.xapkreader/foobar-library
>>
>> I spoke with Andrew Grieve via email and he recommend changing the
>> build.js file in cordova-android to enable the following in creating the
>> settings.gradle .  We can now properly reference the library in a
>> build-extras.gradle
>>
>> include ":org.apache.cordova.xapkreader:library"
>> project(":org.apache.cordova.xapkreader:library").projectDir = new
>> File("org.apache.cordova.xapkreader/foobar-library²)
>>
>>
>> The second issue we are running into is bigger.  Whenever we run a
>>build,
>> we get DEX errors.  There are two specific cases we are running into.
>>The
>> first is for general Cordova errors, the second is specific to our
>> AndroidLibrary/GoogleExtras/play_licensing/library .
>>
>> com.android.dex.DexException: Multiple dex files define
>>
>> I believe this is due to the following
>>
>>   1.  The main build.gradle has dependencies to all the sub
>> projects/libraries which get built
>>   2.  The libraries each have their own build.gradle which has a
>> dependency on CordovaLib
>>
>> In the general case, it appears that with each library CordovaLib is
>>being
>> compiled into the jar and causes the error for DEX since it includes
>> multiple definitions.  If I open up Android studio and change each
>> libraries build.gradle dependency to only have the following (the
>>reference
>> to CordovaLib was removed)
>>
>>
>> dependencies {
>>     compile fileTree(dir: 'libs', include: '*.jar')
>> }
>>
>> This removes the DEX errors for Cordova.   The issue specific to our
>> plugin is that I have to modify the main build.gradle dependency to
>>remove
>> the references for the following, which is a custom library we¹ve
>>declared.
>>
>>
>> debugCompile project(path: ":org.apache.cordova.xapkreader:library",
>> configuration: "debug")
>> releaseCompile project(path: ":org.apache.cordova.xapkreader:library",
>> configuration: "release")
>>
>> Removing those references allows the
>> AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library
>> build-extras.gradle file to reference it and build successfully.
>>
>> dependencies {
>>     compile(project(':org.apache.cordova.xapkreader:library'))
>>     compile fileTree(dir: 'libs', include: '*.jar')
>>  }
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@cordova.apache.org
>> For additional commands, e-mail: dev-help@cordova.apache.org
>>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@cordova.apache.org
For additional commands, e-mail: dev-help@cordova.apache.org


Re: Cordova 5 - Android and 3rd party libraries question

Posted by Andrew Grieve <ag...@chromium.org>.
Hmm, I've written a couple of other plugins that don't suffer from multiple
dex exceptions. I forget the first, but the second is:

https://github.com/MobileChromeApps/cordova-plugin-background-app

So, I think there might be something else going on besides the plugin's lib
having a dependency on CordovaLib (this is what allows plugin library
projects to reference Cordova APIs)

On Mon, May 18, 2015 at 9:18 AM, Maffett, Ian <ia...@intel.com> wrote:

> I’ve run into a few issues with Cordova CLI5, Android 4 and
> libraries/frameworks.  I will try to explain below, but the issue appears
> to be related to the dependency section in build.gradle and each librarie’s
> build.gradle file.
>
> We’ve developed a plugin to enable expansion files on Android.  It is
> dependent on three custom Android libraries, which declare in the
> plugin.xml file.
>
> <framework src="AndroidLibrary/GoogleExtras/play_licensing/library"
> custom="true" />
> <framework
> src="AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library"
> custom="true"/>
> <framework src="AndroidLibrary/GoogleExtras/play_apk_expansion/zip_file"
> custom="true" />’
>
>
> The first problem we ran into we will be submitting a patch to fix.  The
> issue is that the project’s folder name was prepended to the path when it
> was created. We could not reference this in the build-extras.gradle due to
> the constant name change.  Below is an example where my project’s directory
> from cordova create is “foobar"
>
> org.apache.cordova.xapkreader/foobar-library
>
> I spoke with Andrew Grieve via email and he recommend changing the
> build.js file in cordova-android to enable the following in creating the
> settings.gradle .  We can now properly reference the library in a
> build-extras.gradle
>
> include ":org.apache.cordova.xapkreader:library"
> project(":org.apache.cordova.xapkreader:library").projectDir = new
> File("org.apache.cordova.xapkreader/foobar-library”)
>
>
> The second issue we are running into is bigger.  Whenever we run a build,
> we get DEX errors.  There are two specific cases we are running into.  The
> first is for general Cordova errors, the second is specific to our
> AndroidLibrary/GoogleExtras/play_licensing/library .
>
> com.android.dex.DexException: Multiple dex files define
>
> I believe this is due to the following
>
>   1.  The main build.gradle has dependencies to all the sub
> projects/libraries which get built
>   2.  The libraries each have their own build.gradle which has a
> dependency on CordovaLib
>
> In the general case, it appears that with each library CordovaLib is being
> compiled into the jar and causes the error for DEX since it includes
> multiple definitions.  If I open up Android studio and change each
> libraries build.gradle dependency to only have the following (the reference
> to CordovaLib was removed)
>
>
> dependencies {
>     compile fileTree(dir: 'libs', include: '*.jar')
> }
>
> This removes the DEX errors for Cordova.   The issue specific to our
> plugin is that I have to modify the main build.gradle dependency to remove
> the references for the following, which is a custom library we’ve declared.
>
>
> debugCompile project(path: ":org.apache.cordova.xapkreader:library",
> configuration: "debug")
> releaseCompile project(path: ":org.apache.cordova.xapkreader:library",
> configuration: "release")
>
> Removing those references allows the
> AndroidLibrary/GoogleExtras/play_apk_expansion/downloader_library
> build-extras.gradle file to reference it and build successfully.
>
> dependencies {
>     compile(project(':org.apache.cordova.xapkreader:library'))
>     compile fileTree(dir: 'libs', include: '*.jar')
>  }
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@cordova.apache.org
> For additional commands, e-mail: dev-help@cordova.apache.org
>
>