Fixed
Status Update
Comments
js...@google.com <js...@google.com>
mk...@google.com <mk...@google.com>
mk...@google.com <mk...@google.com> #2
Thank you for posting an issue and the reproduction. We fail to block rewriting of super-calls in constructor. The result is that we rewrite InvokeSuper RecyclerView.Adapter.setHasStableIds into InvokeDirect to the private method of the virtual SimpleWrapperAdapter.setHasStableIds we place on SwipeableItemWrapperAdapter.
I have a small reproduction and fix and will write back when it has passed through code-review. It will take some time before the change is rolled into studio. To allow you to continue, you can add -keep class com.h6ah4i.android.widget.advrecyclerview.adapter.SimpleWrapperAdapter.
I have a small reproduction and fix and will write back when it has passed through code-review. It will take some time before the change is rolled into studio. To allow you to continue, you can add -keep class com.h6ah4i.android.widget.advrecyclerview.adapter.SimpleWrapperAdapter.
ap...@google.com <ap...@google.com> #3
Project: r8
Branch: master
commit 9b4b59949b0fda8fc7febeb4354ed5ff10873a77
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Mon Jan 27 01:17:52 2020
Block rewriting of super-calls in initializer of merged classes
Bug: 148313389
Change-Id: I79b1e8f79f5d1a15ebdb50189cbb0263976ca435
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
A src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
https://r8-review.googlesource.com/47968
Branch: master
commit 9b4b59949b0fda8fc7febeb4354ed5ff10873a77
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Mon Jan 27 01:17:52 2020
Block rewriting of super-calls in initializer of merged classes
Bug: 148313389
Change-Id: I79b1e8f79f5d1a15ebdb50189cbb0263976ca435
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
A src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
va...@gmail.com <va...@gmail.com> #4
That was quick, thank you!
BTW: Will be this fix included to AGP 3.6.0?
BTW: Will be this fix included to AGP 3.6.0?
ap...@google.com <ap...@google.com> #5
Project: r8
Branch: 1.6
commit c81fd59ed604876e44dfcc550ebe599b34d778ea
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 28 12:51:28 2020
Version 1.6.65
Cherry-pick: Block rewriting of super-calls in initializer of merged
classes
CL:https://r8-review.googlesource.com/47968
Bug: 148313389
Change-Id: I365b2d8966b7cd034ca6d8d0f68df97d1c4771a6
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
A src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
https://r8-review.googlesource.com/48011
Branch: 1.6
commit c81fd59ed604876e44dfcc550ebe599b34d778ea
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 28 12:51:28 2020
Version 1.6.65
Cherry-pick: Block rewriting of super-calls in initializer of merged
classes
CL:
Bug: 148313389
Change-Id: I365b2d8966b7cd034ca6d8d0f68df97d1c4771a6
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
A src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
ap...@google.com <ap...@google.com> #6
Project: r8
Branch: 2.0
commit 9d7f5de107df770cfb6505cb67feeb9fedff16f9
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 28 12:48:32 2020
Version 2.0.24
Cherry-pick: Block rewriting of super-calls in initializer of merged
classes
CL:https://r8-review.googlesource.com/47968
Bug: 148313389
Change-Id: I7c34e34ee8eb2af54fd824976ead518eade156f0
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
A src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
https://r8-review.googlesource.com/48010
Branch: 2.0
commit 9d7f5de107df770cfb6505cb67feeb9fedff16f9
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 28 12:48:32 2020
Version 2.0.24
Cherry-pick: Block rewriting of super-calls in initializer of merged
classes
CL:
Bug: 148313389
Change-Id: I7c34e34ee8eb2af54fd824976ead518eade156f0
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
A src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
ap...@google.com <ap...@google.com> #7
Project: r8
Branch: 1.6
commit 34dbb00f23b4471db471ac658be04b97b070838e
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 28 13:34:13 2020
Version 1.6.66
Backport VerticalClassMergerInvokeSpecialInConstructorTest test to old
test interface.
Bug: 148313389
Change-Id: I1c8b757fe669fb01c8519b1797e46d790d088280
M src/main/java/com/android/tools/r8/Version.java
M src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
https://r8-review.googlesource.com/48015
Branch: 1.6
commit 34dbb00f23b4471db471ac658be04b97b070838e
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 28 13:34:13 2020
Version 1.6.66
Backport VerticalClassMergerInvokeSpecialInConstructorTest test to old
test interface.
Bug: 148313389
Change-Id: I1c8b757fe669fb01c8519b1797e46d790d088280
M src/main/java/com/android/tools/r8/Version.java
M src/test/java/com/android/tools/r8/shaking/VerticalClassMergerInvokeSpecialInConstructorTest.java
mk...@google.com <mk...@google.com> #8
varagash.kolya@, thank you for posting the error and it was nice with a reproduction. We have rolled a version 1.6.66 and 1.6.67. 1.6.66 includes the bug-fix for the vertical class merging and from what I can see it is scheduled to be the version of R8 released with Studio 3.6 (therefore also AGP 3.6). You can use the 1.6.66 version (and later version of 1.6.*) by adding the following to you top-level build.gradle file:
buildscript {
repositories {
maven {
url 'http://storage.googleapis.com/r8-releases/raw '
}
}
dependencies {
classpath 'com.android.tools:r8:1.6.66' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:X.Y.Z' // Your current AGP version.
}
}
buildscript {
repositories {
maven {
url '
}
}
dependencies {
classpath 'com.android.tools:r8:1.6.66' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:X.Y.Z' // Your current AGP version.
}
}
Description
public abstract static class RecyclerView.Adapter {
public void setHasStableIds(boolean hasStableIds) {
if (hasObservers()) {
throw new IllegalStateException("Cannot change whether this adapter has "
+ "stable IDs while the adapter has registered observers.");
}
mHasStableIds = hasStableIds;
}
}
public class SimpleWrapperAdapter extends RecyclerView.Adapter {
public SimpleWrapperAdapter(RecyclerView.Adapter adapter) {
mWrappedAdapter = adapter;
mBridgeObserver = new BridgeAdapterDataObserver(this, mWrappedAdapter, null);
mWrappedAdapter.registerAdapterDataObserver(mBridgeObserver);
super.setHasStableIds(mWrappedAdapter.hasStableIds());
}
@Override
public void setHasStableIds(boolean hasStableIds) {
super.setHasStableIds(hasStableIds);
if (isWrappedAdapterAlive())
mWrappedAdapter.setHasStableIds(hasStableIds);
}
public boolean isWrappedAdapterAlive() {
return mWrappedAdapter != null;
}
}
class SwipeableItemWrapperAdapter extends SimpleWrapperAdapter {
public SwipeableItemWrapperAdapter(RecyclerViewSwipeManager manager, RecyclerView.Adapter adapter) {
super(adapter);
mSwipeManager = manager;
}
}
Here is how 'SwipeableItemWrapperAdapter' class looks like after minification:
public class SwipeableItemWrapperAdapter extends RecyclerView.Adapter {
public SwipeableItemWrapperAdapter(RecyclerViewSwipeManager var1, Adapter var2) {
this.mWrappedAdapter = var2;
BridgeAdapterDataObserver var3 = new BridgeAdapterDataObserver(this, var2, (Object)null);
this.mBridgeObserver = var3;
this.mWrappedAdapter.mObservable.registerObserver(var3);
boolean var4 = this.mWrappedAdapter.mHasStableIds;
super.setHasStableIds(var4);
if (this.isWrappedAdapterAlive()) {
this.mWrappedAdapter.setHasStableIds(var4);
}
this.mSwipeManager = var1;
}
}
As result, when we try to instantiate 'SwipeableItemWrapperAdapter' class, we got exception: IllegalStateException: "Cannot change whether this adapter has stable IDs while the adapter has registered observers."
This happens because R8 incorrectly inlined body of method 'setHasStableIds' from 'SimpleWrapperAdapter' class instead of 'RecyclerView.Adapter' class.
This bug is reproducible on AGP 3.6.0-rc1 and 4.0.0-alpha09, but AGP 3.5.3 does not have this issue.
I have attached android project with reproducer. If you run app in release build it will crash with exception describer above.