10.5a7-build2 Android mismatch
Different from #40207 (closed)
--- acat.android-x86_64.filelist.sha256 2021-01-18 16:58:00.452669252 +0000
+++ sysrqb.android-x86_64.filelist.sha256 2021-01-18 16:57:43.948573779 +0000
@@ -456,7 +456,7 @@
7d8df6264700eae16233122cfcb7ccc83177ae986b9fa2fb522e5135875facda android-x86_64/assets/searchplugins/youtube.xml
8ca7bd3bd2ca30c8e65150ea52e1c00ef418021569ac73c7fb48ac2079ee1299 android-x86_64/assets/shared_error_style.css
a97624851f3ccb4f9746802cfe5d75fe983aff5b477bfd659445d12734f1d42f android-x86_64/classes2.dex
-f6a0a0e3de5d1e5aa52921f563e738e5a7a48633851d846cdb1fb0657e9f35be android-x86_64/classes.dex
+40caf93c6533ef8a3d193f1ae86e83ce429d82f1943a68e92bdce92d2e0e6738 android-x86_64/classes.dex
ab6d48d5d868c733cd03345f8aabae3d905bd6f0fc661117a8bdfea6c51b9274 android-x86_64/DebugProbesKt.bin
cb93b54f651ad6fa439d8fc33c8e0be1a9b2085df88edc2f267c83f4cffd2f76 android-x86_64/firebase-common.properties
2f74bb762ee0dee50b0a05eee510dd4196ef8e033ea9d2e1cba3eeec91941fda android-x86_64/firebase-components.properties
--- acat/android-x86_64/classes.dex.xxd 2021-01-18 17:09:11.875703985 +0000
+++ sysrqb/android-x86_64/classes.dex.xxd 2021-01-18 17:09:18.439728415 +0000
@@ -1,5 +1,5 @@
-00000000: 6465 780a 3033 3500 38ce 3d2f f0f4 8076 dex.035.8.=/...v
-00000010: 923c 44d6 d9e6 0274 d031 e7c3 0bd5 c80b .<D....t.1......
+00000000: 6465 780a 3033 3500 0fcf d2e2 2b9a 7fc2 dex.035.....+...
+00000010: 03ce f5a8 e4fb 6a9e 0b8f ebba f134 16d1 ......j......4..
00000020: 4c85 8100 7000 0000 7856 3412 0000 0000 L...p...xV4.....
00000030: 0000 0000 7084 8100 f2ec 0000 7000 0000 ....p.......p...
00000040: 1028 0000 38b4 0300 ee32 0000 7854 0400 .(..8....2..xT..
@@ -466363,7 +466363,7 @@
0071dba0: 2c22 6861 732d 6368 6563 6b73 756d 7322 ,"has-checksums"
0071dbb0: 3a66 616c 7365 2c22 6d69 6e2d 6170 6922 :false,"min-api"
0071dbc0: 3a32 312c 2270 672d 6d61 702d 6964 223a :21,"pg-map-id":
-0071dbd0: 2230 3836 3936 3934 222c 2276 6572 7369 "0869694","versi
+0071dbd0: 2239 6439 3362 3164 222c 2276 6572 7369 "9d93b1d","versi
0071dbe0: 6f6e 223a 2232 2e30 2e38 3822 7d00 017f on":"2.0.88"}...
0071dbf0: 0001 c2a3 003f c380 c381 c382 c383 c384 .....?..........
0071dc00: c385 c386 c387 c388 c389 c38a c38b c38c ................
This is a different reproducibility issue than #40151 (closed)
- Show closed items
Activity
-
Newest first Oldest first
-
Show all activity Show comments only Show history only
- Author
We have 24 bytes difference in
classes.dex
, beginning at offset 7. Collapse replies - Author
We have 24 bytes difference in
classes.dex
, beginning at offset 7.@gk does that sound (or look) familiar from your earlier rabbit holes?
- Developer
I don't think so. But I guess before we spend too much time here, let's see what @acat's rebuilding with new containers gets us (see: #40207 (closed) for cross-reference).
- Developer
Okay, @acat confirms that rebuilding does not fix the issue. And I think I was wrong about the familiarity of the issue. It does look much like #40085 (closed).
- Author
Okay, we are making progress here:
--- acat/mapping.txt 2021-01-19 10:24:32.000000000 +0000 +++ sysrqb/mapping.txt 2021-01-19 16:00:04.337934580 +0000 @@ -1,7 +1,7 @@ # compiler: R8 # compiler_version: 2.0.88 # min_api: 21 -# pg_map_id: 0869694 +# pg_map_id: 9d93b1d # common_typos_disable GeckoProvider -> GeckoProvider: 1:1:void <clinit>():20:20 -> <clinit> @@ -160213,7 +160213,7 @@ 3:3:void org.mozilla.experiments.nimbus.NimbusKt.write(byte,org.mozilla.experiments.nimbus.RustBufferBuilder):0:0 -> write$nimbus_release 3:3:void write$nimbus_release(org.mozilla.experiments.nimbus.RustBufferBuilder):858 -> write$nimbus_release 4:4:void org.mozilla.experiments.nimbus.RustBufferBuilder.putByte(byte):135:135 -> write$nimbus_release - 4:4:void org.mozilla.experiments.nimbus.NimbusKt.write(byte,org.mozilla.experiments.nimbus.RustBufferBuilder):266 -> write$nimbus_release + 4:4:void org.mozilla.experiments.nimbus.NimbusKt.write(byte,org.mozilla.experiments.nimbus.RustBufferBuilder):354 -> write$nimbus_release 4:4:void write$nimbus_release(org.mozilla.experiments.nimbus.RustBufferBuilder):858 -> write$nimbus_release org.mozilla.experiments.nimbus.AvailableRandomizationUnits$lower$1 -> org.mozilla.experiments.nimbus.AvailableRandomizationUnits$lower$1: 1:1:java.lang.Object invoke(java.lang.Object,java.lang.Object):834:834 -> invoke @@ -160300,7 +160300,7 @@ 3:3:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.AppContext.lower$nimbus_release():751:751 -> <init> 3:3:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886 -> <init> 4:4:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886:886 -> <init> - 5:5:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.NimbusKt.lowerOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig):235:235 -> <init> + 5:5:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.NimbusKt.lowerOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig):311:311 -> <init> 5:5:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886 -> <init> 6:6:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.AvailableRandomizationUnits.lower$nimbus_release():853:853 -> <init> 6:6:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886 -> <init> @@ -160333,7 +160333,7 @@ 6:6:java.util.List getActiveExperiments():1040 -> getActiveExperiments 7:7:java.util.List org.mozilla.experiments.nimbus.NimbusKt.liftSequenceRecordEnrolledExperiment(org.mozilla.experiments.nimbus.RustBuffer$ByValue):0:0 -> getActiveExperiments 7:7:java.util.List getActiveExperiments():929 -> getActiveExperiments - 8:8:java.util.List org.mozilla.experiments.nimbus.NimbusKt.liftSequenceRecordEnrolledExperiment(org.mozilla.experiments.nimbus.RustBuffer$ByValue):368:368 -> getActiveExperiments + 8:8:java.util.List org.mozilla.experiments.nimbus.NimbusKt.liftSequenceRecordEnrolledExperiment(org.mozilla.experiments.nimbus.RustBuffer$ByValue):252:252 -> getActiveExperiments 8:8:java.util.List getActiveExperiments():929 -> getActiveExperiments 9:9:java.lang.Object org.mozilla.experiments.nimbus.NimbusKt.nullableRustCall(kotlin.jvm.functions.Function1,org.mozilla.experiments.nimbus.RustErrorReference):705:705 -> getActiveExperiments 9:9:java.util.List getActiveExperiments():1040 -> getActiveExperiments @@ -160355,7 +160355,7 @@ 6:6:java.lang.String getExperimentBranch(java.lang.String):1023 -> getExperimentBranch 7:7:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.liftOptionalstring(org.mozilla.experiments.nimbus.RustBuffer$ByValue):0:0 -> getExperimentBranch 7:7:java.lang.String getExperimentBranch(java.lang.String):918 -> getExperimentBranch - 8:8:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.liftOptionalstring(org.mozilla.experiments.nimbus.RustBuffer$ByValue):332:332 -> getExperimentBranch + 8:8:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.liftOptionalstring(org.mozilla.experiments.nimbus.RustBuffer$ByValue):216:216 -> getExperimentBranch 8:8:java.lang.String getExperimentBranch(java.lang.String):918 -> getExperimentBranch 9:9:java.lang.Object org.mozilla.experiments.nimbus.NimbusKt.nullableRustCall(kotlin.jvm.functions.Function1,org.mozilla.experiments.nimbus.RustErrorReference):705:705 -> getExperimentBranch 9:9:java.lang.String getExperimentBranch(java.lang.String):1023 -> getExperimentBranch @@ -160455,70 +160455,70 @@ 5:5:java.lang.Object liftFromRustBuffer(org.mozilla.experiments.nimbus.RustBuffer$ByValue,kotlin.jvm.functions.Function1):184:184 -> liftFromRustBuffer 6:6:java.lang.Object liftFromRustBuffer(org.mozilla.experiments.nimbus.RustBuffer$ByValue,kotlin.jvm.functions.Function1):188:188 -> liftFromRustBuffer 7:7:java.lang.Object liftFromRustBuffer(org.mozilla.experiments.nimbus.RustBuffer$ByValue,kotlin.jvm.functions.Function1):180:180 -> liftFromRustBuffer - 1:1:org.mozilla.experiments.nimbus.RustBuffer$ByValue lower(java.lang.String):297:297 -> lower - 2:3:org.mozilla.experiments.nimbus.RustBuffer$ByValue lower(java.lang.String):300:301 -> lower + 1:1:org.mozilla.experiments.nimbus.RustBuffer$ByValue lower(java.lang.String):379:379 -> lower + 2:3:org.mozilla.experiments.nimbus.RustBuffer$ByValue lower(java.lang.String):382:383 -> lower 1:1:org.mozilla.experiments.nimbus.RustBuffer$ByValue lowerIntoRustBuffer(java.lang.Object,kotlin.jvm.functions.Function2):194:194 -> lowerIntoRustBuffer 2:3:org.mozilla.experiments.nimbus.RustBuffer$ByValue lowerIntoRustBuffer(java.lang.Object,kotlin.jvm.functions.Function2):196:197 -> lowerIntoRustBuffer 4:5:void org.mozilla.experiments.nimbus.RustBufferBuilder.discard():117:118 -> lowerIntoRustBuffer 4:5:org.mozilla.experiments.nimbus.RustBuffer$ByValue lowerIntoRustBuffer(java.lang.Object,kotlin.jvm.functions.Function2):199 -> lowerIntoRustBuffer 6:6:org.mozilla.experiments.nimbus.RustBuffer$ByValue lowerIntoRustBuffer(java.lang.Object,kotlin.jvm.functions.Function2):200:200 -> lowerIntoRustBuffer - 1:4:java.lang.String read(kotlin.jvm.internal.StringCompanionObject,java.nio.ByteBuffer):290:293 -> read - 1:2:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):306:307 -> write + 1:4:java.lang.String read(kotlin.jvm.internal.StringCompanionObject,java.nio.ByteBuffer):372:375 -> read + 1:2:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):388:389 -> write 3:3:void org.mozilla.experiments.nimbus.RustBufferBuilder.putInt(int):147:147 -> write - 3:3:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):307 -> write + 3:3:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):389 -> write 4:4:void org.mozilla.experiments.nimbus.RustBufferBuilder.put(byte[]):0:0 -> write - 4:4:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):308 -> write + 4:4:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):390 -> write 5:5:void org.mozilla.experiments.nimbus.RustBufferBuilder.put(byte[]):171:171 -> write - 5:5:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):308 -> write - 1:1:void writeOptionalstring(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):352:352 -> writeOptionalstring - 2:3:void writeOptionalstring(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):354:355 -> writeOptionalstring + 5:5:void write(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):390 -> write + 1:1:void writeOptionalstring(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):236:236 -> writeOptionalstring + 2:3:void writeOptionalstring(java.lang.String,org.mozilla.experiments.nimbus.RustBufferBuilder):238:239 -> writeOptionalstring org.mozilla.experiments.nimbus.NimbusKt$liftOptionalstring$1 -> org.mozilla.experiments.nimbus.NimbusKt$liftOptionalstring$1: 1:1:java.lang.String invoke(java.nio.ByteBuffer):0:0 -> invoke 1:1:java.lang.Object invoke(java.lang.Object):0 -> invoke 2:2:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.readOptionalstring(java.nio.ByteBuffer):0:0 -> invoke - 2:2:java.lang.String invoke(java.nio.ByteBuffer):333 -> invoke + 2:2:java.lang.String invoke(java.nio.ByteBuffer):217 -> invoke 2:2:java.lang.Object invoke(java.lang.Object):0 -> invoke - 3:3:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.readOptionalstring(java.nio.ByteBuffer):338:338 -> invoke - 3:3:java.lang.String invoke(java.nio.ByteBuffer):333 -> invoke + 3:3:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.readOptionalstring(java.nio.ByteBuffer):222:222 -> invoke + 3:3:java.lang.String invoke(java.nio.ByteBuffer):217 -> invoke 3:3:java.lang.Object invoke(java.lang.Object):0 -> invoke - 4:4:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.readOptionalstring(java.nio.ByteBuffer):341:341 -> invoke - 4:4:java.lang.String invoke(java.nio.ByteBuffer):333 -> invoke + 4:4:java.lang.String org.mozilla.experiments.nimbus.NimbusKt.readOptionalstring(java.nio.ByteBuffer):225:225 -> invoke + 4:4:java.lang.String invoke(java.nio.ByteBuffer):217 -> invoke 4:4:java.lang.Object invoke(java.lang.Object):0 -> invoke org.mozilla.experiments.nimbus.NimbusKt$liftSequenceRecordEnrolledExperiment$1 -> org.mozilla.experiments.nimbus.NimbusKt$liftSequenceRecordEnrolledExperiment$1: 1:1:java.util.List invoke(java.nio.ByteBuffer):0:0 -> invoke 1:1:java.lang.Object invoke(java.lang.Object):0 -> invoke 2:2:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):0:0 -> invoke - 2:2:java.util.List invoke(java.nio.ByteBuffer):369 -> invoke + 2:2:java.util.List invoke(java.nio.ByteBuffer):253 -> invoke 2:2:java.lang.Object invoke(java.lang.Object):0 -> invoke - 3:4:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):374:375 -> invoke - 3:4:java.util.List invoke(java.nio.ByteBuffer):369 -> invoke + 3:4:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):258:259 -> invoke + 3:4:java.util.List invoke(java.nio.ByteBuffer):253 -> invoke 3:4:java.lang.Object invoke(java.lang.Object):0 -> invoke 5:5:org.mozilla.experiments.nimbus.EnrolledExperiment org.mozilla.experiments.nimbus.EnrolledExperiment$Companion.read$nimbus_release(java.nio.ByteBuffer):0:0 -> invoke - 5:5:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):376 -> invoke - 5:5:java.util.List invoke(java.nio.ByteBuffer):369 -> invoke + 5:5:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):260 -> invoke + 5:5:java.util.List invoke(java.nio.ByteBuffer):253 -> invoke 5:5:java.lang.Object invoke(java.lang.Object):0 -> invoke 6:10:org.mozilla.experiments.nimbus.EnrolledExperiment org.mozilla.experiments.nimbus.EnrolledExperiment$Companion.read$nimbus_release(java.nio.ByteBuffer):782:786 -> invoke - 6:10:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):376 -> invoke - 6:10:java.util.List invoke(java.nio.ByteBuffer):369 -> invoke + 6:10:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):260 -> invoke + 6:10:java.util.List invoke(java.nio.ByteBuffer):253 -> invoke 6:10:java.lang.Object invoke(java.lang.Object):0 -> invoke 11:11:org.mozilla.experiments.nimbus.EnrolledExperiment org.mozilla.experiments.nimbus.EnrolledExperiment$Companion.read$nimbus_release(java.nio.ByteBuffer):782:782 -> invoke - 11:11:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):376 -> invoke - 11:11:java.util.List invoke(java.nio.ByteBuffer):369 -> invoke + 11:11:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):260 -> invoke + 11:11:java.util.List invoke(java.nio.ByteBuffer):253 -> invoke 11:11:java.lang.Object invoke(java.lang.Object):0 -> invoke - 12:12:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):375:375 -> invoke - 12:12:java.util.List invoke(java.nio.ByteBuffer):369 -> invoke + 12:12:java.util.List org.mozilla.experiments.nimbus.NimbusKt.readSequenceRecordEnrolledExperiment(java.nio.ByteBuffer):259:259 -> invoke + 12:12:java.util.List invoke(java.nio.ByteBuffer):253 -> invoke 12:12:java.lang.Object invoke(java.lang.Object):0 -> invoke org.mozilla.experiments.nimbus.NimbusKt$lowerOptionalRecordRemoteSettingsConfig$1 -> org.mozilla.experiments.nimbus.NimbusKt$lowerOptionalRecordRemoteSettingsConfig$1: 1:1:void invoke(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):0:0 -> invoke 1:1:java.lang.Object invoke(java.lang.Object,java.lang.Object):0 -> invoke 2:2:void org.mozilla.experiments.nimbus.NimbusKt.writeOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):0:0 -> invoke - 2:2:void invoke(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):236 -> invoke + 2:2:void invoke(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):312 -> invoke 2:2:java.lang.Object invoke(java.lang.Object,java.lang.Object):0 -> invoke - 3:3:void org.mozilla.experiments.nimbus.NimbusKt.writeOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):242:242 -> invoke - 3:3:void invoke(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):236 -> invoke + 3:3:void org.mozilla.experiments.nimbus.NimbusKt.writeOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):318:318 -> invoke + 3:3:void invoke(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):312 -> invoke 3:3:java.lang.Object invoke(java.lang.Object,java.lang.Object):0 -> invoke - 4:5:void org.mozilla.experiments.nimbus.NimbusKt.writeOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):244:245 -> invoke - 4:5:void invoke(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):236 -> invoke + 4:5:void org.mozilla.experiments.nimbus.NimbusKt.writeOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):320:321 -> invoke + 4:5:void invoke(org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.RustBufferBuilder):312 -> invoke 4:5:java.lang.Object invoke(java.lang.Object,java.lang.Object):0 -> invoke 6:6:java.lang.Object invoke(java.lang.Object,java.lang.Object):0:0 -> invoke org.mozilla.experiments.nimbus.RemoteSettingsConfig -> org.mozilla.experiments.nimbus.RemoteSettingsConfig:
- Author
So, Nimbus. Indeed, this looks like #40085 (comment 2708957)
- Author
As a note for context, #40085 (closed) was caused by
glean_parser
's code generation. Nimbus uses uniffi for code generation with nimbus.idl as the input.Edited by Matthew Finkel - Author
> Task :app:minifyBetaWithR8 FAILED R8: Failed to dump inputs
Note: make sure the directory exists :)
I used something like
mkdir $builddir-[% c("version") %]/dumpdir
and added-Dcom.android.tools.r8.dumpinputtodirectory=$builddir-[% c("version") %]/dumpdir
as the gradle command argument.Next, we have 9 files named
dump702*.zip
indumpdir
looking like:$ unzip -l dumpdir/dump702139627901928.zip Archive: dumpdir/dump702139627901928.zip Length Date Time Name --------- ---------- ----- ---- 97 1970-01-01 00:00 r8-version 92904 1970-01-01 00:00 proguard.config 37031656 1970-01-01 00:00 program.jar 22 1970-01-01 00:00 classpath.jar 4486969 1970-01-01 00:00 library.jar --------- ------- 41611648 5 files
We want the class file from
program.jar
. Attached is the file forNimbusKt.class
(the first file with a difference in the previous comment) (underorg/mozilla/experiments/nimbus/NimbusKt.class
). - Author
R8 produced the same intermediate
.class
files in different containers. Next, I'll try rebuildingandroid-components
and we'll see if that changes anything.$ sha256sum dumpdir/build1/dump702139627901928/program/org/mozilla/experiments/nimbus/NimbusKt.class dumpdir/build2/dump706245721639794/program/org/mozilla/experiments/nimbus/NimbusKt.class 2bb4c31d4d4fbe8a34e9a96f1ef53b551b6f71fbc042eb18508636cf34eaa979 dumpdir/build1/dump702139627901928/program/org/mozilla/experiments/nimbus/NimbusKt.class 2bb4c31d4d4fbe8a34e9a96f1ef53b551b6f71fbc042eb18508636cf34eaa979 dumpdir/build2/dump706245721639794/program/org/mozilla/experiments/nimbus/NimbusKt.class
I got
df7f258a465fe9746284c66cbb1c94e05e1d8b7166581f57049972ccef3a7a5b ./org/mozilla/experiments/nimbus/NimbusKt.class
Uploaded to https://people.torproject.org/~acat/builds/10.5a7-build2/NimbusKt.class
- Author
Thanks!
I got
2bb4c31d4d4fbe8a34e9a96f1ef53b551b6f71fbc042eb18508636cf34eaa979 org/mozilla/experiments/nimbus/NimbusKt.class
And for the diff we get:
$ diff -u {acat,sysrqb}/NimbusKt.class.xxd | wc -l 1346
(Snippet from first 140 lines of xxd)
--- acat/NimbusKt.class.xxd.140 2021-01-19 23:27:47.869989604 +0000 +++ sysrqb/NimbusKt.class.xxd.140 2021-01-19 23:27:55.046013778 +0000 @@ -129,12 +129,12 @@ 00000800: 732f 5275 7374 4275 6666 6572 4275 696c s/RustBufferBuil 00000810: 6465 723b 0100 0176 0100 204c 6b6f 746c der;...v.. Lkotl 00000820: 696e 2f6a 766d 2f66 756e 6374 696f 6e73 in/jvm/functions -00000830: 2f46 756e 6374 696f 6e32 3b01 0026 6c69 /Function2;..&li -00000840: 6674 4f70 7469 6f6e 616c 5265 636f 7264 ftOptionalRecord -00000850: 5265 6d6f 7465 5365 7474 696e 6773 436f RemoteSettingsCo -00000860: 6e66 6967 0100 6a28 4c6f 7267 2f6d 6f7a nfig..j(Lorg/moz -00000870: 696c 6c61 2f65 7870 6572 696d 656e 7473 illa/experiments -00000880: 2f6e 696d 6275 732f 5275 7374 4275 6666 /nimbus/RustBuff -00000890: 6572 2442 7956 616c 7565 3b29 4c6f 7267 er$ByValue;)Lorg -000008a0: 2f6d 6f7a 696c 6c61 2f65 7870 6572 696d /mozilla/experim -000008b0: 656e 7473 2f6e 696d 6275 732f 5265 6d6f ents/nimbus/Remo +00000830: 2f46 756e 6374 696f 6e32 3b01 0012 6c69 /Function2;...li +00000840: 6674 4f70 7469 6f6e 616c 7374 7269 6e67 ftOptionalstring +00000850: 0100 4728 4c6f 7267 2f6d 6f7a 696c 6c61 ..G(Lorg/mozilla +00000860: 2f65 7870 6572 696d 656e 7473 2f6e 696d /experiments/nim +00000870: 6275 732f 5275 7374 4275 6666 6572 2442 bus/RustBuffer$B +00000880: 7956 616c 7565 3b29 4c6a 6176 612f 6c61 yValue;)Ljava/la +00000890: 6e67 2f53 7472 696e 673b 0100 244c 6f72 ng/String;..$Lor +000008a0: 672f 6a65 7462 7261 696e 732f 616e 6e6f g/jetbrains/anno +000008b0: 7461 7469 6f6e 732f 4e75 6c6c 6162 6c65 tations/Nullable
For context, the first file diverges with
liftOptionalRecordRemoteSettingsConfig
and the second file diverges withliftOptionalstring
. I find surprising that the files are identical (with function declarations) for the first 2096 bytes. - Author
Next update, I rebuilt
applications-services
and (in the fenix build) I now have a new and distinctpg_map_id
. The first few differences between the new mapping file and acat's:--- sysrqb/mapping.txt 2021-01-20 03:10:24.045794465 +0000 +++ acat/mapping.txt 2021-01-19 10:24:32.000000000 +0000 @@ -1,7 +1,7 @@ # compiler: R8 # compiler_version: 2.0.88 # min_api: 21 -# pg_map_id: f34058f +# pg_map_id: 0869694 # common_typos_disable GeckoProvider -> GeckoProvider: 1:1:void <clinit>():20:20 -> <clinit> @@ -160213,7 +160213,7 @@ 3:3:void org.mozilla.experiments.nimbus.NimbusKt.write(byte,org.mozilla.experiments.nimbus.RustBufferBuilder):0:0 -> write$nimbus_release 3:3:void write$nimbus_release(org.mozilla.experiments.nimbus.RustBufferBuilder):858 -> write$nimbus_release 4:4:void org.mozilla.experiments.nimbus.RustBufferBuilder.putByte(byte):135:135 -> write$nimbus_release - 4:4:void org.mozilla.experiments.nimbus.NimbusKt.write(byte,org.mozilla.experiments.nimbus.RustBufferBuilder):348 -> write$nimbus_release + 4:4:void org.mozilla.experiments.nimbus.NimbusKt.write(byte,org.mozilla.experiments.nimbus.RustBufferBuilder):266 -> write$nimbus_release 4:4:void write$nimbus_release(org.mozilla.experiments.nimbus.RustBufferBuilder):858 -> write$nimbus_release org.mozilla.experiments.nimbus.AvailableRandomizationUnits$lower$1 -> org.mozilla.experiments.nimbus.AvailableRandomizationUnits$lower$1: 1:1:java.lang.Object invoke(java.lang.Object,java.lang.Object):834:834 -> invoke @@ -160300,7 +160300,7 @@ 3:3:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.AppContext.lower$nimbus_release():751:751 -> <init> 3:3:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886 -> <ini t> 4:4:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886:886 -> <init> - 5:5:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.NimbusKt.lowerOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig):277:277 -> <init> + 5:5:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.NimbusKt.lowerOptionalRecordRemoteSettingsConfig(org.mozilla.experiments.nimbus.RemoteSettingsConfig):235:235 -> <init> 5:5:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886 -> <ini t> 6:6:org.mozilla.experiments.nimbus.RustBuffer$ByValue org.mozilla.experiments.nimbus.AvailableRandomizationUnits.lower$nimbus_release():853:853 -> <init> 6:6:void <init>(org.mozilla.experiments.nimbus.AppContext,java.lang.String,org.mozilla.experiments.nimbus.RemoteSettingsConfig,org.mozilla.experiments.nimbus.AvailableRandomizationUnits):886 -> <ini t>
- Author
Interestingly, the functions that are different between files are the same between in both diffs. Their line numbers are different, but it looks like only the same functions signatures were re-ordered.
- Developer
Good stuff! I guess we are at #40085 (comment 2709123) now, figuring out whether the source code for both instances differs or not. I wonder whether there is again some source code creation involved that does not work deterministically...
Edited by Georg Koppen - Author
I looked at the uniffi source yesterday but I didn't see any non-deterministic code generation. The definition was parsed from the .idl file and it was put into vectors, then they iterated over those vectors for creating the actual Kotlin code. I didn't see any iteration of hashmaps (or other data structures that don't guarantee order).
One idea I have is that we backout the new Nimbus code in Fenix, but I need to test this theory. I looked at the Nimbus repo and application-services repo, and there aren't any patches between the code we used in 84 and the code now used in 85 that would introduce this issue. The only difference is that Fenix is now using Nimbus, so my current assumption is that R8 (or whichever toolchain subsystem) was optimizing out Nimbus from the earlier builds. The current Nimbus implementation in Fenix is small, so it is a reasonable short-term fix while we find the root cause.
- Developer
Matthew Finkel:
Matthew Finkel commented on a discussion: #40208 (comment 2722628)
I looked at the uniffi source yesterday but I didn't see any non-deterministic code generation. The definition was parsed from the .idl file and it was put into vectors, then they iterated over those vectors for creating the actual Kotlin code. I didn't see any iteration of hashmaps (or other data structures that don't guarantee order).
Did you look at the actual code generated during two builds which differ the NimbusKt.class? That is are you saying there is exactly the same source code that results in different NimbusKt.class? Could you point to that source or attach it somewhere?
- Author
Did you look at the actual code generated during two builds which differ the NimbusKt.class? That is are you saying there is exactly the same source code that results in different NimbusKt.class? Could you point to that source or attach it somewhere?
Heh, I was just about to post that. I only have one instance of it, but I'll create a second after I destroy this container and start another build. To be clear, I did not want to imply the generated code was the same, I simply don't see why the generated code would be different across builds because I don't see any place where the idl parsing and code generation use non-deterministic code. But, obviously something is non-deterministic so I likely missed something.
- Author
And now we have a second.
--- nimbus.kt 2021-01-20 15:23:39.057111864 +0000 +++ nimbus_2.kt 2021-01-20 15:56:45.273063530 +0000 @@ -256,6 +256,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + // Helper functions for pasing values of type String? internal fun liftOptionalstring(rbuf: RustBuffer.ByValue): String? { @@ -290,62 +314,20 @@ -internal fun String.Companion.lift(rbuf: RustBuffer.ByValue): String { - try { - val byteArr = ByteArray(rbuf.len) - rbuf.asByteBuffer()!!.get(byteArr) - return byteArr.toString(Charsets.UTF_8) - } finally { - RustBuffer.free(rbuf) - } -} - -internal fun String.Companion.read(buf: ByteBuffer): String { - val len = buf.getInt() - val byteArr = ByteArray(len) - buf.get(byteArr) - return byteArr.toString(Charsets.UTF_8) -} - -internal fun String.lower(): RustBuffer.ByValue { - val byteArr = this.toByteArray(Charsets.UTF_8) - // Ideally we'd pass these bytes to `ffi_bytebuffer_from_bytes`, but doing so would require us - // to copy them into a JNA `Memory`. So we might as well directly copy them into a `RustBuffer`. - val rbuf = RustBuffer.alloc(byteArr.size) - rbuf.asByteBuffer()!!.put(byteArr) - return rbuf -} - -internal fun String.write(buf: RustBufferBuilder) { - val byteArr = this.toByteArray(Charsets.UTF_8) - buf.putInt(byteArr.size) - buf.put(byteArr) -} - - - - - - - - - - - -internal fun Byte.Companion.lift(v: Byte): Byte { - return v +internal fun Boolean.Companion.lift(v: Byte): Boolean { + return v.toInt() != 0 } -internal fun Byte.Companion.read(buf: ByteBuffer): Byte { - return buf.get() +internal fun Boolean.Companion.read(buf: ByteBuffer): Boolean { + return Boolean.lift(buf.get()) } -internal fun Byte.lower(): Byte { - return this +internal fun Boolean.lower(): Byte { + return if (this) 1.toByte() else 0.toByte() } -internal fun Byte.write(buf: RustBufferBuilder) { - buf.putByte(this) +internal fun Boolean.write(buf: RustBufferBuilder) { + buf.putByte(this.lower()) } @@ -388,39 +370,57 @@ -internal fun Boolean.Companion.lift(v: Byte): Boolean { - return v.toInt() != 0 +internal fun String.Companion.lift(rbuf: RustBuffer.ByValue): String { + try { + val byteArr = ByteArray(rbuf.len) + rbuf.asByteBuffer()!!.get(byteArr) + return byteArr.toString(Charsets.UTF_8) + } finally { + RustBuffer.free(rbuf) + } } -internal fun Boolean.Companion.read(buf: ByteBuffer): Boolean { - return Boolean.lift(buf.get()) +internal fun String.Companion.read(buf: ByteBuffer): String { + val len = buf.getInt() + val byteArr = ByteArray(len) + buf.get(byteArr) + return byteArr.toString(Charsets.UTF_8) } -internal fun Boolean.lower(): Byte { - return if (this) 1.toByte() else 0.toByte() +internal fun String.lower(): RustBuffer.ByValue { + val byteArr = this.toByteArray(Charsets.UTF_8) + // Ideally we'd pass these bytes to `ffi_bytebuffer_from_bytes`, but doing so would require us + // to copy them into a JNA `Memory`. So we might as well directly copy them into a `RustBuffer`. + val rbuf = RustBuffer.alloc(byteArr.size) + rbuf.asByteBuffer()!!.put(byteArr) + return rbuf } -internal fun Boolean.write(buf: RustBufferBuilder) { - buf.putByte(this.lower()) +internal fun String.write(buf: RustBufferBuilder) { + val byteArr = this.toByteArray(Charsets.UTF_8) + buf.putInt(byteArr.size) + buf.put(byteArr) } +internal fun Byte.Companion.lift(v: Byte): Byte { + return v +} +internal fun Byte.Companion.read(buf: ByteBuffer): Byte { + return buf.get() +} +internal fun Byte.lower(): Byte { + return this +} - - - - - - - - - - +internal fun Byte.write(buf: RustBufferBuilder) { + buf.putByte(this) +}
- Developer
So, the source code is the same (apart from re-ordering), right? Thus, it seems it does not explain the differences in the
mapping.txt
files. Although, we might not really know as themapping.txt
files and the generated source code is not from the same builds...Edited by Georg Koppen - Author
The differences in the
mapping.txt
files were only at line numbers, so I believe this does explain it. - Developer
Ah, I see. I was confused by the non-NimbusKt-reorderings but those are due to the NimbusKt ones.
- Author
Okay, for a slightly updated understanding of how the code generation happens:
uniffi
uses "Jinja-like templates" for selectively including blocks of pre-generated code. Those templates are converted by askama into generated kotlin source code by outputting each appropriate code block. Unfortunately, each code block is added by iterating through a hashset: https://github.com/djc/askama/blob/0.10.0/askama_shared/src/generator.rs#L568So, the non-determinism isn't when the idl is parsed, it is when the generated code is added.
Edited by Matthew Finkel - Author
I opened a github issue on uniffi_bindgen: https://github.com/mozilla/uniffi-rs/issues/374
- Author
Looking at the dex file format, the first difference is found in the checksum of the dex file. The checksum is different because the
pg-map-id
is different (in the second difference). Why is thepg-map-id
different in the two packages? (I don't know.) Nothing else differs.The package manifests only show
classes.dex
having different hashes:$ diff -u {acat,sysrqb}/android-x86_64/META-INF/MANIFEST.MF --- acat/android-x86_64/META-INF/MANIFEST.MF 2000-01-01 00:00:00.000000000 +0000 +++ sysrqb/android-x86_64/META-INF/MANIFEST.MF 2000-01-01 00:00:00.000000000 +0000 @@ -2024,7 +2024,7 @@ SHA-256-Digest: jKe9O9LKMMjmUVDqUuHADvQYAhVprHPH+0isIHnuEpk= Name: classes.dex -SHA-256-Digest: 9qCg495dHlqlKSH1Y+c45aekhjOFHYRs2x+wZX6fNb4= +SHA-256-Digest: QMr5PGUz74o9GT8a6G6DzkKdgvGUOmjpK9zpLS4OZzg= Name: classes2.dex SHA-256-Digest: qXYkhR88y0+XRoAs/l11/pg6/1tHe/1llEXRJzTx1C8= `android@linux:~/10.5a7-build2$ diff -u {acat,sysrqb}/android-x86_64/META-INF/ANDROIDQ.SF
$ diff -u {acat,sysrqb}/android-x86_64/META-INF/ANDROIDQ.SF --- acat/android-x86_64/META-INF/ANDROIDQ.SF 2000-01-01 00:00:00.000000000 +0000 +++ sysrqb/android-x86_64/META-INF/ANDROIDQ.SF 2000-01-01 00:00:00.000000000 +0000 @@ -1,6 +1,6 @@ Signature-Version: 1.0 Created-By: 1.0 (Android) -SHA-256-Digest-Manifest: 3Xzpuws9MrsDIOSTAmaiMPDk2YfFsMaGlKmHLLplk0w= +SHA-256-Digest-Manifest: EsvtaWpp8gCbZSwTe0oaTjpSRRDzisldQrNaHf9OiZA= X-Android-APK-Signed: 2 Name: AndroidManifest.xml @@ -2025,7 +2025,7 @@ SHA-256-Digest: T7GTSumDPuu2ZvRvOTu0O85qqvIVFQGI03cPCEgtgbQ= Name: classes.dex -SHA-256-Digest: 0VT1LWd4ewWDDM+i1FRZ80oGeqW5v9wIKAQsli0JbrY= +SHA-256-Digest: 5e2CY+ScQVTEjrdWBTG8ktN+ISx37E+jxFt2dgNhcnE= Name: classes2.dex SHA-256-Digest: 3Vd1OCHoRYhVVsm/mz9WP9Wgicx8iOIrOnHXilxvTnw=
- Georg Koppen changed milestone to %Tor Browser: 10.0
changed milestone to %Tor Browser: 10.0
- Matthew Finkel added Doing label
added Doing label
- Matthew Finkel mentioned in merge request !196 (closed)
mentioned in merge request !196 (closed)
- Author
Let's see if !196 (closed) fixes this.
- Matthew Finkel mentioned in merge request !197 (merged)
mentioned in merge request !197 (merged)
- Gitolite Merge Bot closed with merge request !197 (merged)
closed with merge request !197 (merged)
- Georg Koppen added Backport label
added Backport label
- Developer
Marking this for backporting as we need it for stable, too.
- Matthew Finkel mentioned in issue tor-browser#40420 (closed)
mentioned in issue tor-browser#40420 (closed)
- Matthew Finkel mentioned in issue #40293 (closed)
mentioned in issue #40293 (closed)