clojure-android / lein-droid

A Leiningen plugin for building Clojure/Android projects
Eclipse Public License 1.0
645 stars 56 forks source link

lean profile problem with proguard and build tools >= 24 #157

Closed satchit8 closed 7 years ago

satchit8 commented 7 years ago

Not succeeding in lean compilation for a freshly generated project using:

lein-droid 0.4.6 leiningen 2.7.0 openjdk 7

Commands used to reproduce:

lein new droid coa-lean org.example.coalean :target-sdk 22 cd coa-lean DEBUG=1 lein with-profile lean do clean, droid doall

Some snipped output:

Running Proguard... /opt/android-sdk/tools/proguard/bin/proguard.sh @BLAH-BLAH/coa-lean/build/proguard-minify.cfg -injars BLAH-BLAH/coa-lean/target/release/classes:BLAH-BLAH/.m2/repository/org/skummet/clojure/1.7.0-r2/clojure-1.7.0-r2.jar:BLAH-BLAH/.m2/repository/neko/neko/4.0.0-alpha5/neko-4.0.0-alpha5.jar:BLAH-BLAH/coa-lean/target/release/aar-extracted/com.android.support_multidex_aar_1.0.0/classes.jar -libraryjars /opt/android-sdk/tools/support/annotations.jar:/opt/android-sdk/platforms/android-22/android.jar -outjars BLAH-BLAH/src/coa-samples/working/lean-compilation/coa-lean/target/release/mininified-classes.jar ProGuard, version 4.7 Reading input... Reading program directory [BLAH-BLAH/coa-lean/target/release/classes] Reading program jar [BLAH-BLAH/.m2/repository/org/skummet/clojure/1.7.0-r2/clojure-1.7.0-r2.jar] Reading program jar [BLAH-BLAH/.m2/repository/neko/neko/4.0.0-alpha5/neko-4.0.0-alpha5.jar] Reading program jar [BLAH-BLAH/coa-lean/target/release/aar-extracted/com.android.support_multidex_aar_1.0.0/classes.jar] Reading library jar [/usr/lib/jvm/java-7-openjdk/jre/lib/rt.jar] Reading library jar [/opt/android-sdk/tools/support/annotations.jar] Reading library jar [/opt/android-sdk/platforms/android-22/android.jar] Initializing... Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'void replaceAll(java.util.function.BiFunction)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.lang.Object merge(java.lang.Object,java.lang.Object,java.util.function.BiFunction)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.lang.Object computeIfPresent(java.lang.Object,java.util.function.BiFunction)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.Spliterator Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.util.Spliterator spliterator()' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.lang.Object putIfAbsent(java.lang.Object,java.lang.Object)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'boolean remove(java.lang.Object,java.lang.Object)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.lang.Object compute(java.lang.Object,java.util.function.BiFunction)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.lang.Object replace(java.lang.Object,java.lang.Object)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.lang.Object getOrDefault(java.lang.Object,java.lang.Object)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'boolean replace(java.lang.Object,java.lang.Object,java.lang.Object)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'java.lang.Object computeIfAbsent(java.lang.Object,java.util.function.Function)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'void forEach(java.util.function.BiConsumer)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced method 'void forEach(java.util.function.Consumer)' in class clojure.lang.APersistentMap Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.function.BiFunction Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.function.BiFunction Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.function.BiFunction Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.Spliterator Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.function.BiFunction Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.function.Function Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.function.BiConsumer Warning: clojure.core.proxy$clojure.lang.APersistentMap$ff19274a: can't find referenced class java.util.function.Consumer Warning: there were 9 unresolved references to classes or interfaces. You may need to specify additional library jars (using '-libraryjars'). Warning: there were 13 unresolved references to program class members. Your input classes appear to be inconsistent. You may need to recompile them and try again. Alternatively, you may have to specify the option '-dontskipnonpubliclibraryclassmembers'. java.io.IOException: Please correct the above warnings first. at proguard.Initializer.execute(Initializer.java:321) at proguard.ProGuard.initialize(ProGuard.java:211) at proguard.ProGuard.execute(ProGuard.java:86) at proguard.ProGuard.main(ProGuard.java:492)

Abort execution. Error encountered performing task 'do' with profile(s): 'lean' clojure.lang.ExceptionInfo: Abort execution. {:exit-code 1, :suppress-msg false} at clojure.core$ex_info.invokeStatic(core.clj:4617) at clojure.core$ex_info.invoke(core.clj:4617) at leiningen.core.main$exit.invokeStatic(main.clj:159) at leiningen.core.main$exit.doInvoke(main.clj:151) at clojure.lang.RestFn.applyTo(RestFn.java:139) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.core.main$abort.invokeStatic(main.clj:172) at leiningen.core.main$abort.doInvoke(main.clj:165) at clojure.lang.RestFn.invoke(RestFn.java:408) at leiningen.droid.utils$sh.invokeStatic(utils.clj:295) at leiningen.droid.utils$sh.doInvoke(utils.clj:287) at clojure.lang.RestFn.invoke(RestFn.java:703) at leiningen.droid.build$run_proguard_minifying.invokeStatic(build.clj:46) at leiningen.droid.build$run_proguard_minifying.invoke(build.clj:32) at leiningen.droid.build$create_dex.invokeStatic(build.clj:126) at leiningen.droid.build$create_dex.invoke(build.clj:119) at leiningen.droid.build$build.invokeStatic(build.clj:135) at leiningen.droid.build$build.invoke(build.clj:132) at leiningen.droid$execute_subtask.invokeStatic(droid.clj:101) at leiningen.droid$execute_subtask.invoke(droid.clj:73) at leiningen.droid$doall.invokeStatic(droid.clj:47) at leiningen.droid$doall.doInvoke(droid.clj:42) at clojure.lang.RestFn.invoke(RestFn.java:410) at clojure.lang.AFn.applyToHelper(AFn.java:154) at clojure.lang.RestFn.applyTo(RestFn.java:132) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.droid$execute_subtask.invokeStatic(droid.clj:104) at leiningen.droid$execute_subtask.invoke(droid.clj:73) at leiningen.droid$droid.invokeStatic(droid.clj:67) at leiningen.droid$droid.doInvoke(droid.clj:49) at clojure.lang.RestFn.invoke(RestFn.java:423) at clojure.lang.Var.invoke(Var.java:383) at clojure.lang.AFn.applyToHelper(AFn.java:156) at clojure.lang.Var.applyTo(Var.java:700) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.core.main$partial_task$fn6099.doInvoke(main.clj:272) at clojure.lang.RestFn.applyTo(RestFn.java:139) at clojure.lang.AFunction$1.doInvoke(AFunction.java:29) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.core.main$apply_task.invokeStatic(main.clj:322) at leiningen.core.main$apply_task.invoke(main.clj:308) at leiningen.core.main$resolve_and_apply.invokeStatic(main.clj:328) at leiningen.core.main$resolve_and_apply.invoke(main.clj:324) at leiningen.do$do.invokeStatic(do.clj:40) at leiningen.do$do.doInvoke(do.clj:32) at clojure.lang.RestFn.invoke(RestFn.java:460) at clojure.lang.Var.invoke(Var.java:394) at clojure.lang.AFn.applyToHelper(AFn.java:165) at clojure.lang.Var.applyTo(Var.java:700) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.core.main$partial_task$fn6099.doInvoke(main.clj:272) at clojure.lang.RestFn.applyTo(RestFn.java:139) at clojure.lang.AFunction$1.doInvoke(AFunction.java:29) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.core.main$apply_task.invokeStatic(main.clj:322) at leiningen.core.main$apply_task.invoke(main.clj:308) at leiningen.with_profile$with_profilesSTAR.invokeStatic(with_profile.clj:14) at leiningen.with_profile$with_profilesSTAR.invoke(with_profile.clj:8) at leiningen.with_profile$apply_task_with_profiles.invokeStatic(with_profile.clj:53) at leiningen.with_profile$apply_task_with_profiles.invoke(with_profile.clj:45) at leiningen.with_profile$with_profile$fn12218.invoke(with_profile.clj:85) at clojure.core$mapv$fn6953.invoke(core.clj:6627) at clojure.core.protocols$fn6755.invokeStatic(protocols.clj:167) at clojure.core.protocols$fn6755.invoke(protocols.clj:124) at clojure.core.protocols$fn6710$G67056719.invoke(protocols.clj:19) at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31) at clojure.core.protocols$fn6738.invokeStatic(protocols.clj:75) at clojure.core.protocols$fn6738.invoke(protocols.clj:75) at clojure.core.protocols$fn6684$G6679__6697.invoke(protocols.clj:13) at clojure.core$reduce.invokeStatic(core.clj:6545) at clojure.core$mapv.invokeStatic(core.clj:6618) at clojure.core$mapv.invoke(core.clj:6618) at leiningen.with_profile$with_profile.invokeStatic(with_profile.clj:85) at leiningen.with_profile$with_profile.doInvoke(with_profile.clj:63) at clojure.lang.RestFn.invoke(RestFn.java:525) at clojure.lang.Var.invoke(Var.java:409) at clojure.lang.AFn.applyToHelper(AFn.java:178) at clojure.lang.Var.applyTo(Var.java:700) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.core.main$partial_task$fn6099.doInvoke(main.clj:272) at clojure.lang.RestFn.applyTo(RestFn.java:139) at clojure.lang.AFunction$1.doInvoke(AFunction.java:29) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invokeStatic(core.clj:648) at clojure.core$apply.invoke(core.clj:641) at leiningen.core.main$apply_task.invokeStatic(main.clj:322) at leiningen.core.main$apply_task.invoke(main.clj:308) at leiningen.core.main$resolve_and_apply.invokeStatic(main.clj:328) at leiningen.core.main$resolve_and_apply.invoke(main.clj:324) at leiningen.core.main$_main$fn__6165.invoke(main.clj:401) at leiningen.core.main$_main.invokeStatic(main.clj:394) at leiningen.core.main$_main.doInvoke(main.clj:391) at clojure.lang.RestFn.invoke(RestFn.java:512) at clojure.lang.Var.invoke(Var.java:409) at clojure.lang.AFn.applyToHelper(AFn.java:178) at clojure.lang.Var.applyTo(Var.java:700) at clojure.core$apply.invokeStatic(core.clj:646) at clojure.main$main_opt.invokeStatic(main.clj:314) at clojure.main$main_opt.invoke(main.clj:310) at clojure.main$main.invokeStatic(main.clj:421) at clojure.main$main.doInvoke(main.clj:384) at clojure.lang.RestFn.invoke(RestFn.java:619) at clojure.lang.Var.invoke(Var.java:430) at clojure.lang.AFn.applyToHelper(AFn.java:195) at clojure.lang.Var.applyTo(Var.java:700) at clojure.main.main(main.java:37)

satchit8 commented 7 years ago

It appears that for Android build tools versions >= 24, JDK 8 is necessary:

Another separate issue is that versions 24 and higher of the Android SDK Build-tools package require Java JDK 8 or higher. This can cause at least 1 error:

“java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported  
major.minor version 52.0”

via:

https://releases.xamarin.com/technical-bulletin-android-sdk-build-tools-24/

According to the Lean compilation Howto page:

NB: To use Proguard you must have exactly JDK7 installed. JDK8 is not supported by Proguard.

via:

https://github.com/clojure-android/lein-droid/wiki/Lean-compilation

A work-around is to disable proguard use in the lean profile, e.g. in project.clj:

  :lean
  [:release
   {...
    :android {...
              :proguard-execute false

I've verified this works for a number of projects.

Thanks @alexander-yakushev for the work-around.