Build failure on Ubuntu
hkurokawa opened this issue · 6 comments
Description
I tried to build the project on Ubuntu (14.04.3 LTS, x86-64) and encountered the below compile error.
$ ./gradlew clean assembleRelease
Incremental java compilation is an incubating feature.
:agera:clean
:testapp:clean UP-TO-DATE
:extensions:content:clean UP-TO-DATE
:extensions:database:clean UP-TO-DATE
:extensions:net:clean UP-TO-DATE
:extensions:rvadapter:clean UP-TO-DATE
:agera:preBuild UP-TO-DATE
:agera:preReleaseBuild UP-TO-DATE
:agera:compileReleaseNdk UP-TO-DATE
:agera:compileLint
:agera:copyReleaseLint UP-TO-DATE
:agera:checkReleaseManifest
:agera:prepareReleaseDependencies
:agera:compileReleaseAidl
:agera:compileReleaseRenderscript
:agera:generateReleaseBuildConfig
:agera:mergeReleaseShaders
:agera:compileReleaseShaders
:agera:generateReleaseAssets
:agera:mergeReleaseAssets
:agera:generateReleaseResValues UP-TO-DATE
:agera:generateReleaseResources
:agera:packageReleaseResources
:agera:processReleaseManifest
:agera:processReleaseResources
:agera:generateReleaseSources
:agera:incrementalReleaseJavaCompilationSafeguard
:agera:compileReleaseJavaWithJavac
:agera:compileReleaseJavaWithJavac - is not incremental (e.g. outputs have changed, no previous execution, etc.).
/home/hiroshi/git/github.com/google/agera/agera/src/main/java/com/google/android/agera/Common.java:106: error: cannot find symbol
static final class WorkerHandler extends Handler {
^
symbol: class Handler
location: class Common
...
Environment
OS: Ubuntu 14.04.3 LTS, x86-64
Java: Oracle Java 64-bit 1.8.0_66-b17
Android Studio: 2.1
Solution
A bit strangely, when I changed the order of import statements in com.google.android.agera.Common
as below, the compile error was gone:
diff --git a/agera/src/main/java/com/google/android/agera/Common.java b/agera/src/main/java/com/google/android/agera/Common.java
index 8bad1a8..47627bd 100644
--- a/agera/src/main/java/com/google/android/agera/Common.java
+++ b/agera/src/main/java/com/google/android/agera/Common.java
@@ -18,10 +18,10 @@ package com.google.android.agera;
import static com.google.android.agera.Preconditions.checkNotNull;
import static com.google.android.agera.Result.failure;
+import android.os.Handler;
import com.google.android.agera.BaseObservable.Worker;
import com.google.android.agera.Observables.LowPassFilterObservable;
-import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
I'm afraid it might be related to com.google.android.agera.Common
and com.google.android.agera.BaseObservable
has a cyclic package dependency. Though I believe the Java specification allows that, it might cause a bug or an unexpected behaviour of Java compiler.
For your information, I tried Oracle Java 7 and OpendJDK 7 but the result was same.
Thanks.
Just FYI, I could not reproduce the issue on Mac OS X (Oracle Java 1.8.0_65-b17). And also, I found a JEP which might be related to this issue, http://openjdk.java.net/jeps/216, which seems included in Java 9.
Looks like Travis CI has been running 1.7.0_76-b13, on Linux with no problems. I'm running 1.8.0_92 myself, but that's on OSX. Have you tried the latest version of 1.8 (I guess it's u92?), see if the problem is there too?
#30 from the other week reports the same issue on 1.7.0_79, 1.8.0_66 and 1.8.0_91
I tried 1.8.0_92-b14 but had no luck. So was 1.7.0_80-b15. When I compiled the project on Mac, the error didn't occur so it seems the problem is specific to Linux Java. I tried 9-ea+114 and the javac command succeeded but it seems Gradle doesn't support Java 9 yet.
Also, I found if I pulled up com.google.android.agera.Common.WorkerHandler
to, say, com.google.android.agera.WorkerHandler
, the error was gone. So it seems to be related to nested class.
Besides, I found if I deleted the static import statements in com.google.android.agera.Common
, the error r was gone as well:
diff --git a/agera/src/main/java/com/google/android/agera/BaseObservable.java b/agera/src/main/java/com/google/android/agera/BaseObservable.java
index 4938fd1..396cec0 100644
--- a/agera/src/main/java/com/google/android/agera/BaseObservable.java
+++ b/agera/src/main/java/com/google/android/agera/BaseObservable.java
@@ -15,9 +15,6 @@
*/
package com.google.android.agera;
-import static com.google.android.agera.Common.WorkerHandler.MSG_LAST_REMOVED;
-import static com.google.android.agera.Common.WorkerHandler.MSG_UPDATE;
-import static com.google.android.agera.Common.workerHandler;
import static com.google.android.agera.Preconditions.checkState;
import com.google.android.agera.Common.WorkerHandler;
@@ -97,16 +94,16 @@ public abstract class BaseObservable implements Observable {
Worker(@NonNull final BaseObservable baseObservable) {
this.baseObservable = baseObservable;
- this.handler = workerHandler();
+ this.handler = Common.workerHandler();
this.updatablesAndHandlers = NO_UPDATABLES_OR_HANDLERS;
this.size = 0;
}
synchronized void addUpdatable(@NonNull final Updatable updatable) {
- add(updatable, workerHandler());
+ add(updatable, Common.workerHandler());
if (size == 1) {
- if (handler.hasMessages(MSG_LAST_REMOVED, this)) {
- handler.removeMessages(MSG_LAST_REMOVED, this);
+ if (handler.hasMessages(Common.WorkerHandler.MSG_LAST_REMOVED, this)) {
+ handler.removeMessages(Common.WorkerHandler.MSG_LAST_REMOVED, this);
} else {
handler.obtainMessage(WorkerHandler.MSG_FIRST_ADDED, this).sendToTarget();
}
@@ -116,13 +113,13 @@ public abstract class BaseObservable implements Observable {
synchronized void removeUpdatable(@NonNull final Updatable updatable) {
remove(updatable);
if (size == 0) {
- handler.obtainMessage(MSG_LAST_REMOVED, this).sendToTarget();
+ handler.obtainMessage(Common.WorkerHandler.MSG_LAST_REMOVED, this).sendToTarget();
}
}
void dispatchUpdate() {
- if (!handler.hasMessages(MSG_UPDATE, this)) {
- handler.obtainMessage(MSG_UPDATE, this).sendToTarget();
+ if (!handler.hasMessages(Common.WorkerHandler.MSG_UPDATE, this)) {
+ handler.obtainMessage(Common.WorkerHandler.MSG_UPDATE, this).sendToTarget();
}
}
Anyway, I know this is not your code fault. But I think there are a few options for us:
- Reorder the import statements
- Pull up the nested static class
- Delete the static import statements
- Leave it (some Linux users might not be able to compile the code) until Java 9 comes to Gradle
Any idea?
I leaning towards 2 (and you're right, 4 is unreasonable). Have a fix coming up, let me know if it works out for you.
Still a seriously strange problem, some odd corner case of the java compiler I suppose :)
I agree. And here is one thing I forgot to mention, a similar bug is reported to OpenJDK, which should be fixed with Java 9: https://bugs.openjdk.java.net/browse/JDK-7101822
And thank you for your fix. I tried with the latest source code and I could compile the code successfully.