{"id":3598,"date":"2026-09-23T10:12:17","date_gmt":"2026-09-23T10:12:17","guid":{"rendered":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/"},"modified":"2026-09-23T10:12:17","modified_gmt":"2026-09-23T10:12:17","slug":"how-r8-made-kotlin-coroutines-on-android-2x-faster","status":"publish","type":"post","link":"https:\/\/dev95.site\/ar\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/","title":{"rendered":"How R8 made Kotlin Coroutines on Android 2x faster"},"content":{"rendered":"<div id=\"dev95-1867904863\" class=\"dev95-- dev95-entity-placement\"><script async=\"async\" data-cfasync=\"false\" src=\"https:\/\/pl27862732.profitableratecpmnetwork.com\/2ad7a50e0bbc23ac6801d7b77c501463\/invoke.js\"><\/script>\r\n<div id=\"container-2ad7a50e0bbc23ac6801d7b77c501463\"><\/div><\/div><div><meta content=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgHiv_LIAZ9QEJ4RWJSvZphTWmkDaVoseyWsbSPkfJDKd0DXjq53xtLOMiVtTEzlW6dAwXUlcucsBDKxjp9MjET4MB1b4ymZkd-b7jhm-PczdvyFqQCpZ39MXVjaVrWg4Y6WD4KLYOL3PbmYBDumMULpZQDX0052163RVUWZnfUAUPFtfwZMVflqjT9AnQ\/s2469\/0707 Faster Kotlin coroutines on Android with R8_Meta.png\" style=\"clear: right; float: right; margin-bottom: 1em; margin-left: 1em;\"><br \/>\n<img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgHiv_LIAZ9QEJ4RWJSvZphTWmkDaVoseyWsbSPkfJDKd0DXjq53xtLOMiVtTEzlW6dAwXUlcucsBDKxjp9MjET4MB1b4ymZkd-b7jhm-PczdvyFqQCpZ39MXVjaVrWg4Y6WD4KLYOL3PbmYBDumMULpZQDX0052163RVUWZnfUAUPFtfwZMVflqjT9AnQ\/s2469\/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Meta.png?w=1280&#038;ssl=1\" style=\"display: none;\"><i>Posted by Andrei Shikov, Senior Software Engineer, Android Toolkit and Jonathan Starup, Software Engineer, R8 Team<\/i><\/p>\n<div><i><br \/><\/i><\/div>\n<div>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiYQ0hvP8noS5d46xLL2ca89fUyDM7ONaSVUIn8QhZxuB8GKNdGi_IIQNt3c8dAT67nO1TMfcPrmXMXfBjggYafmHV6cYH86vFyoEnIEgaFJ2uOYQIH4l9zA4GlQvduoJEVUNzIUX1qJmaxY3qRGn9TKwuRD_HR87trMxuaU0x29FXcx7Pr-DdP0ZhxZhQ\/s8582\/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Blog.png?ssl=1\" style=\"clear: left; float: left; margin-bottom: 1em; margin-right: 1em;\"><img data-recalc-dims=\"1\" decoding=\"async\" border=\"0\" data-original-height=\"2601\" data-original-width=\"8582\" src=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEiYQ0hvP8noS5d46xLL2ca89fUyDM7ONaSVUIn8QhZxuB8GKNdGi_IIQNt3c8dAT67nO1TMfcPrmXMXfBjggYafmHV6cYH86vFyoEnIEgaFJ2uOYQIH4l9zA4GlQvduoJEVUNzIUX1qJmaxY3qRGn9TKwuRD_HR87trMxuaU0x29FXcx7Pr-DdP0ZhxZhQ\/s1600\/0707%20Faster%20Kotlin%20coroutines%20on%20Android%20with%20R8_Blog.png?w=1280&#038;ssl=1\"><\/a><\/div>\n<p><i><br \/><\/i><\/p>\n<p><\/p>\n<p><\/p>\n<\/p><div id=\"dev95-2956379522\" class=\"dev95- dev95-entity-placement\"><center>\r\n<script>\r\n  atOptions = {\r\n    'key' : '4ba6b6513c00e0ba76511f798ae56401',\r\n    'format' : 'iframe',\r\n    'height' : 50,\r\n    'width' : 320,\r\n    'params' : {}\r\n  };\r\n<\/script>\r\n<script src=\"https:\/\/www.highrevenueformat.com\/4ba6b6513c00e0ba76511f798ae56401\/invoke.js\"><\/script>\r\n\t<\/center><\/div>\n<\/div>\n<p>Starting from AGP 9.2.0, R8 optimizes most <code>Atomic*FieldUpdater<\/code> calls into <code>Unsafe<\/code> variants that perform <a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\/issues\/3950\">2x to 4x better on common operations<\/a>. This has a particularly large impact on the kotlinx.atomicfu library that implements atomics for <code>kotlinx.coroutines<\/code>, making launching and cancelling coroutines up to 2x faster. In order to get the benefits, update your AGP to 9.2.0 or above.<\/p>\n<p>With the majority of Android apps adopting Kotlin as their main language of choice, <code><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\" target=\"_blank\">kotlinx.coroutines<\/a><\/code> has become a de-facto standard for asynchronous programming. The library offers a well-designed and structured way of managing concurrent flows that is native to Kotlin. Jetpack Compose was no exception, adopting coroutines for managing pointer events, animations and other interactions. At the time of writing, most concurrent APIs in Compose call <code>suspend<\/code> functions under the hood and are launching and\/or cancelling coroutines to handle updates.<\/p>\n<p>As the Compose team started to investigate performance, coroutines were discovered to be a bottleneck for many operations that happen outside of composition. As an example, 80% of the time spent on creating and updating <code>Modifier.clickable<\/code> was consumed by launching and cancelling internal coroutines that handled <code>InteractionSource<\/code> updates. Based on those observations, much of early performance work was focused on removing coroutines from the default path and delaying initialization until necessary.<\/p>\n<h2>The cost of a coroutine<\/h2>\n<p>The easiest way to analyze a function&#8217;s internal behavior on Android is to capture an Android Runtime (ART) method trace. An ART method trace is a tool that records the execution flow of an app, showing exactly which methods are called, their order, and how much time is spent in each, allowing developers to identify performance bottlenecks. For an empty <code>LaunchedEffect { }<\/code> call, it would look something like this:\u00a0<\/p>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhtNkPVicdJLFrYlTBtffjL73QsWm8LztGzRCLSVrzpHy-FiyMEcOIJPkDYAjUKI0ZAgQDgATjjZXIcmjZlf7iusLjC9E5F6GaIPMvZbTh1hP4N7OsnUPgkz5atS5PcsrPh5ulpSAqJ9K8T6eviqTwy4NB5zMu8HAnBZgK2PaZwX3ajJFXSRuoH35T4TZk\/s7680\/pic01_enhanced.png?ssl=1\" style=\"margin-left: 1em; margin-right: 1em;\"><img data-recalc-dims=\"1\" decoding=\"async\" border=\"0\" data-original-height=\"3432\" data-original-width=\"7680\" src=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhtNkPVicdJLFrYlTBtffjL73QsWm8LztGzRCLSVrzpHy-FiyMEcOIJPkDYAjUKI0ZAgQDgATjjZXIcmjZlf7iusLjC9E5F6GaIPMvZbTh1hP4N7OsnUPgkz5atS5PcsrPh5ulpSAqJ9K8T6eviqTwy4NB5zMu8HAnBZgK2PaZwX3ajJFXSRuoH35T4TZk\/s1600\/pic01_enhanced.png?w=1280&#038;ssl=1\"><\/a><\/div>\n<p style=\"text-align: center;\"><i>LaunchedEffect method trace visualized in the Perfetto UI<\/i><\/p>\n<p>The method trace above can be separated into three parts:<\/p>\n<ul style=\"text-align: left;\">\n<li>\nInitializing a new coroutine<\/li>\n<li>\nStarting coroutine<\/li>\n<li>\nCompleting coroutine (because it exits immediately)<\/li>\n<\/ul>\n<p>Cancelling <code>LaunchedEffect<\/code> is similar to normal completion, except it also creates a <code>CancellationException<\/code>.<\/p>\n<p>From the profile above, one thing that is immediately suspicious is frequent calls into <code>java.util.concurrent.AtomicReferenceFieldUpdater<\/code> (purple or green boxes with j\u2026 labels). While each call is relatively fast, the frequency is concerning; any non-negligible overhead that is spread out across multiple invocations might add up to a noticeable regression. Zooming in on a call reveals that most of the time is spent on&#8230; reflection checks?<\/p>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEirqmZk8TeN6KsUrqnCFT_AigbT3IdjfMDxabgQEM7izThyphenhyphenubMyvsFzkd3zR6SSxfvovJb5QeaoeIYPG9pFoNCegLDizYwfTOnKFv9sWfp1whDlFB9gUf3VMS9qU2-smyKEHrmsrPlN4htYxmLQ3yGfgZlWzjpwi6nTXbTcghvutTmJQjSo2s9c8xG-LOM\/s13034\/pic02-enhanced.png?ssl=1\" style=\"clear: left; float: left; margin-bottom: 1em; margin-right: 1em;\"><img data-recalc-dims=\"1\" decoding=\"async\" border=\"0\" data-original-height=\"4102\" data-original-width=\"13034\" src=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEirqmZk8TeN6KsUrqnCFT_AigbT3IdjfMDxabgQEM7izThyphenhyphenubMyvsFzkd3zR6SSxfvovJb5QeaoeIYPG9pFoNCegLDizYwfTOnKFv9sWfp1whDlFB9gUf3VMS9qU2-smyKEHrmsrPlN4htYxmLQ3yGfgZlWzjpwi6nTXbTcghvutTmJQjSo2s9c8xG-LOM\/s1600\/pic02-enhanced.png?w=1280&#038;ssl=1\"><\/a><\/div>\n<p><\/p>\n<p><\/p>\n<p><i>An up-close look at the method trace of AtomicReferenceFieldUpdater.get during LaunchedEffect initialization<\/i><\/p>\n<p>Coroutines implement a lock-free tree structure for parent-child relationships that makes structured concurrency possible. Turns out, the <code>kotlinx.atomicfu<\/code> library implements lock-free atomic operations using a well-known JVM primitive, <code><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/atomic\/AtomicReferenceFieldUpdater.html\" target=\"_blank\">AtomicReferenceFieldUpdater<\/a><\/code>. The updater uses a class reference and a field name to perform atomic operations at runtime, and it has to run several reflective safety checks to make sure the field exists and is accessible. Each operation in coroutines (starting, suspending, cancelling, completing) calls at least one atomic operation, so if it is slow, coroutines will not perform well.<\/p>\n<h2>Investigating AtomicReferenceFieldUpdater<\/h2>\n<p>But let&#8217;s not get ahead of ourselves. <code>AtomicReferenceFieldUpdater<\/code> is actually well-optimized on JVM <a href=\"https:\/\/shipilev.net\/blog\/2015\/faster-atomic-fu\/\">for over 10 years now<\/a>, and method traces might capture overhead that is completely removed by a VM level optimization: just-in-time (JIT) or ahead-of-time (AOT) compilations. To verify performance, let&#8217;s write a few benchmarks to measure the difference between atomic references from <code>kotlinx.atomicfu<\/code> and <code>java.util.concurrent.atomic<\/code>.<\/p>\n<pre><code>@RunWith(AndroidJUnit4::class)\nclass AtomicReferenceBenchmark {\n    @get:Rule\n    val benchmarkRule = BenchmarkRule()\n    \n    private val atomicReference = java.util.concurrent.atomic.AtomicReference(false)\n    private val atomicRef = kotlinx.atomicfu.atomic&lt;Boolean&gt;(false)\n    \n    @Test\n    fun atomicReference_compareAndSet() {\n        benchmarkRule.measureRepeated { \n            atomicReference.compareAndSet(true, false)\n            atomicReference.compareAndSet(false, true)\n        }\n    }\n\n     @Test\n    fun atomicRef_compareAndSet() {\n        benchmarkRule.measureRepeated {\n            atomicRef.compareAndSet(true, false)\n            atomicRef.compareAndSet(false, true)\n        }\n    }\n\n    \/* measuring other methods from the method traces above *\/\n}<\/code><\/pre>\n<p>Running this benchmark on a Pixel 5 (while ensuring <code>AtomicReferenceFieldUpdater#compareAndSet<\/code> is JIT compiled during warmup), yields the following results on Pixel 5 (API 33):\n<\/p>\n<pre><code> 50.7 ns  atomicReference_compareAndSet\n135   ns  atomicRef_compareAndSet\n<\/code><\/pre>\n<p>The measurements confirm the gap, with <code>kotlinx.atomicfu<\/code> version clearly being approximately 2.7x slower. This confirms that ART does not perform any hidden optimization and reflective access checks add real overhead during runtime.<\/p>\n<p>Looking back at the original method trace, the only meaningful work performed by the <code>AtomicReferenceFieldUpdater<\/code> is the internal call into <code>Unsafe.getObjectVolatile<\/code> that actually executes the underlying atomic operation. In most cases, the updater initializer is static, and can be proved to be always correct based on the structure of the surrounding class. Thus, one could statically analyze most of the <code>AtomicReferenceFieldUpdater<\/code> usages and replace them with an internal <code>Unsafe<\/code> variant during compilation. It also just happens that Android build toolchain has its very own optimizing compiler that can do exactly that.<\/p>\n<h2>Optimization with R8<\/h2>\n<p>The <code>Atomic*FieldUpdater<\/code> classes support subtle, dynamic and reflection-based use,  but are often used in statically obvious patterns. This both explains the slow baseline performance and the want for optimization. R8 is a full-program optimizing compiler and is well-suited to see through the simpler patterns to skim the overhead of the reflective safety checks. R8 receives JVM bytecode after the Java or the Kotlin compiler, but to ease readability these examples are presented in Java syntax. This is why there are no type arguments for <code>AtomicReferenceFieldUpdater<\/code>.<\/p>\n<pre><code>class Example {\n    volatile String data = \"\";\n    static final AtomicReferenceFieldUpdater updater =\n        AtomicReferenceFieldUpdater.newUpdater(Example.class, String.class, \"data\");\n\n    void example() {\n        \/\/ ...\n        updater.compareAndSet(this, \"\", \"new\");\n        \/\/ ...\n    }\n}<\/code><\/pre>\n<p>The base example creates a static final updater which accesses a volatile field with simple constant arguments for the holder, the type, and the name of the field. The reflection used is totally transparent. It is clear to see this updater references a valid field and that the site of the updater creation has valid access to the field.<\/p>\n<p>In its essence, <code>Atomic*FieldUpdater<\/code> is a wrapper around a field offset and calls to <code>Unsafe<\/code>. The best case scenario for the optimization is to replace the updater field with an offset field and replace the updater calls with calls to <code>Unsafe<\/code>.<\/p>\n<h3>Optimizing Atomic*FieldUpdater<\/h3>\n<p>The optimization is implemented in three parts: Instrumentation, Replacement, and Clean-up.<\/p>\n<h2>Instrumentation<\/h2>\n<p>The first step is to introduce offset fields alongside the updater field in order to facilitate direct access via the <code>Unsafe<\/code> call.<\/p>\n<pre><code>static final long updater$offset =\n    SyntheticUnsafe.UNSAFE.objectFieldOffset(Example.class.getDeclaredField(\"data\"))<\/code><\/pre>\n<p>The field is accessed via reflection, and <code>Unsafe<\/code> is used to extract the field offset on the class. This code represents the internals of <code>Atomic*FieldUpdater<\/code> if you disregard reflection validation. Instead, the holder type of the updater and the field type of the volatile field are tracked statically in the compiler.<\/p>\n<p>Note that the original field and its initialization are left as-is. The optimization process optimistically facilitates and optimizes uses and then later cleans up. This is a simple approach to the implementation but also allows partial optimization of updater fields, where some uses are left as they were while others are optimized.<\/p>\n<h2>Replacement<\/h2>\n<p>At this point in the compiler, after a suitable concurrency join point, we have a list of instrumented updater fields. This means that we can optimize each call site individually based on a few conditions. Consider an example call:<\/p>\n<pre><code>updater.compareAndSet(holder, expectedValue, newValue);<\/code><\/pre>\n<p>The conditions that <code>Atomic*FieldUpdater<\/code> requires are these:<\/p>\n<ul style=\"text-align: left;\">\n<li>\n  Does <code>updater<\/code> come from an instrumented field? That is, can static analysis track the value of the object back to a field read of an instrumented updater?<\/li>\n<li>\n  Is <code>holder<\/code> the same class or a subclass of the originally defined holder type?<\/li>\n<li>\n  Is <code>newValue<\/code> the same class or a subclass of the originally defined field type?<\/li>\n<\/ul>\n<p>  If all conditions are met, then the call is replaced by a call to <code>Unsafe<\/code> without any of the reflection checks.<\/p>\n<pre><code>SyntheticUnsafe.UNSAFE.compareAndSwapObject(holder, Example.updater$offset, expectedValue, newValue)<\/code><\/pre>\n<p>This new call is faster and simpler but it differs from the original call in regards to its handling of null values in <code>updater<\/code> and <code>holder<\/code>. Unless statically ruled out, null-checks are inserted for both.<\/p>\n<h2>Clean-up<\/h2>\n<p>At this point, the holding class has the original updater field and the new offset field along with call sites that might use either one of the two. If  none of the call sites were optimized, then the offset field should be removed and if all of the call sites were optimized, then the updater field should be removed. In both cases the initializing call should also be deleted. The deletion of unused fields and removal of dead code is already done in the compiler, but removing the initializing code here requires a few more tricks.<\/p>\n<p>Both the call to <code>newUpdater<\/code> and <code>getDeclaredField<\/code> might have side effects as they can throw exceptions (and their implementation is also unknown since it depends on the API version). This means that by generic optimization, they cannot safely be removed. So this clean-up required explicit consideration of the instrumented fields, since those are statically known to be free of exceptions.<\/p>\n<p>In the end, the simple updater example shown above looks like this after optimization:<\/p>\n<pre><code>class Example {\n    volatile String data = \"\";\n    static final long updater$offset =\n        SyntheticUnsafe.UNSAFE.objectFieldOffset(Example.class.getDeclaredField(\"data\"))\n\n    void example() {\n        \/\/ ...\n        SyntheticUnsafe.UNSAFE.compareAndSwapObject(this, Example.updater$offset, \"\", \"new\")\n        \/\/ ...\n    }\n}<\/code><\/pre>\n<h3>Results<\/h3>\n<p>After these optimizations, <code>kotlinx.atomicfu<\/code> and most explicit uses of <code>AtomicInt\/Long\/ReferenceFieldUpdater<\/code> now match <code>AtomicReference<\/code> performance with R8 applied. In fact, it is even faster in some benchmarks; <code>kotlinx.atomicfu<\/code> has a compiler plugin that can inline <code>atomic<\/code> instances into fields, reducing allocations required to create an atomically updated field.<\/p>\n<p>Jetpack Compose was the main beneficiary of this work. Compose runtime has a number of microbenchmarks that track coroutine performance very closely to catch performance regressions early. When the benchmarks were updated to a new version of R8, we noticed a 2x improvement when launching and cancelling coroutines in <code>LaunchedEffect<\/code>!<\/p>\n<div class=\"separator\" style=\"clear: both; text-align: center;\"><a href=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEj5VYYOudfoQzHlELVMmmiLkRxUd80bqzqB8ykvBedO0VpCROTeK63gXhyphenhyphenYZWed99FWOFl58qqj34aQP9GLPJGW_Ls2w5ez0o-TIOqdt9hlIn5NFmpT7N83sKuhnCdbazdVSFcz0h2e4Zu12GCaW_ss9t-7v7t9J26WgqKpIWUyCkKz4X8L95H2fYjA6i0\/s9600\/pic03_enhanced.png?ssl=1\" style=\"clear: left; float: left; margin-bottom: 1em; margin-right: 1em;\"><img data-recalc-dims=\"1\" decoding=\"async\" border=\"0\" data-original-height=\"5580\" data-original-width=\"9600\" src=\"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEj5VYYOudfoQzHlELVMmmiLkRxUd80bqzqB8ykvBedO0VpCROTeK63gXhyphenhyphenYZWed99FWOFl58qqj34aQP9GLPJGW_Ls2w5ez0o-TIOqdt9hlIn5NFmpT7N83sKuhnCdbazdVSFcz0h2e4Zu12GCaW_ss9t-7v7t9J26WgqKpIWUyCkKz4X8L95H2fYjA6i0\/s1600\/pic03_enhanced.png?w=1280&#038;ssl=1\"><\/a><\/div>\n<p><\/p>\n<p><\/p>\n<div style=\"text-align: center;\"><i>Benchmark graph illustrating the time taken when starting and cancelling coroutines in LaunchedEffect (lower is better). The change in the graph corresponds to an R8 update, showcasing 2x improvement.<\/i><\/div>\n<p>Aside from that, the ART team is implementing these optimizations natively at the VM level. If your app is targeting API 37 and is running on a recent version of Android, it is possible that your device is already optimizing coroutines in a similar way. The coroutine benchmarks above observed ~15% improvement in performance after JIT updates in the recent versions of ART.<\/p>\n<p>Your app will receive this optimization by default when upgrading to AGP 9.2.0 or by using R8 9.2.0 directly. For more information, see <a href=\"https:\/\/r8.googlesource.com\/r8\/+\/refs\/heads\/main\/README.md#replacing-r8-in-agp\" target=\"_blank\">D8 dexer and R8 shrinker<\/a>.<\/p>\n<\/p>\n<\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_3598\" class=\"pvc_stats total_only\" data-element-id=\"3598\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewbox=\"0 0 502 315\" preserveaspectratio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/i0.wp.com\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif?resize=16%2C16&#038;ssl=1\" border=\"0\" \/><\/p>\n<div class=\"pvc_clear\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Posted by Andrei Shikov, Senior Software Engineer, Android Toolkit and Jonathan Starup, Software Engineer, R8 Team Starting from AGP 9.2.0, R8 optimizes most Atomic*FieldUpdater calls into Unsafe variants that perform 2x to 4x better on common operations. This has a<\/p>\n<div class=\"hosteria-entry-more\"><a href=\"https:\/\/dev95.site\/ar\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/\" class=\"no-underline font-light  group-hover:text-primary-800 dark:group-hover:text-primary-300 py-1\">Read more &gt;&gt;&gt;<\/a><\/div>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_3598\" class=\"pvc_stats total_only\" data-element-id=\"3598\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.0\" viewbox=\"0 0 502 315\" preserveaspectratio=\"xMidYMid meet\"><g transform=\"translate(0,332) scale(0.1,-0.1)\" fill=\"\" stroke=\"none\"><path d=\"M2394 3279 l-29 -30 -3 -207 c-2 -182 0 -211 15 -242 39 -76 157 -76 196 0 15 31 17 60 15 243 l-3 209 -33 29 c-26 23 -41 29 -80 29 -41 0 -53 -5 -78 -31z\"\/><path d=\"M3085 3251 c-45 -19 -58 -50 -96 -229 -47 -217 -49 -260 -13 -295 52 -53 146 -42 177 20 16 31 87 366 87 410 0 70 -86 122 -155 94z\"\/><path d=\"M1751 3234 c-13 -9 -29 -31 -37 -50 -12 -29 -10 -49 21 -204 19 -94 39 -189 45 -210 14 -50 54 -80 110 -80 34 0 48 6 76 34 21 21 34 44 34 59 0 14 -18 113 -40 219 -37 178 -43 195 -70 221 -36 32 -101 37 -139 11z\"\/><path d=\"M1163 3073 c-36 -7 -73 -59 -73 -102 0 -56 133 -378 171 -413 34 -32 83 -37 129 -13 70 36 67 87 -16 290 -86 209 -89 214 -129 231 -35 14 -42 15 -82 7z\"\/><path d=\"M3689 3066 c-15 -9 -33 -30 -42 -48 -48 -103 -147 -355 -147 -375 0 -98 131 -148 192 -74 13 15 57 108 97 206 80 196 84 226 37 273 -30 30 -99 39 -137 18z\"\/><path d=\"M583 2784 c-38 -19 -67 -74 -58 -113 9 -42 211 -354 242 -373 16 -10 45 -18 66 -18 51 0 107 52 107 100 0 39 -1 41 -124 234 -80 126 -108 162 -133 173 -41 17 -61 16 -100 -3z\"\/><path d=\"M4250 2784 c-14 -9 -74 -91 -133 -183 -95 -150 -107 -173 -107 -213 0 -55 33 -94 87 -104 67 -13 90 8 211 198 130 202 137 225 78 284 -27 27 -42 34 -72 34 -22 0 -50 -8 -64 -16z\"\/><path d=\"M2275 2693 c-553 -48 -1095 -270 -1585 -649 -135 -104 -459 -423 -483 -476 -23 -49 -22 -139 2 -186 73 -142 361 -457 571 -626 285 -228 642 -407 990 -497 242 -63 336 -73 660 -74 310 0 370 5 595 52 535 111 1045 392 1455 803 122 121 250 273 275 326 19 41 19 137 0 174 -41 79 -309 363 -465 492 -447 370 -946 591 -1479 653 -113 14 -422 18 -536 8z m395 -428 c171 -34 330 -124 456 -258 112 -119 167 -219 211 -378 27 -96 24 -300 -5 -401 -72 -255 -236 -447 -474 -557 -132 -62 -201 -76 -368 -76 -167 0 -236 14 -368 76 -213 98 -373 271 -451 485 -162 444 86 934 547 1084 153 49 292 57 452 25z m909 -232 c222 -123 408 -262 593 -441 76 -74 138 -139 138 -144 0 -16 -233 -242 -330 -319 -155 -123 -309 -223 -461 -299 l-81 -41 32 46 c18 26 49 83 70 128 143 306 141 649 -6 957 -25 52 -61 116 -79 142 l-34 47 45 -20 c26 -10 76 -36 113 -56z m-2057 25 c-40 -58 -105 -190 -130 -263 -110 -324 -59 -707 132 -981 25 -35 42 -64 37 -64 -19 0 -241 119 -326 174 -188 122 -406 314 -532 468 l-58 71 108 103 c185 178 428 349 672 473 66 33 121 60 123 61 2 0 -10 -19 -26 -42z\"\/><path d=\"M2375 1950 c-198 -44 -350 -190 -395 -379 -18 -76 -8 -221 19 -290 114 -284 457 -406 731 -260 98 52 188 154 231 260 27 69 37 214 19 290 -38 163 -166 304 -326 360 -67 23 -215 33 -279 19z\"\/><\/g><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/dev95.site\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=\"0\" \/><\/p>\n<div class=\"pvc_clear\"><\/div>","protected":false},"author":1,"featured_media":3600,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fp_fajr_begins":"","fp_fajr_iqamah":"","fp_dhuhr_begins":"","fp_dhuhr_iqamah":"","fp_asr_begins":"","fp_asr_iqamah":"","fp_maghrib_begins":"","fp_maghrib_iqamah":"","fp_isha_begins":"","fp_isha_iqamah":"","fp_midnight":"","fp_midnight_name":"","fp_sunrise":"","fp_single_prayer_begins_title":"","fp_single_prayer_iqamah_title":"","fp_prayer_times_for_today":"","fp_hijra_date":"","fp_fajr_name":"","fp_dhuhr_name":"","fp_asr_name":"","fp_maghrib_name":"","fp_isha_name":"","fp_sunrise_name":"","fp_currentDate":"","fp_current_time":"","fp_current_title":"","fp_current_location":"","fp_masjid_name":"","fp_prayer_title":"","fp_next_prayer_iqamah_time":"","fp_next_prayer_iqamah_title":"","fp_next_prayer_begins_time":"","fp_next_prayer_begins_title":"","fp_next_prayer_title":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[9],"tags":[],"class_list":["post-3598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android"],"a3_pvc":{"activated":true,"total_views":0,"today_views":0},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How R8 made Kotlin Coroutines on Android 2x faster - Dev95<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dev95.site\/ar\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/\" \/>\n<meta property=\"og:locale\" content=\"ar_AR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How R8 made Kotlin Coroutines on Android 2x faster - Dev95\" \/>\n<meta property=\"og:description\" content=\"Posted by Andrei Shikov, Senior Software Engineer, Android Toolkit and Jonathan Starup, Software Engineer, R8 Team Starting from AGP 9.2.0, R8 optimizes most Atomic*FieldUpdater calls into Unsafe variants that perform 2x to 4x better on common operations. This has aRead more &gt;&gt;&gt;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev95.site\/ar\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/\" \/>\n<meta property=\"og:site_name\" content=\"Dev95\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-23T10:12:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhtNkPVicdJLFrYlTBtffjL73QsWm8LztGzRCLSVrzpHy-FiyMEcOIJPkDYAjUKI0ZAgQDgATjjZXIcmjZlf7iusLjC9E5F6GaIPMvZbTh1hP4N7OsnUPgkz5atS5PcsrPh5ulpSAqJ9K8T6eviqTwy4NB5zMu8HAnBZgK2PaZwX3ajJFXSRuoH35T4TZk\/s1600\/pic01_enhanced.png\" \/>\n<meta name=\"author\" content=\"dev95\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629\" \/>\n\t<meta name=\"twitter:data1\" content=\"dev95\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 \u062f\u0642\u0627\u0626\u0642\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/\"},\"author\":{\"name\":\"dev95\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\"},\"headline\":\"How R8 made Kotlin Coroutines on Android 2x faster\",\"datePublished\":\"2026-09-23T10:12:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/\"},\"wordCount\":1546,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1\",\"articleSection\":[\"Android\"],\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/\",\"url\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/\",\"name\":\"How R8 made Kotlin Coroutines on Android 2x faster - Dev95\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1\",\"datePublished\":\"2026-09-23T10:12:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#breadcrumb\"},\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1\",\"width\":2469,\"height\":1605},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dev95.site\\\/how-r8-made-kotlin-coroutines-on-android-2x-faster\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dev95.site\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How R8 made Kotlin Coroutines on Android 2x faster\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#website\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"name\":\"Dev95\",\"description\":\"A comprehensive platform for data and knowledge, delivering reliable content that meets the aspirations of readers and enthusiasts.\",\"publisher\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dev95.site\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ar\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#organization\",\"name\":\"Dev95\",\"url\":\"https:\\\/\\\/dev95.site\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/dev95.site\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/rbrrbr-6.png?fit=512%2C512&ssl=1\",\"width\":512,\"height\":512,\"caption\":\"Dev95\"},\"image\":{\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dev95.site\\\/#\\\/schema\\\/person\\\/b807805ffe2916206b04d0938bce0298\",\"name\":\"dev95\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g\",\"caption\":\"dev95\"},\"url\":\"https:\\\/\\\/dev95.site\\\/ar\\\/author\\\/mohammad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How R8 made Kotlin Coroutines on Android 2x faster - Dev95","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dev95.site\/ar\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/","og_locale":"ar_AR","og_type":"article","og_title":"How R8 made Kotlin Coroutines on Android 2x faster - Dev95","og_description":"Posted by Andrei Shikov, Senior Software Engineer, Android Toolkit and Jonathan Starup, Software Engineer, R8 Team Starting from AGP 9.2.0, R8 optimizes most Atomic*FieldUpdater calls into Unsafe variants that perform 2x to 4x better on common operations. This has aRead more &gt;&gt;&gt;","og_url":"https:\/\/dev95.site\/ar\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/","og_site_name":"Dev95","article_published_time":"2026-09-23T10:12:17+00:00","og_image":[{"url":"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhtNkPVicdJLFrYlTBtffjL73QsWm8LztGzRCLSVrzpHy-FiyMEcOIJPkDYAjUKI0ZAgQDgATjjZXIcmjZlf7iusLjC9E5F6GaIPMvZbTh1hP4N7OsnUPgkz5atS5PcsrPh5ulpSAqJ9K8T6eviqTwy4NB5zMu8HAnBZgK2PaZwX3ajJFXSRuoH35T4TZk\/s1600\/pic01_enhanced.png","type":"","width":"","height":""}],"author":"dev95","twitter_card":"summary_large_image","twitter_misc":{"\u0643\u064f\u062a\u0628 \u0628\u0648\u0627\u0633\u0637\u0629":"dev95","\u0648\u0642\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0645\u064f\u0642\u062f\u0651\u0631":"9 \u062f\u0642\u0627\u0626\u0642"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#article","isPartOf":{"@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/"},"author":{"name":"dev95","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298"},"headline":"How R8 made Kotlin Coroutines on Android 2x faster","datePublished":"2026-09-23T10:12:17+00:00","mainEntityOfPage":{"@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/"},"wordCount":1546,"commentCount":0,"publisher":{"@id":"https:\/\/dev95.site\/#organization"},"image":{"@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/09\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1","articleSection":["Android"],"inLanguage":"ar","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/","url":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/","name":"How R8 made Kotlin Coroutines on Android 2x faster - Dev95","isPartOf":{"@id":"https:\/\/dev95.site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#primaryimage"},"image":{"@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/09\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1","datePublished":"2026-09-23T10:12:17+00:00","breadcrumb":{"@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#breadcrumb"},"inLanguage":"ar","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/"]}]},{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#primaryimage","url":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/09\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1","contentUrl":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/09\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1","width":2469,"height":1605},{"@type":"BreadcrumbList","@id":"https:\/\/dev95.site\/how-r8-made-kotlin-coroutines-on-android-2x-faster\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dev95.site\/"},{"@type":"ListItem","position":2,"name":"How R8 made Kotlin Coroutines on Android 2x faster"}]},{"@type":"WebSite","@id":"https:\/\/dev95.site\/#website","url":"https:\/\/dev95.site\/","name":"Dev95","description":"A comprehensive platform for data and knowledge, delivering reliable content that meets the aspirations of readers and enthusiasts.","publisher":{"@id":"https:\/\/dev95.site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dev95.site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ar"},{"@type":"Organization","@id":"https:\/\/dev95.site\/#organization","name":"Dev95","url":"https:\/\/dev95.site\/","logo":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","contentUrl":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/07\/rbrrbr-6.png?fit=512%2C512&ssl=1","width":512,"height":512,"caption":"Dev95"},"image":{"@id":"https:\/\/dev95.site\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/dev95.site\/#\/schema\/person\/b807805ffe2916206b04d0938bce0298","name":"dev95","image":{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a70a73d950838b20cd80d7ebdc955737e802e8cd896044c5473b32b946c0662a?s=96&d=mm&r=g","caption":"dev95"},"url":"https:\/\/dev95.site\/ar\/author\/mohammad\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/dev95.site\/wp-content\/uploads\/2026\/09\/0707FasterKotlincoroutinesonAndroidwithR8_Meta.png?fit=2469%2C1605&ssl=1","_links":{"self":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/3598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/comments?post=3598"}],"version-history":[{"count":0,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/posts\/3598\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/media\/3600"}],"wp:attachment":[{"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/media?parent=3598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/categories?post=3598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev95.site\/ar\/wp-json\/wp\/v2\/tags?post=3598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}