{"id":357225,"date":"2024-05-20T23:46:18","date_gmt":"2024-05-20T23:46:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=357225"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-20T23:46:18","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=357225","title":{"rendered":"<span>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f Record \u0434\u043b\u044f Android<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 Android Developers Blog \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/android-developers.googleblog.com\/2023\/06\/records-in-android-studio-flamingo.html\" rel=\"noopener noreferrer nofollow\">Records in Android Studio Flamingo<\/a> \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b R8\/D8 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043a\u043b\u0430\u0441\u0441\u044b <code>java.lang.Record<\/code>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 <code>toString()<\/code> \u0443 Kotlin data-\u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041c\u0435\u043d\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432 \u043d\u0435\u0435 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f &#171;\u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a&#187; \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 R8 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>toString()<\/code> \u0443 Record. \u0412 \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 Record \u0432 Java \u0438 Kotlin. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0442 Record \u0432 Android \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043a\u0430\u043a \u0432 &#171;\u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u043e\u0439&#187; JVM. \u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Record&#8217;\u044b \u0432\u043c\u0435\u0441\u0442\u043e data-\u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<h3>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e R8<\/h3>\n<p>\u041f\u0440\u043e R8\/D8 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439. \u042f \u043e\u0442\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u043e\u0431\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0434\u0438\u043d jar-\u0444\u0430\u0439\u043b \u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0441\u0430\u043c\u044b\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Java (\u0432 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e 20).<\/p>\n<p>\u0423 CLI \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/refs\/tags\/8.2.20-dev\/src\/main\/java\/com\/android\/tools\/r8\/R8CommandParser.java\" rel=\"noopener noreferrer nofollow\">R8<\/a> \u0438 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/refs\/tags\/8.2.20-dev\/src\/main\/java\/com\/android\/tools\/r8\/D8CommandParser.java#30\" rel=\"noopener noreferrer nofollow\">D8<\/a> \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043e\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043e\u0431\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0422\u0430\u043a \u043e\u0431\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043f\u0446\u0438\u044e <code>--classfile<\/code>. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 <em>.dex<\/em> \u0444\u0430\u0439\u043b \u0441 android \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c <em>.class<\/em> \u0444\u0430\u0439\u043b\u044b. \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 R8 \u0432 android-\u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 R8\/D8 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/iljaosintsev\/DesugaringRecords\/blob\/main\/r8\/src\/main\/kotlin\/com\/turlir\/gradle\/r8\/CompileR8.kt\" rel=\"noopener noreferrer nofollow\">gradle \u0442\u0430\u0441\u043a<\/a> \u0438\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 Java\/Kotlin, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f R8\/D8 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0421\u0432\u043e\u0438 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f \u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u0432 \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435. \u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Android SDK (Api level 34), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f Kotlin 1.9 \u0438 R8 \u0432\u0435\u0440\u0441\u0438\u0438 <em>8.2.2-dev<\/em>. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434  \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 <a href=\"https:\/\/github.com\/iljaosintsev\/DesugaringRecords\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a> \u043d\u0430 GitHub.<\/p>\n<h3>\u041c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Record<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 Record \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Java<\/p>\n<pre><code class=\"java\">public record User(String name, int age) { }<\/code><\/pre>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f Java 17, \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043e\u0442\u0440\u044b\u0432\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>User.class<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>public final class User extends java.lang.Record   minor version: 0   major version: 61   flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER   this_class: #8                          \/\/ User   super_class: #2                         \/\/ java\/lang\/Record   interfaces: 0, fields: 2, methods: 6, attributes: 4    Constant pool:   #10 = Utf8               User   #11 = Utf8               name   #15 = Utf8               age   #53 = Utf8               name;age  public final java.lang.String toString();     descriptor: ()Ljava\/lang\/String;     flags: (0x0011) ACC_PUBLIC, ACC_FINAL     Code:       stack=1, locals=1, args_size=1          0: aload_0          1: invokedynamic #17,  0  \/\/ InvokeDynamic #0:toString:(LUser;)Ljava\/lang\/String;          6: areturn       LineNumberTable:         line 2: 0       LocalVariableTable:         Start  Length  Slot  Name   Signature             0       7     0  this   LUser;  BootstrapMethods:   0: #45 REF_invokeStatic java\/lang\/runtime\/ObjectMethods.bootstrap:(Ljava\/lang\/invoke\/MethodHandles$Lookup;Ljava\/lang\/String;Ljava\/lang\/invoke\/TypeDescriptor;Ljava\/lang\/Class;Ljava\/lang\/String;[Ljava\/lang\/invoke\/MethodHandle;)Ljava\/lang\/Object;     Method arguments:       #10 User       #53 name;age       #54 REF_getField User.name:Ljava\/lang\/String;       #55 REF_getField User.age:I<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>toString()<\/code> \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u044f\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>User<\/code>. \u0422\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <em>invokedynamic<\/em>. \u0422\u0430\u043a \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430, \u043b\u0435\u043d\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442-\u043f\u0443\u043b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u043c \u043a \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0438\u0440\u0438\u043d\u0433\u0443.<\/p>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e R8, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u0418\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440  \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <em>name;age<\/em> \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043b \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0435 \u0434\u0440\u0443\u0433\u0443\u044e, \u0441 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0435\u0439 <em>a;b<\/em>. \u041d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0432 \u043d\u043e\u0432\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442-\u043f\u0443\u043b\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c.<\/p>\n<pre><code>public final class User extends java.lang.Record   minor version: 0   major version: 61   flags: (0x0011) ACC_PUBLIC, ACC_FINAL   this_class: #5                          \/\/ User   super_class: #7                         \/\/ java\/lang\/Record   interfaces: 0, fields: 2, methods: 4, attributes: 3  Constant pool:    #1 = Utf8               ~~R8{ ... }    #4 = Utf8               User    #8 = Utf8               a    #9 = Utf8               Ljava\/lang\/String;    #10 = Utf8              b    #11 = Utf8              I    #23 = Utf8              a;b<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0432 Gradle \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u043f\u043e\u0434 Java 17 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <code>toString()<\/code> \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d.<\/p>\n<pre><code class=\"kotlin\">val user = User(\"turlir\", 29) println(user.toString()) \/\/ User[a=turlir, b=29]<\/code><\/pre>\n<p>\u041c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0433\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Android. \u0412 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/lang\/Record.html\" rel=\"noopener noreferrer nofollow\">java.lang.Record<\/a> \u0438 bootstrap-\u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/lang\/runtime\/ObjectMethods.html#bootstrap(java.lang.invoke.MethodHandles.Lookup,java.lang.String,java.lang.invoke.TypeDescriptor,java.lang.Class,java.lang.String,java.lang.invoke.MethodHandle...)\" rel=\"noopener noreferrer nofollow\">ObjectMethods.bootstrap<\/a>. \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043c desugaring \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u0443\u0441\u0442\u0438\u043c  \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b R8 \u043d\u0430 \u0432\u0445\u043e\u0434 D8. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c \u0441  Android. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a <em>.class<\/em> \u0444\u0430\u0439\u043b.<\/p>\n<details class=\"spoiler\">\n<summary>User.class<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>public final class User extends com.android.tools.r8.RecordTag   minor version: 0   major version: 51   flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER   this_class: #5                          \/\/ User   super_class: #7                         \/\/ com\/android\/tools\/r8\/RecordTag   interfaces: 0, fields: 2, methods: 6, attributes: 1    private java.lang.Object[] $record$getFieldsAsObjects();     descriptor: ()[Ljava\/lang\/Object;     flags: (0x1002) ACC_PRIVATE, ACC_SYNTHETIC     Code:       stack=16, locals=16, args_size=1          0: iconst_2          1: anewarray     #24                 \/\/ class java\/lang\/Object          4: astore_1          5: aload_1          6: iconst_0          7: aload_0          8: getfield      #18                 \/\/ Field a:Ljava\/lang\/String;         11: aastore         12: aload_1         13: iconst_1         14: aload_0         15: getfield      #20                 \/\/ Field b:I         18: invokestatic  #44                 \/\/ Method java\/lang\/Integer.valueOf:(I)Ljava\/lang\/Integer;         21: aastore         22: aload_1         23: areturn    public final java.lang.String toString();     descriptor: ()Ljava\/lang\/String;     flags: (0x0011) ACC_PUBLIC, ACC_FINAL     Code:       stack=3, locals=1, args_size=1          0: aload_0          1: invokespecial #32                 \/\/ Method $record$getFieldsAsObjects:()[Ljava\/lang\/Object;          4: ldc           #5                  \/\/ class User          6: ldc           #48                 \/\/ String a;b          8: invokestatic  #54                 \/\/ Method User$$ExternalSyntheticRecord0.m:([Ljava\/lang\/Object;Ljava\/lang\/Class;Ljava\/lang\/String;)Ljava\/lang\/String;         11: areturn<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0441\u0442\u0430\u043b \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 <code>com.android.tools.r8.RecordTag<\/code>. \u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>$record$getFieldsAsObjects()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439  \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043c\u0430\u0441\u043a\u043e\u0439 <em>a;b<\/em>. \u0412 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 <code>ExternalSyntheticRecord0<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>StringBuilder<\/code>) \u043f\u043e \u043c\u0430\u0441\u043a\u0435 \u0438\u0437 \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>hashCode<\/code> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u043a <code>ExternalSyntheticRecord1<\/code> \u0433\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u0441\u043e\u0432. <\/p>\n<p>\u041e\u0431\u0430 <em>SyntheticRecord<\/em> \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 Record \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0435. <code>RecordTag<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 Record \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f). R8 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>RecordTag<\/code>. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/p>\n<blockquote>\n<p>Class content provided for type descriptor com.android.tools.r8.RecordTag actually defines class java.lang.Record]<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c jar\/aar \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441 Record \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c &#171;\u043a\u0430\u043a \u0435\u0441\u0442\u044c&#187;. <code>RecordTag<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 desugaring&#8217;\u0430 \u043a\u043e\u0434\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<h3>\u041c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Kotlin Record<\/h3>\n<p>Kotlin \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Record \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <em><a class=\"mention\" href=\"\/users\/JvmRecord\">@JvmRecord<\/a><\/em>.  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0438\u043a\u0441 \u0438\u0437 \u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e data-\u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>copy()<\/code> \u0438 <code>componentN()<\/code>, \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 <code>java.lang.Record<\/code> \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438-\u0433\u0435\u0442\u0442\u0435\u0440\u0430\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <em>get<\/em>.<\/p>\n<pre><code class=\"kotlin\">@JvmRecord data class Person(     val name: String,     val age: Int )<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0435\u0442\u0438\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 data-\u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0431\u0430\u0439\u0442 \u043a\u043e\u0434\u0430. \u041a\u043b\u0430\u0441\u0441 <code>Person<\/code> \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a <code>User<\/code> \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0443\u044f\u0437\u0432\u0438\u043c \u0434\u043b\u044f \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0438\u0440\u0438\u043d\u0433\u0430, \u043c\u043e\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>Person.class<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>public final class Person extends java.lang.Record   minor version: 0   major version: 61   flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER   this_class: #2                          \/\/ Person   super_class: #4                         \/\/ java\/lang\/Record   interfaces: 0, fields: 2, methods: 10, attributes: 4    Constant pool:   #8 = Utf8               name   #22 = Utf8              age   #42 = String  #41  \/\/ Person(name=\\u0001, age=\\u0001)    public java.lang.String toString();     descriptor: ()Ljava\/lang\/String;     flags: (0x0001) ACC_PUBLIC     Code:       stack=2, locals=1, args_size=1          0: aload_0          1: getfield      #21                 \/\/ Field name:Ljava\/lang\/String;          4: aload_0          5: getfield      #25                 \/\/ Field age:I          8: invokedynamic #52,  0             \/\/ InvokeDynamic #0:makeConcatWithConstants:(Ljava\/lang\/String;I)Ljava\/lang\/String;         13: areturn  BootstrapMethods:   0: #49 REF_invokeStatic java\/lang\/invoke\/StringConcatFactory.makeConcatWithConstants:(Ljava\/lang\/invoke\/MethodHandles$Lookup;Ljava\/lang\/String;Ljava\/lang\/invoke\/MethodType;Ljava\/lang\/String;[Ljava\/lang\/Object;)Ljava\/lang\/invoke\/CallSite;     Method arguments:       #42 Person(name=\\u0001, age=\\u0001)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 <code>Person.toString()<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/lang\/invoke\/StringConcatFactory.html\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u043e\u0439<\/a> bootstrap-\u043c\u0435\u0442\u043e\u0434. \u041f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043a\u043e\u0434\u0430 R8 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/facedf41bbd28b563d1e9e09c5f72d7c5ca598d5\/src\/main\/java\/com\/android\/tools\/r8\/ir\/desugar\/records\/RecordRewriterHelper.java#31\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443<\/a> \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e bootstrap-\u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e, \u0442\u043e \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a \u043a\u0430\u043a R8 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <em>ObjectMethods.bootstrap.names<\/em>. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b \u043c\u0430\u0441\u043a\u0443 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 <em>a;b<\/em>. \u041c\u0430\u0441\u043a\u0430 \u0434\u043b\u044f <code>StringConcatFactory.makeConcatWithConstants<\/code> \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f R8 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442-\u043f\u0443\u043b\u0435 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 desugaring&#8217;\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u044b\u0437\u043e\u0432 <em>invokedynamic<\/em> \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>toString()<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>StringBuilder.append<\/code>. \u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f class-\u0444\u0430\u0439\u043b. \u0417\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>$record$getFieldsAsObjects()<\/code> \u0432 D8 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/facedf41bbd28b563d1e9e09c5f72d7c5ca598d5\/src\/main\/java\/com\/android\/tools\/r8\/ir\/synthetic\/RecordCfCodeProvider.java#35\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440<\/a>. \u041e\u043d \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 Record \u0431\u044b\u043b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 <em>invokedynamic<\/em>. \u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>Person<\/code> \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438 \u043a\u043b\u0430\u0441\u0441\u044b <em>SyntheticRecord<\/em>  \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f.<\/p>\n<h3>\u041f\u0440\u0438\u0437\u0440\u0430\u043a indify<\/h3>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Android 8.0 (Api level 26) \u0440\u0430\u043d\u0442\u0430\u0439\u043c <a href=\"https:\/\/source.android.com\/docs\/core\/runtime\/dex-format#file-layout:~:text=boot%20class%20path.-,Note,-%3A%20Support%20for\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442<\/a> \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <em>invoke-polymorphic<\/em> \u0438 <em>invoke-custom<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <em>invokedynamic<\/em>. \u0412 Android 14 (Api level 34) \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/developer.android.com\/reference\/java\/lang\/Record?hl=en\" rel=\"noopener noreferrer nofollow\">java.lang.Record<\/a> \u043d\u043e \u0438 <a href=\"https:\/\/developer.android.com\/reference\/java\/lang\/runtime\/ObjectMethods?hl=en#bootstrap(java.lang.invoke.MethodHandles.Lookup,%20java.lang.String,%20java.lang.invoke.TypeDescriptor,%20java.lang.Class%3C?%3E,%20java.lang.String,%20java.lang.invoke.MethodHandle%5B%5D)\" rel=\"noopener noreferrer nofollow\">ObjectMethods.bootstrap<\/a>. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 desugaring&#8217;\u0430 \u043c\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0447\u0442\u043e D8 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/facedf41bbd28b563d1e9e09c5f72d7c5ca598d5\/src\/main\/java\/com\/android\/tools\/r8\/utils\/InternalOptions.java#2452\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/a> \u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Record \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 desugaring \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0432 \u043d\u0435\u043c \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0432\u0435\u0442\u043a\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <em>invokedynamic<\/em>. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0432 classpath \u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e <code>java.lang.Record<\/code> \u0438 <code>com.android.tools.r8.RecordTag<\/code>.<\/p>\n<p>\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 D8 \u044f \u043d\u0430\u0448\u0435\u043b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043e\u043f\u0446\u0438\u044e <code>com.android.tools.r8.emitRecordAnnotationsInDex<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043d\u0443\u0436\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c desugaring \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 Record \u043a\u043b\u0430\u0441\u0441. \u041f\u0440\u0438 \u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <em>dalvik.annotation.Record<\/em>, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <em>invokedynamic<\/em> \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u043d\u0430 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 <em>invoke-custom<\/em> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0442\u043e \u043c\u0430\u0440\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043a\u043b\u0430\u0441\u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u0432 <a href=\"https:\/\/source.android.com\/docs\/core\/runtime\/dex-format#system-annotation\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>, \u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/android.googlesource.com\/platform\/libcore\/+\/refs\/heads\/main\/dalvik\/src\/main\/java\/dalvik\/annotation\/Record.java\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>User.dex<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>Class #2 header: class_idx           : 3 access_flags        : 17 (0x0011) superclass_idx      : 9 interfaces_off      : 0 (0x000000) source_file_idx     : 31 annotations_off     : 2640 (0x000a50) class_data_off      : 2561 (0x000a01) static_fields_size  : 0 instance_fields_size: 2 direct_methods_size : 1 virtual_methods_size: 3  Class #2 annotations: Annotations on class   VISIBILITY_SYSTEM Ldalvik\/annotation\/Record; componentNames={ \"a\" \"b\" } componentTypes={ Ljava\/lang\/String; I }    Class #2            -   Class descriptor  : 'LUser;'   Access flags      : 0x0011 (PUBLIC FINAL)   Superclass        : 'Ljava\/lang\/Record;'   Interfaces        -   Static fields     -   Instance fields   -     #0              : (in LUser;)       name          : 'a'       type          : 'Ljava\/lang\/String;'       access        : 0x0011 (PUBLIC FINAL)     #1              : (in LUser;)       name          : 'b'       type          : 'I'       access        : 0x0011 (PUBLIC FINAL)   Direct methods    -     #0              : (in LUser;)       name          : 'init'       type          : '(Ljava\/lang\/String;I)V'       access        : 0x10001 (PUBLIC CONSTRUCTOR)       method_idx    : 5       code          -       registers     : 3       ins           : 3       outs          : 1       insns size    : 8 16-bit code units 0005c8:                                        |[0005c8] User.init:(Ljava\/lang\/String;I)V 0005d8: 7010 0b00 0000                         |0000: invoke-direct {v0}, Ljava\/lang\/Record;.&lt;init>:()V \/\/ method@000b 0005de: 5b01 0200                              |0003: iput-object v1, v0, LUser;.a:Ljava\/lang\/String; \/\/ field@0002 0005e2: 5902 0300                              |0005: iput v2, v0, LUser;.b:I \/\/ field@0003 0005e6: 0e00                                   |0007: return-void       catches       : (none)       positions     :       locals        :  Virtual methods   -     #0              : (in LUser;)       name          : 'equals'       type          : '(Ljava\/lang\/Object;)Z'       access        : 0x0011 (PUBLIC FINAL)       method_idx    : 6       code          -       registers     : 2       ins           : 2       outs          : 2       insns size    : 5 16-bit code units 000574:                                        |[000574] User.equals:(Ljava\/lang\/Object;)Z 000584: fc20 0000 1000                         |0000: invoke-custom {v0, v1}, call_site@0000 00058a: 0a01                                   |0003: move-result v1 00058c: 0f01                                   |0004: return v1       catches       : (none)       positions     :       locals        :      #1              : (in LUser;)       name          : 'hashCode'       type          : '()I'       access        : 0x0011 (PUBLIC FINAL)       method_idx    : 7       code          -       registers     : 2       ins           : 1       outs          : 1       insns size    : 5 16-bit code units 000590:                                        |[000590] User.hashCode:()I 0005a0: fc10 0100 0100                         |0000: invoke-custom {v1}, call_site@0001 0005a6: 0a00                                   |0003: move-result v0 0005a8: 0f00                                   |0004: return v0       catches       : (none)       positions     :       locals        :      #2              : (in LUser;)       name          : 'toString'       type          : '()Ljava\/lang\/String;'       access        : 0x0011 (PUBLIC FINAL)       method_idx    : 8       code          -       registers     : 2       ins           : 1       outs          : 1       insns size    : 5 16-bit code units 0005ac:                                        |[0005ac] User.toString:()Ljava\/lang\/String; 0005bc: fc10 0200 0100                         |0000: invoke-custom {v1}, call_site@0002 0005c2: 0c00                                   |0003: move-result-object v0 0005c4: 1100                                   |0004: return-object v0       catches       : (none)       positions     :       locals        :    source_file_idx   : 31 (SourceFile)  Method handle #0:   type        : get-instance   target      : LUser; a   target_type : (LUser;java\/lang\/String; Method handle #1:   type        : get-instance   target      : LUser; b   target_type : (LUser; Method handle #2:   type        : invoke-static   target      : Ljava\/lang\/runtime\/ObjectMethods; bootstrap   target_type : (Ljava\/lang\/invoke\/MethodHandles$Lookup;Ljava\/lang\/String;Ljava\/lang\/invoke\/TypeDescriptor;Ljava\/lang\/Class;Ljava\/lang\/String;[Ljava\/lang\/invoke\/MethodHandle;)Ljava\/lang\/Object; Call site #0: \/\/ offset 2587   link_argument[0] : 2 (MethodHandle)   link_argument[1] : equals (String)   link_argument[2] : (LUser;Ljava\/lang\/Object;)Z (MethodType)   link_argument[3] : LUser; (Class)   link_argument[4] : name;age (String)   link_argument[5] : 0 (MethodHandle)   link_argument[6] : 1 (MethodHandle) Call site #1: \/\/ offset 2602   link_argument[0] : 2 (MethodHandle)   link_argument[1] : hashCode (String)   link_argument[2] : (LUser;)I (MethodType)   link_argument[3] : LUser; (Class)   link_argument[4] : name;age (String)   link_argument[5] : 0 (MethodHandle)   link_argument[6] : 1 (MethodHandle) Call site #2: \/\/ offset 2617   link_argument[0] : 2 (MethodHandle)   link_argument[1] : toString (String)   link_argument[2] : (LUser;)Ljava\/lang\/String; (MethodType)   link_argument[3] : LUser; (Class)   link_argument[4] : name;age (String)   link_argument[5] : 0 (MethodHandle)   link_argument[6] : 1 (MethodHandle)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u043f\u0446\u0438\u0438 <code>emitRecordAnnotationsInDex<\/code> \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u043b\u0435\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u042d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u043d\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u043c\u0438\u043d\u0438-\u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043e \u0442\u043e\u043c \u043a\u0430\u043a R8\/D8 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 Record \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 Android \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e R8 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 <code>toString()<\/code> \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <em>invokedynamic<\/em>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 javac. Kotlin \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434. Kotlin Record \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0447\u0442\u043e Java.<\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 D8 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>toString()<\/code>, <code>equals()<\/code> \u0438 <code>hashCode()<\/code> \u043d\u0430 \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u0443\u044e. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Kotlin Record \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u0435\u0439 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435. \u0414\u043b\u044f Java Record \u044d\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043a\u0440\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430-\u0444\u0430\u0431\u0440\u0438\u043a\u0438.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Record \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0435 \u043d\u0435\u0441\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c Android 14 \u0438 \u0432\u044b\u0448\u0435 indify \u0432\u043e\u0439\u0434\u0435\u0442 \u0432 \u043e\u0431\u0438\u0445\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432. \u041a\u043b\u0430\u0441\u0441\u044b \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441\u0442\u0430\u043d\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c\u0438 \u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u0442 \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0438\u0440\u0438\u043d\u0433\u0430. \u041f\u0440\u0438 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438) \u043a\u043e\u0434\u0430 \u043d\u0435 \u043d\u0430\u0434\u043e \u043d\u0430\u0434\u0435\u044f\u0442\u0441\u044f \u043d\u0430 &#171;\u0430\u0432\u043e\u0441\u044c&#187;. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f (\u0434\u0435)\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u0442 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0445 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/766800\/\"> https:\/\/habr.com\/ru\/articles\/766800\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 Android Developers Blog \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/android-developers.googleblog.com\/2023\/06\/records-in-android-studio-flamingo.html\" rel=\"noopener noreferrer nofollow\">Records in Android Studio Flamingo<\/a> \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b R8\/D8 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043a\u043b\u0430\u0441\u0441\u044b <code>java.lang.Record<\/code>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 <code>toString()<\/code> \u0443 Kotlin data-\u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041c\u0435\u043d\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432 \u043d\u0435\u0435 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f &#171;\u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a&#187; \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 R8 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>toString()<\/code> \u0443 Record. \u0412 \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 Record \u0432 Java \u0438 Kotlin. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0442 Record \u0432 Android \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043a\u0430\u043a \u0432 &#171;\u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u043e\u0439&#187; JVM. \u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Record&#8217;\u044b \u0432\u043c\u0435\u0441\u0442\u043e data-\u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<h3>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e R8<\/h3>\n<p>\u041f\u0440\u043e R8\/D8 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439. \u042f \u043e\u0442\u043c\u0435\u0447\u0443 \u0447\u0442\u043e \u043e\u0431\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0434\u0438\u043d jar-\u0444\u0430\u0439\u043b \u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0441\u0430\u043c\u044b\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Java (\u0432 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e 20).<\/p>\n<p>\u0423 CLI \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/refs\/tags\/8.2.20-dev\/src\/main\/java\/com\/android\/tools\/r8\/R8CommandParser.java\" rel=\"noopener noreferrer nofollow\">R8<\/a> \u0438 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/refs\/tags\/8.2.20-dev\/src\/main\/java\/com\/android\/tools\/r8\/D8CommandParser.java#30\" rel=\"noopener noreferrer nofollow\">D8<\/a> \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043e\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043e\u0431\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0422\u0430\u043a \u043e\u0431\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043f\u0446\u0438\u044e <code>--classfile<\/code>. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 <em>.dex<\/em> \u0444\u0430\u0439\u043b \u0441 android \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c <em>.class<\/em> \u0444\u0430\u0439\u043b\u044b. \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 R8 \u0432 android-\u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 R8\/D8 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/iljaosintsev\/DesugaringRecords\/blob\/main\/r8\/src\/main\/kotlin\/com\/turlir\/gradle\/r8\/CompileR8.kt\" rel=\"noopener noreferrer nofollow\">gradle \u0442\u0430\u0441\u043a<\/a> \u0438\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 Java\/Kotlin, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f R8\/D8 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0421\u0432\u043e\u0438 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f \u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u0432 \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435. \u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Android SDK (Api level 34), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f Kotlin 1.9 \u0438 R8 \u0432\u0435\u0440\u0441\u0438\u0438 <em>8.2.2-dev<\/em>. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434  \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 <a href=\"https:\/\/github.com\/iljaosintsev\/DesugaringRecords\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a> \u043d\u0430 GitHub.<\/p>\n<h3>\u041c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Record<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 Record \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Java<\/p>\n<pre><code class=\"java\">public record User(String name, int age) { }<\/code><\/pre>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f Java 17, \u043d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043e\u0442\u0440\u044b\u0432\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>User.class<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>public final class User extends java.lang.Record   minor version: 0   major version: 61   flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER   this_class: #8                          \/\/ User   super_class: #2                         \/\/ java\/lang\/Record   interfaces: 0, fields: 2, methods: 6, attributes: 4    Constant pool:   #10 = Utf8               User   #11 = Utf8               name   #15 = Utf8               age   #53 = Utf8               name;age  public final java.lang.String toString();     descriptor: ()Ljava\/lang\/String;     flags: (0x0011) ACC_PUBLIC, ACC_FINAL     Code:       stack=1, locals=1, args_size=1          0: aload_0          1: invokedynamic #17,  0  \/\/ InvokeDynamic #0:toString:(LUser;)Ljava\/lang\/String;          6: areturn       LineNumberTable:         line 2: 0       LocalVariableTable:         Start  Length  Slot  Name   Signature             0       7     0  this   LUser;  BootstrapMethods:   0: #45 REF_invokeStatic java\/lang\/runtime\/ObjectMethods.bootstrap:(Ljava\/lang\/invoke\/MethodHandles$Lookup;Ljava\/lang\/String;Ljava\/lang\/invoke\/TypeDescriptor;Ljava\/lang\/Class;Ljava\/lang\/String;[Ljava\/lang\/invoke\/MethodHandle;)Ljava\/lang\/Object;     Method arguments:       #10 User       #53 name;age       #54 REF_getField User.name:Ljava\/lang\/String;       #55 REF_getField User.age:I<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>toString()<\/code> \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u044f\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>User<\/code>. \u0422\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <em>invokedynamic<\/em>. \u0422\u0430\u043a \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430, \u043b\u0435\u043d\u0438\u0432\u043e\u0441\u0442\u044c \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442-\u043f\u0443\u043b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u043c \u043a \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0438\u0440\u0438\u043d\u0433\u0443.<\/p>\n<p>\u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e R8, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u0418\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440  \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <em>name;age<\/em> \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043b \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0435 \u0434\u0440\u0443\u0433\u0443\u044e, \u0441 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0435\u0439 <em>a;b<\/em>. \u041d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0432 \u043d\u043e\u0432\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442-\u043f\u0443\u043b\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c.<\/p>\n<pre><code>public final class User extends java.lang.Record   minor version: 0   major version: 61   flags: (0x0011) ACC_PUBLIC, ACC_FINAL   this_class: #5                          \/\/ User   super_class: #7                         \/\/ java\/lang\/Record   interfaces: 0, fields: 2, methods: 4, attributes: 3  Constant pool:    #1 = Utf8               ~~R8{ ... }    #4 = Utf8               User    #8 = Utf8               a    #9 = Utf8               Ljava\/lang\/String;    #10 = Utf8              b    #11 = Utf8              I    #23 = Utf8              a;b<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0432 Gradle \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u043f\u043e\u0434 Java 17 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <code>toString()<\/code> \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d.<\/p>\n<pre><code class=\"kotlin\">val user = User(\"turlir\", 29) println(user.toString()) \/\/ User[a=turlir, b=29]<\/code><\/pre>\n<p>\u041c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0433\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Android. \u0412 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/lang\/Record.html\" rel=\"noopener noreferrer nofollow\">java.lang.Record<\/a> \u0438 bootstrap-\u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/lang\/runtime\/ObjectMethods.html#bootstrap(java.lang.invoke.MethodHandles.Lookup,java.lang.String,java.lang.invoke.TypeDescriptor,java.lang.Class,java.lang.String,java.lang.invoke.MethodHandle...)\" rel=\"noopener noreferrer nofollow\">ObjectMethods.bootstrap<\/a>. \u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043c desugaring \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u0443\u0441\u0442\u0438\u043c  \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b R8 \u043d\u0430 \u0432\u0445\u043e\u0434 D8. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c \u0441  Android. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a <em>.class<\/em> \u0444\u0430\u0439\u043b.<\/p>\n<details class=\"spoiler\">\n<summary>User.class<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>public final class User extends com.android.tools.r8.RecordTag   minor version: 0   major version: 51   flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER   this_class: #5                          \/\/ User   super_class: #7                         \/\/ com\/android\/tools\/r8\/RecordTag   interfaces: 0, fields: 2, methods: 6, attributes: 1    private java.lang.Object[] $record$getFieldsAsObjects();     descriptor: ()[Ljava\/lang\/Object;     flags: (0x1002) ACC_PRIVATE, ACC_SYNTHETIC     Code:       stack=16, locals=16, args_size=1          0: iconst_2          1: anewarray     #24                 \/\/ class java\/lang\/Object          4: astore_1          5: aload_1          6: iconst_0          7: aload_0          8: getfield      #18                 \/\/ Field a:Ljava\/lang\/String;         11: aastore         12: aload_1         13: iconst_1         14: aload_0         15: getfield      #20                 \/\/ Field b:I         18: invokestatic  #44                 \/\/ Method java\/lang\/Integer.valueOf:(I)Ljava\/lang\/Integer;         21: aastore         22: aload_1         23: areturn    public final java.lang.String toString();     descriptor: ()Ljava\/lang\/String;     flags: (0x0011) ACC_PUBLIC, ACC_FINAL     Code:       stack=3, locals=1, args_size=1          0: aload_0          1: invokespecial #32                 \/\/ Method $record$getFieldsAsObjects:()[Ljava\/lang\/Object;          4: ldc           #5                  \/\/ class User          6: ldc           #48                 \/\/ String a;b          8: invokestatic  #54                 \/\/ Method User$$ExternalSyntheticRecord0.m:([Ljava\/lang\/Object;Ljava\/lang\/Class;Ljava\/lang\/String;)Ljava\/lang\/String;         11: areturn<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0441\u0442\u0430\u043b \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 <code>com.android.tools.r8.RecordTag<\/code>. \u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>$record$getFieldsAsObjects()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439  \u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0430. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043c\u0430\u0441\u043a\u043e\u0439 <em>a;b<\/em>. \u0412 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 <code>ExternalSyntheticRecord0<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>StringBuilder<\/code>) \u043f\u043e \u043c\u0430\u0441\u043a\u0435 \u0438\u0437 \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>hashCode<\/code> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u043a <code>ExternalSyntheticRecord1<\/code> \u0433\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u0441\u043e\u0432. <\/p>\n<p>\u041e\u0431\u0430 <em>SyntheticRecord<\/em> \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 Record \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0435. <code>RecordTag<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 Record \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430 (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f). R8 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>RecordTag<\/code>. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/p>\n<blockquote>\n<p>Class content provided for type descriptor com.android.tools.r8.RecordTag actually defines class java.lang.Record]<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c jar\/aar \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441 Record \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c &#171;\u043a\u0430\u043a \u0435\u0441\u0442\u044c&#187;. <code>RecordTag<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 desugaring&#8217;\u0430 \u043a\u043e\u0434\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<h3>\u041c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Kotlin Record<\/h3>\n<p>Kotlin \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Record \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 <em><a class=\"mention\" href=\"\/users\/JvmRecord\">@JvmRecord<\/a><\/em>.  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0438\u043a\u0441 \u0438\u0437 \u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e data-\u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>copy()<\/code> \u0438 <code>componentN()<\/code>, \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 <code>java.lang.Record<\/code> \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438-\u0433\u0435\u0442\u0442\u0435\u0440\u0430\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <em>get<\/em>.<\/p>\n<pre><code class=\"kotlin\">@JvmRecord data class Person(     val name: String,     val age: Int )<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0435\u0442\u0438\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 data-\u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0431\u0430\u0439\u0442 \u043a\u043e\u0434\u0430. \u041a\u043b\u0430\u0441\u0441 <code>Person<\/code> \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a <code>User<\/code> \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0443\u044f\u0437\u0432\u0438\u043c \u0434\u043b\u044f \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0438\u0440\u0438\u043d\u0433\u0430, \u043c\u043e\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>Person.class<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>public final class Person extends java.lang.Record   minor version: 0   major version: 61   flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER   this_class: #2                          \/\/ Person   super_class: #4                         \/\/ java\/lang\/Record   interfaces: 0, fields: 2, methods: 10, attributes: 4    Constant pool:   #8 = Utf8               name   #22 = Utf8              age   #42 = String  #41  \/\/ Person(name=\\u0001, age=\\u0001)    public java.lang.String toString();     descriptor: ()Ljava\/lang\/String;     flags: (0x0001) ACC_PUBLIC     Code:       stack=2, locals=1, args_size=1          0: aload_0          1: getfield      #21                 \/\/ Field name:Ljava\/lang\/String;          4: aload_0          5: getfield      #25                 \/\/ Field age:I          8: invokedynamic #52,  0             \/\/ InvokeDynamic #0:makeConcatWithConstants:(Ljava\/lang\/String;I)Ljava\/lang\/String;         13: areturn  BootstrapMethods:   0: #49 REF_invokeStatic java\/lang\/invoke\/StringConcatFactory.makeConcatWithConstants:(Ljava\/lang\/invoke\/MethodHandles$Lookup;Ljava\/lang\/String;Ljava\/lang\/invoke\/MethodType;Ljava\/lang\/String;[Ljava\/lang\/Object;)Ljava\/lang\/invoke\/CallSite;     Method arguments:       #42 Person(name=\\u0001, age=\\u0001)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 <code>Person.toString()<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.base\/java\/lang\/invoke\/StringConcatFactory.html\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u043e\u0439<\/a> bootstrap-\u043c\u0435\u0442\u043e\u0434. \u041f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043a\u043e\u0434\u0430 R8 <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/facedf41bbd28b563d1e9e09c5f72d7c5ca598d5\/src\/main\/java\/com\/android\/tools\/r8\/ir\/desugar\/records\/RecordRewriterHelper.java#31\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443<\/a> \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e bootstrap-\u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e, \u0442\u043e \u043c\u0438\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a \u043a\u0430\u043a R8 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <em>ObjectMethods.bootstrap.names<\/em>. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e\u0442<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-357225","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/357225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=357225"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/357225\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=357225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=357225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=357225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}