clojure-android / lein-droid

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

Multidex problem: Didn't find class "neko.App" #143

Open sakuraiyuta opened 8 years ago

sakuraiyuta commented 8 years ago

In my envoironment, created multidex apk can't execute because ClassLoader can't find neko.App class.

error log:

12-01 19:33:57.202: E/AndroidRuntime(1607): FATAL EXCEPTION: main
12-01 19:33:57.202: E/AndroidRuntime(1607): java.lang.RuntimeException: Unable to instantiate application neko.App: java.lang.ClassNotFoundException: Didn't find class "neko.App" on path: DexPathList[[zip file "/data/app/com.example.multidex_issue.debug-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.multidex_issue.debug-2, /system/lib]]
12-01 19:33:57.202: E/AndroidRuntime(1607):     at android.app.LoadedApk.makeApplication(LoadedApk.java:509)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4417)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at android.app.ActivityThread.access$1300(ActivityThread.java:141)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at android.os.Looper.loop(Looper.java:137)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at android.app.ActivityThread.main(ActivityThread.java:5103)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at java.lang.reflect.Method.invokeNative(Native Method)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at java.lang.reflect.Method.invoke(Method.java:525)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at dalvik.system.NativeStart.main(Native Method)
12-01 19:33:57.202: E/AndroidRuntime(1607): Caused by: java.lang.ClassNotFoundException: Didn't find class "neko.App" on path: DexPathList[[zip file "/data/app/com.example.multidex_issue.debug-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.multidex_issue.debug-2, /system/lib]]
12-01 19:33:57.202: E/AndroidRuntime(1607):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
12-01 19:33:57.202: E/AndroidRuntime(1607):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)

I checked generated dex files by using dex2jar, and found /neko/App.class in classes2.dex. I think it must be contained in classes.dex. so I fixed proguard-multi-dex.cfg(added -keep public class neko.App) but it seems no effects.

sample code is here: https://github.com/sakuraiyuta/example-multidex-issue

You can reproduce the problem. Checkout the code and execute commands as below:

$ ./generate-src.sh # <- It generates 3001 clj files in src/clojure/com/example/multidex_issue/
$ lein clean && lein droid doall
sakuraiyuta commented 8 years ago

Note: You can check some fixes after lein new droid generated. https://github.com/sakuraiyuta/example-multidex-issue/commit/d856ea1ef7bd1d089a051c2c26ae7d680195e9c7

alexander-yakushev commented 8 years ago

Since you have the config in build, it should be :multi-dex-proguard-conf-path "build/proguard-multi-dex.cfg", I think. Try to execute withDEBUG=1` and see which full file path is used exactly.

sakuraiyuta commented 8 years ago

Thx for reply!

I fixed project.clj as below: https://github.com/sakuraiyuta/example-multidex-issue/commit/b3c9c7187c89b40f8e5d48f08368813317073d9a

then execute commands as below:

lein clean && DEBUG=1 lein droid doall | tee build.log

build.log:

Leiningen's classpath: /home/user/.lein/self-installs/leiningen-2.5.0-standalone.jar
Applying task droid to [doall]
Extracting AAR dependencies:  #{[com.android.support/multidex 1.0.0 :extension aar]}
Generating manifest...
Merging secondary manifests: (#<File /home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/AndroidManifest.xml>)
Generating R.java files...
/opt/android-sdk/build-tools/21.1.1/aapt package -f -m -M /home/user/git/example-multidex-issue/target/debug/AndroidManifest.xml -S /home/user/git/example-multidex-issue/target/debug/res -S /home/user/git/example-multidex-issue/res -S /home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/res -I /opt/android-sdk/platforms/android-15/android.jar -J /home/user/git/example-multidex-issue/target/debug/gen --output-text-symbols /home/user/git/example-multidex-issue/target/debug/gen --auto-add-overlay --generate-dependencies

Running javac with [-target 1.6 -source 1.6 -Xlint:-options @/tmp/.leiningen-cmdline947228325897226401.tmp]
Applying task javac to nil
Running javac with [-target 1.6 -source 1.6 -Xlint:-options @/tmp/.leiningen-cmdline301430601603197623.tmp]
Compiling Clojure files...
Project classpath: (/opt/android-sdk/tools/support/annotations.jar /opt/android-sdk/platforms/android-15/android.jar /home/user/git/example-multidex-issue/test /home/user/git/example-multidex-issue/src/clojure /home/user/git/example-multidex-issue/src /home/user/git/example-multidex-issue/resources /home/user/git/example-multidex-issue/target/debug/classes /home/user/.m2/repository/neko/neko/4.0.0-alpha5/neko-4.0.0-alpha5.jar /home/user/.m2/repository/org/clojure/tools.nrepl/0.2.10/tools.nrepl-0.2.10.jar /home/user/.m2/repository/org/clojure-android/clojure/1.7.0-r2/clojure-1.7.0-r2.jar /home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/classes.jar)
Build type: debug, dynamic compilation: enabled, remote REPL: enabled.
Applying task javac to nil
Running javac with [-target 1.6 -source 1.6 -Xlint:-options @/tmp/.leiningen-cmdline4775556264652942805.tmp]
Compiling com.example.multidex-issue.func2639
...
(omit: so many clj file compilation)
...
Compiling com.example.multidex-issue.func1430
Compilation succeeded.
Creating multi DEX....
/opt/android-sdk/tools/proguard/bin/proguard.sh @/home/user/git/example-multidex-issue/build/proguard-multi-dex.cfg -injars /home/user/git/example-multidex-issue/target/debug/classes:/home/user/.m2/repository/neko/neko/4.0.0-alpha5/neko-4.0.0-alpha5.jar:/home/user/.m2/repository/org/clojure/tools.nrepl/0.2.10/tools.nrepl-0.2.10.jar:/home/user/.m2/repository/org/clojure-android/clojure/1.7.0-r2/clojure-1.7.0-r2.jar:/home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/classes.jar -libraryjars /opt/android-sdk/build-tools/21.1.1/lib/shrinkedAndroid.jar -outjars /home/user/git/example-multidex-issue/target/debug/root-classes.jar
ProGuard, version 4.7
Reading program directory [/home/user/git/example-multidex-issue/target/debug/classes]
Reading program jar [/home/user/.m2/repository/neko/neko/4.0.0-alpha5/neko-4.0.0-alpha5.jar]
Reading program jar [/home/user/.m2/repository/org/clojure/tools.nrepl/0.2.10/tools.nrepl-0.2.10.jar]
Reading program jar [/home/user/.m2/repository/org/clojure-android/clojure/1.7.0-r2/clojure-1.7.0-r2.jar]
Reading program jar [/home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/classes.jar]
Reading library jar [/opt/android-sdk/build-tools/21.1.1/lib/shrinkedAndroid.jar]
Preparing output jar [/home/user/git/example-multidex-issue/target/debug/root-classes.jar]
  Copying resources from program directory [/home/user/git/example-multidex-issue/target/debug/classes]
  Copying resources from program jar [/home/user/.m2/repository/neko/neko/4.0.0-alpha5/neko-4.0.0-alpha5.jar]
  Copying resources from program jar [/home/user/.m2/repository/org/clojure/tools.nrepl/0.2.10/tools.nrepl-0.2.10.jar]
Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [tools.nrepl-0.2.10.jar:META-INF/MANIFEST.MF])
  Copying resources from program jar [/home/user/.m2/repository/org/clojure-android/clojure/1.7.0-r2/clojure-1.7.0-r2.jar]
Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [clojure-1.7.0-r2.jar:META-INF/MANIFEST.MF])
  Copying resources from program jar [/home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/classes.jar]
Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [classes.jar:META-INF/MANIFEST.MF])

/opt/android-sdk/build-tools/21.1.1/dx -JXmx4096M --num-threads=4 --dex --no-optimize --multi-dex --main-dex-list /home/user/git/example-multidex-issue/target/debug/main-dex-list.txt --output /home/user/git/example-multidex-issue/target/debug /home/user/git/example-multidex-issue/target/debug/classes /home/user/.m2/repository/neko/neko/4.0.0-alpha5/neko-4.0.0-alpha5.jar /home/user/.m2/repository/org/clojure/tools.nrepl/0.2.10/tools.nrepl-0.2.10.jar /home/user/.m2/repository/org/clojure-android/clojure/1.7.0-r2/clojure-1.7.0-r2.jar /home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/classes.jar /opt/android-sdk/tools/support/annotations.jar
--num-threads is ignored when used with --multi-dex

Crunching resources...
/opt/android-sdk/build-tools/21.1.1/aapt crunch -v -S /home/user/git/example-multidex-issue/res -C /home/user/git/example-multidex-issue/target/debug/res
Crunching PNG Files in source dir: /home/user/git/example-multidex-issue/res
To destination dir: /home/user/git/example-multidex-issue/target/debug/res

Packaging resources...
/opt/android-sdk/build-tools/21.1.1/aapt package --no-crunch -f --debug-mode --auto-add-overlay -M /home/user/git/example-multidex-issue/target/debug/AndroidManifest.xml -S /home/user/git/example-multidex-issue/target/debug/res -S /home/user/git/example-multidex-issue/res -S /home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/res -A /home/user/git/example-multidex-issue/assets -A /home/user/git/example-multidex-issue/target/debug/assets-gen -A /home/user/git/example-multidex-issue/target/debug/aar-extracted/com.android.support_multidex_aar_1.0.0/assets -I /opt/android-sdk/platforms/android-15/android.jar -F /home/user/git/example-multidex-issue/target/debug/example-multidex-issue.ap_ --generate-dependencies --rename-manifest-package com.example.multidex_issue.debug

Creating APK...
Adding DEX files:  (#<File /home/user/git/example-multidex-issue/target/debug/classes.dex> #<File /home/user/git/example-multidex-issue/target/debug/classes2.dex>)
Signing APK with /home/user/.android/debug.keystore ...
jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore /home/user/.android/debug.keystore -storepass android -keypass android /home/user/git/example-multidex-issue/target/debug/example-multidex-issue-unaligned.apk androiddebugkey

...
(omit: notice message: jar-file certification expired)
...

Aligning APK...
/opt/android-sdk/build-tools/21.1.1/zipalign 4 /home/user/git/example-multidex-issue/target/debug/example-multidex-issue-unaligned.apk /home/user/git/example-multidex-issue/target/debug/example-multidex-issue.apk

/opt/android-sdk/platform-tools/adb devices
List of devices attached
CB5A275YVG  device
192.168.57.101:5555 device

1. CB5A275YVG   device
2. 192.168.57.101:5555  device
Enter the number 1..2 to choose the device: Installing APK...
/opt/android-sdk/platform-tools/adb -s 192.168.57.101:5555 install -r /home/user/git/example-multidex-issue/target/debug/example-multidex-issue.apk
12339 KB/s (3499870 bytes in 0.276s)
    pkg: /data/local/tmp/example-multidex-issue.apk
Success

Launching APK...
/opt/android-sdk/platform-tools/adb -s 192.168.57.101:5555 shell am start -n com.example.multidex_issue.debug/com.example.multidex_issue.SplashActivity
Starting: Intent { cmp=com.example.multidex_issue.debug/com.example.multidex_issue.SplashActivity }

Binding device port 9999 to local port 9999 ...
/opt/android-sdk/platform-tools/adb -s 192.168.57.101:5555 forward tcp:9999 tcp:9999

This log has some omitted line. Complete log file is here Sorry the log file contains multi-byte characters because my environment has japanese settings.