1- From af21717100c674756df1e559b31f21706b579ffd Mon Sep 17 00:00:00 2001
1+ From b1e1aa32501204ef907dd33c566c23a07c9b2652 Mon Sep 17 00:00:00 2001
22From: Akash Yadav <akashyadav@appdevforall.org>
33Date: Wed, 25 Mar 2026 15:29:30 +0530
4- Subject: [PATCH 8/8] feat: package UnsafeAndroid in embeddable jar
4+ Subject: [PATCH 8/8] feat: package AndroidUnsafe in embeddable jar
55
66Signed-off-by: Akash Yadav <akashyadav@appdevforall.org>
77---
88 build.gradle.kts | 1 +
99 gradle/verification-metadata.xml | 5 +
10- .../build.gradle.kts | 10 ++
10+ .../build.gradle.kts | 15 ++
1111 .../unsafe-access-android/build.gradle.kts | 79 ++++++++++
12- .../util/containers/UnsafeAndroid .java | 138 ++++++++++++++++++
12+ .../util/containers/AndroidUnsafe .java | 137 ++++++++++++++++++
1313 settings.gradle | 5 +-
14- 6 files changed, 236 insertions(+), 2 deletions(-)
14+ 6 files changed, 240 insertions(+), 2 deletions(-)
1515 create mode 100644 prepare/ide-plugin-dependencies/unsafe-access-android/build.gradle.kts
16- create mode 100644 prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/UnsafeAndroid .java
16+ create mode 100644 prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/AndroidUnsafe .java
1717
1818diff --git a/build.gradle.kts b/build.gradle.kts
1919index 74e37d391fc4..3740535ed499 100644
@@ -44,7 +44,7 @@ index c859b3b8ca14..90f98779ef83 100644
4444 <artifact name="lz4-java-1.7.1.jar">
4545 <md5 value="d56d86823662a663a4d614dd5e117eff" origin="Generated by Gradle"/>
4646diff --git a/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts b/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts
47- index 7f6cb0d149e3..f0a4f4f78473 100644
47+ index 7f6cb0d149e3..b87232ded0ff 100644
4848--- a/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts
4949+++ b/prepare/ide-plugin-dependencies/analysis-api-standalone-embeddable-for-ide/build.gradle.kts
5050@@ -31,6 +31,7 @@ dependencies {
@@ -63,7 +63,7 @@ index 7f6cb0d149e3..f0a4f4f78473 100644
6363 )
6464
6565 tasks.register<ShadowJar>("embeddable") {
66- @@ -62,6 +64,14 @@ tasks.register<ShadowJar>("embeddable") {
66+ @@ -62,12 +64,25 @@ tasks.register<ShadowJar>("embeddable") {
6767 configurations = listOf(embeddableJar)
6868
6969 relocate("com.google.protobuf", "org.jetbrains.kotlin.protobuf")
@@ -72,12 +72,23 @@ index 7f6cb0d149e3..f0a4f4f78473 100644
7272+ // It makes use of MethodHandles in order to access methods from the sun.misc.Unsafe
7373+ // class, which are hidden API on Android. Remove this class and provide a drop-in
7474+ // replacement instead.
75- + relocate("com.intellij.util.containers.Unsafe", "com.intellij.util.containers.UnsafeAndroid") {
76- + exclude("com.intellij.util.containers.UnsafeAndroid")
77- + }
7875 relocate("com.intellij", "$kotlinEmbeddableRootPackage.com.intellij") {
7976 // These are not real packages, but important string constants which are used by xml-reader.
8077 exclude("com.intellij.projectService")
78+ exclude("com.intellij.applicationService")
79+ +
80+ + // we want to replace this class with our implementation, keep both out of the kotlin namespace
81+ + exclude("com.intellij.util.containers.Unsafe")
82+ + exclude("com.intellij.util.containers.AndroidUnsafe")
83+ }
84+
85+ + // replace with our Android-specific implementation
86+ + exclude("com/intellij/util/containers/Unsafe")
87+ + relocate("com.intellij.util.containers.Unsafe", "com.intellij.util.containers.AndroidUnsafe")
88+ +
89+ packagesToRelocate.forEach {
90+ relocate(it, "$kotlinEmbeddableRootPackage.$it")
91+ }
8192diff --git a/prepare/ide-plugin-dependencies/unsafe-access-android/build.gradle.kts b/prepare/ide-plugin-dependencies/unsafe-access-android/build.gradle.kts
8293new file mode 100644
8394index 000000000000..07633a92595e
@@ -163,12 +174,12 @@ index 000000000000..07633a92595e
163174+ dependsOn(extractHiddenapibypass)
164175+ from(zipTree(hiddenapibypassClassesJar))
165176+ }
166- diff --git a/prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/UnsafeAndroid .java b/prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/UnsafeAndroid .java
177+ diff --git a/prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/AndroidUnsafe .java b/prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/AndroidUnsafe .java
167178new file mode 100644
168- index 000000000000..d82643964c2d
179+ index 000000000000..4c179310346d
169180--- /dev/null
170- +++ b/prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/UnsafeAndroid .java
171- @@ -0,0 +1,138 @@
181+ +++ b/prepare/ide-plugin-dependencies/unsafe-access-android/src/main/java/com/intellij/util/containers/AndroidUnsafe .java
182+ @@ -0,0 +1,137 @@
172183+ /*
173184+ * Copyright 2010-2026 JetBrains s.r.o. and Kotlin Programming Language contributors.
174185+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
@@ -177,15 +188,14 @@ index 000000000000..d82643964c2d
177188+ package com.intellij.util.containers;
178189+
179190+ import android.util.Log;
180- + import com.intellij.util.ReflectionUtil;
181191+ import org.lsposed.hiddenapibypass.HiddenApiBypass;
182192+
183193+ import java.lang.reflect.Field;
184194+ import java.lang.reflect.Method;
185195+ import java.util.Arrays;
186196+
187197+ @SuppressWarnings("all")
188- + public class UnsafeAndroid {
198+ + public class AndroidUnsafe {
189199+
190200+ private static final Object unsafe;
191201+
0 commit comments