Skip to content

Commit d5e4e7b

Browse files
committed
only cache offsets that require IO
1 parent 1a53f13 commit d5e4e7b

File tree

3 files changed

+32
-32
lines changed

3 files changed

+32
-32
lines changed

library/src/androidTest/java/org/lsposed/hiddenapibypass/HiddenApiBypassTest.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import android.content.pm.ApplicationInfo;
1212
import android.graphics.drawable.ClipDrawable;
1313
import android.os.Build;
14-
import android.os.Process;
1514

1615
import androidx.test.ext.junit.runners.AndroidJUnit4;
1716
import androidx.test.filters.SdkSuppress;
@@ -165,20 +164,14 @@ class X {
165164
public void PtestCachedOffset() {
166165
var context = InstrumentationRegistry.getInstrumentation().getContext();
167166
var artVersion = Helper.getArtVersion(context);
168-
var isOld = artVersion == -1L;
169167
var isNew = artVersion >= 36_00_00000L;
170-
var is64bit = Process.is64Bit();
171168
var data = new long[10];
172169
data[0] = 24;
173170
data[1] = 12;
174171
data[2] = 24;
175172
data[3] = 48;
176173
data[4] = 40;
177174
data[5] = isNew ? 40 : 56;
178-
data[6] = isOld ? is64bit ? 40 : 28 : is64bit ? 32 : 24;
179-
data[7] = is64bit ? 8 : 4;
180-
data[8] = 16;
181-
data[9] = 4;
182175
assertArrayEquals("art version " + artVersion, data, Helper.getCachedOffsetData());
183176
}
184177

library/src/main/java/org/lsposed/hiddenapibypass/Helper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public static long[] getCachedOffsetData() {
4949
}
5050

5151
public static void setCachedOffsetData(long[] data) {
52-
if (cachedOffsetData != null || data.length != 10) return;
52+
if (cachedOffsetData != null || data.length != 6) return;
5353
cachedOffsetData = data;
5454

5555
if (cacheFile == null) return;
@@ -63,6 +63,7 @@ public static void setCachedOffsetData(long[] data) {
6363
}
6464

6565
public static void enableOffsetCache(Context context) {
66+
if (cacheFile != null) return;
6667
cacheFile = new File(context.getCacheDir(), "HiddenApiBypass");
6768
artVersion = getArtVersion(context);
6869

library/src/main/java/org/lsposed/hiddenapibypass/HiddenApiBypass.java

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public final class HiddenApiBypass {
6363
unsafe = (Unsafe) Unsafe.class.getDeclaredMethod("getUnsafe").invoke(null);
6464
var data = Helper.getCachedOffsetData();
6565
if (data == null) {
66-
data = readOffsetData();
66+
data = readOffsetDataIO();
6767
Helper.setCachedOffsetData(data);
6868
} else if (BuildConfig.DEBUG) {
6969
Log.d(TAG, "Using cached offset data");
@@ -74,18 +74,19 @@ public final class HiddenApiBypass {
7474
methodsOffset = data[3];
7575
iFieldOffset = data[4];
7676
sFieldOffset = data[5];
77-
artMethodSize = data[6];
78-
artMethodBias = data[7];
79-
artFieldSize = data[8];
80-
artFieldBias = data[9];
77+
var dataRT = readOffsetDataRT();
78+
artMethodSize = dataRT[0];
79+
artMethodBias = dataRT[1];
80+
artFieldSize = dataRT[2];
81+
artFieldBias = dataRT[3];
8182
} catch (ReflectiveOperationException e) {
8283
Log.e(TAG, "Initialize error", e);
8384
throw new ExceptionInInitializerError(e);
8485
}
8586

8687
}
8788

88-
private static long[] readOffsetData() throws ReflectiveOperationException {
89+
private static long[] readOffsetDataIO() throws ReflectiveOperationException {
8990
ClassLoader bootClassloader = new CoreOjClassLoader();
9091
Class<?> executableClass = bootClassloader.loadClass(Executable.class.getName());
9192
Class<?> methodHandleClass = bootClassloader.loadClass(MethodHandle.class.getName());
@@ -95,16 +96,27 @@ private static long[] readOffsetData() throws ReflectiveOperationException {
9596
var artOffset = unsafe.objectFieldOffset(methodHandleClass.getDeclaredField("artFieldOrMethod"));
9697
var methodsOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("methods"));
9798

98-
long iField;
99-
long sField;
99+
long iFieldOffset;
100+
long sFieldOffset;
100101
try {
101-
iField = unsafe.objectFieldOffset(classClass.getDeclaredField("fields"));
102-
sField = iField;
102+
iFieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("fields"));
103+
sFieldOffset = iFieldOffset;
103104
} catch (NoSuchFieldException e) {
104-
iField = unsafe.objectFieldOffset(classClass.getDeclaredField("iFields"));
105-
sField = unsafe.objectFieldOffset(classClass.getDeclaredField("sFields"));
105+
iFieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("iFields"));
106+
sFieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("sFields"));
106107
}
107108

109+
long[] data = new long[6];
110+
data[0] = methodOffset;
111+
data[1] = classOffset;
112+
data[2] = artOffset;
113+
data[3] = methodsOffset;
114+
data[4] = iFieldOffset;
115+
data[5] = sFieldOffset;
116+
return data;
117+
}
118+
119+
private static long[] readOffsetDataRT() throws ReflectiveOperationException {
108120
Method mA = Helper.NeverCall.class.getDeclaredMethod("a");
109121
Method mB = Helper.NeverCall.class.getDeclaredMethod("b");
110122
mA.setAccessible(true);
@@ -129,25 +141,19 @@ private static long[] readOffsetData() throws ReflectiveOperationException {
129141
MethodHandle mhJ = MethodHandles.lookup().unreflectGetter(fJ);
130142
long iAddr = unsafe.getLong(mhI, artOffset);
131143
long jAddr = unsafe.getLong(mhJ, artOffset);
132-
long iFields = unsafe.getLong(Helper.NeverCall.class, iField);
144+
long iFields = unsafe.getLong(Helper.NeverCall.class, iFieldOffset);
133145
var artFieldSize = jAddr - iAddr;
134146
if (BuildConfig.DEBUG) Log.v(TAG, artFieldSize + " " +
135147
Long.toString(iAddr, 16) + ", " +
136148
Long.toString(jAddr, 16) + ", " +
137149
Long.toString(iFields, 16));
138150
var artFieldBias = iAddr - iFields;
139151

140-
long[] data = new long[10];
141-
data[0] = methodOffset;
142-
data[1] = classOffset;
143-
data[2] = artOffset;
144-
data[3] = methodsOffset;
145-
data[4] = iField;
146-
data[5] = sField;
147-
data[6] = artMethodSize;
148-
data[7] = artMethodBias;
149-
data[8] = artFieldSize;
150-
data[9] = artFieldBias;
152+
long[] data = new long[4];
153+
data[0] = artMethodSize;
154+
data[1] = artMethodBias;
155+
data[2] = artFieldSize;
156+
data[3] = artFieldBias;
151157
return data;
152158
}
153159

0 commit comments

Comments
 (0)