Fixed
Status Update
Comments
ag...@google.com <ag...@google.com>
mk...@google.com <mk...@google.com>
mk...@google.com <mk...@google.com> #2
Thank you for posting an issue and providing a reproduction. This is a bug in R8 where we remove Monitor-Enter and Monitor-Exit instructions where we are not allowed to. I will create a local test and fix for it shortly. A temporary fix to the issue is to add the following keep rule:
-keep class okio.SegmentPool { *; }
Adding the above fixes the issue for me in the reproduction, however, since we are removing monitor instructions in an unsound way, I cannot promise the above will be sufficient for your project. Can I ask you to try it out and report back while I work on a fix?
-keep class okio.SegmentPool { *; }
Adding the above fixes the issue for me in the reproduction, however, since we are removing monitor instructions in an unsound way, I cannot promise the above will be sufficient for your project. Can I ask you to try it out and report back while I work on a fix?
st...@gmail.com <st...@gmail.com> #3
Thanks, that keep rule seems to resolve the issue on both the repro project & my real project!
ap...@google.com <ap...@google.com> #4
Project: r8
Branch: master
commit 99125526c11ad4d8c686d3f8e4a2366aa1e3e12c
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 14 08:56:19 2020
Do not classinline when root is a static get and is used with a monitor
We can only remove monitor instructions in the class inliner, when the
root is a new instance. For static get roots, we cannot guarantee that
the instance is not shared.
Bug: 147411673
Change-Id: I4d5463ceecbde2941c3431510295551bfc2d9766
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerEligibilityInfo.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java
https://r8-review.googlesource.com/47280
Branch: master
commit 99125526c11ad4d8c686d3f8e4a2366aa1e3e12c
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Tue Jan 14 08:56:19 2020
Do not classinline when root is a static get and is used with a monitor
We can only remove monitor instructions in the class inliner, when the
root is a new instance. For static get roots, we cannot guarantee that
the instance is not shared.
Bug: 147411673
Change-Id: I4d5463ceecbde2941c3431510295551bfc2d9766
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerEligibilityInfo.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java
ap...@google.com <ap...@google.com> #5
Project: r8
Branch: 2.0
commit 3df603d82316846021d557954be5e1f5b3c98aa3
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Jan 15 16:12:54 2020
Version 2.0.15
Cherry-pick: Fix version test when we are on a release branch
CL:https://r8-review.googlesource.com/47564
Cherry-pick: Reland "Do not rewrite generic signatures in target of
merged classes"
CL:https://r8-review.googlesource.com/47512
Cherry-pick: Do not classinline when root is a static get and is used with a monitor
CL:https://r8-review.googlesource.com/47280
Cherry-pick: Allow for '.' for patterns when parsing -keepattributes
CL:https://r8-review.googlesource.com/47321
Cherry-pick: Fix proguard configuration parser test to allow classname in attribute
CL:https://r8-review.googlesource.com/47361
Bug: 147386014
Bug: 147411673
Bug: 147470785
Change-Id: If56d14012b6121ab76416ea7d8a8dda78d02136e
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerEligibilityInfo.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureAction.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureParser.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
M src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
M src/main/java/com/android/tools/r8/utils/IteratorUtils.java
M src/test/java/com/android/tools/r8/VersionTests.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java
M src/test/java/com/android/tools/r8/naming/GenericSignatureParserTest.java
A src/test/java/com/android/tools/r8/naming/signature/SignatureOfMergedClassesTest.java
A src/test/java/com/android/tools/r8/naming/signature/merging/I.java
A src/test/java/com/android/tools/r8/naming/signature/merging/ImplI.java
A src/test/java/com/android/tools/r8/naming/signature/merging/ImplK.java
A src/test/java/com/android/tools/r8/naming/signature/merging/InterfaceToKeep.java
A src/test/java/com/android/tools/r8/naming/signature/merging/J.java
A src/test/java/com/android/tools/r8/naming/signature/merging/K.java
M src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
A src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
M src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
https://r8-review.googlesource.com/47610
Branch: 2.0
commit 3df603d82316846021d557954be5e1f5b3c98aa3
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Jan 15 16:12:54 2020
Version 2.0.15
Cherry-pick: Fix version test when we are on a release branch
CL:
Cherry-pick: Reland "Do not rewrite generic signatures in target of
merged classes"
CL:
Cherry-pick: Do not classinline when root is a static get and is used with a monitor
CL:
Cherry-pick: Allow for '.' for patterns when parsing -keepattributes
CL:
Cherry-pick: Fix proguard configuration parser test to allow classname in attribute
CL:
Bug: 147386014
Bug: 147411673
Bug: 147470785
Change-Id: If56d14012b6121ab76416ea7d8a8dda78d02136e
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerEligibilityInfo.java
M src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
M src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
M src/main/java/com/android/tools/r8/ir/optimize/info/ParameterUsagesInfo.java
M src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureAction.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureParser.java
M src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
M src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
M src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
M src/main/java/com/android/tools/r8/utils/IteratorUtils.java
M src/test/java/com/android/tools/r8/VersionTests.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java
A src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java
M src/test/java/com/android/tools/r8/naming/GenericSignatureParserTest.java
A src/test/java/com/android/tools/r8/naming/signature/SignatureOfMergedClassesTest.java
A src/test/java/com/android/tools/r8/naming/signature/merging/I.java
A src/test/java/com/android/tools/r8/naming/signature/merging/ImplI.java
A src/test/java/com/android/tools/r8/naming/signature/merging/ImplK.java
A src/test/java/com/android/tools/r8/naming/signature/merging/InterfaceToKeep.java
A src/test/java/com/android/tools/r8/naming/signature/merging/J.java
A src/test/java/com/android/tools/r8/naming/signature/merging/K.java
M src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
A src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
M src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
Description
I'm attaching a project which reproduces the issue: Click the "Make Requests" button, wait a few seconds, and the app should crash (if it didn't, try again; it's a bit random). The exception seems to be different every time (I've attached some of the exceptions I've seen).
The crash was observed on Android 5 and Android 9.
This does not happen in the following cases:
- if AGP 3.5.3 is used (the test project uses 4.0.0-alpha07)
- if debuggable is set to true
- if OkHttp 4.2.2 is used (4.3.0 has some multithreading improvements, which is what I suspect might be causing this issue)
- if minifyEnabled is set to false
Related OkHttp issue: