@@ -222,23 +222,28 @@ private void deoptimizeMethods(Class<?> clazz, String... names) {
222222
223223 private void hookWindowState (ClassLoader classLoader ) throws ClassNotFoundException , NoSuchMethodException {
224224 var windowStateClazz = classLoader .loadClass ("com.android.server.wm.WindowState" );
225+ var systemServerCl = windowStateClazz .getClassLoader ();
225226 var isSecureLockedMethod = windowStateClazz .getDeclaredMethod ("isSecureLocked" );
226227 hook (isSecureLockedMethod ).intercept (chain -> {
227228 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
228- var walker = StackWalker .getInstance ();
229+ var walker = StackWalker .getInstance (StackWalker . Option . RETAIN_CLASS_REFERENCE );
229230 var match = walker .walk (frames -> frames
230- .map ( StackWalker . StackFrame :: getMethodName )
231- . limit ( 10 )
232- . skip ( 6 )
233- . anyMatch ( s -> s . equals ( "setInitialSurfaceControlProperties" ) || s .equals ("createSurfaceLocked" )));
231+ .anyMatch ( frame -> frame . getDeclaringClass () != null &&
232+ frame . getDeclaringClass (). getClassLoader () == systemServerCl &&
233+ ( frame . getMethodName (). equals ( "setInitialSurfaceControlProperties" ) ||
234+ frame . getMethodName () .equals ("createSurfaceLocked" ) )));
234235 if (match ) return chain .proceed ();
235236 } else {
236237 var stackTrace = new Throwable ().getStackTrace ();
237- for (int i = 8 ; i < stackTrace .length && i < 12 ; i ++) {
238- var name = stackTrace [i ].getMethodName ();
239- if (name .equals ("setInitialSurfaceControlProperties" ) ||
240- name .equals ("createSurfaceLocked" )) {
241- return chain .proceed ();
238+ for (var frame : stackTrace ) {
239+ var name = frame .getMethodName ();
240+ try {
241+ if ((name .equals ("setInitialSurfaceControlProperties" ) ||
242+ name .equals ("createSurfaceLocked" )) &&
243+ classLoader .loadClass (frame .getClassName ()).getClassLoader () == systemServerCl ) {
244+ return chain .proceed ();
245+ }
246+ } catch (ClassNotFoundException ignored ) {
242247 }
243248 }
244249 }
@@ -284,17 +289,22 @@ private void hookDisplayControl(ClassLoader classLoader) throws ClassNotFoundExc
284289 var displayControlClazz = Build .VERSION .SDK_INT >= Build .VERSION_CODES .UPSIDE_DOWN_CAKE ?
285290 classLoader .loadClass ("com.android.server.display.DisplayControl" ) :
286291 SurfaceControl .class ;
292+ var systemServerCl = displayControlClazz .getClassLoader ();
287293 var method = displayControlClazz .getDeclaredMethod (
288294 Build .VERSION .SDK_INT >= Build .VERSION_CODES .VANILLA_ICE_CREAM ?
289295 "createVirtualDisplay" :
290296 "createDisplay" , String .class , boolean .class );
291297 hook (method ).intercept (chain -> {
292298 if (Build .VERSION .SDK_INT < Build .VERSION_CODES .UPSIDE_DOWN_CAKE ) {
293299 var stackTrace = new Throwable ().getStackTrace ();
294- for (int i = 8 ; i < stackTrace .length && i < 12 ; i ++) {
295- var name = stackTrace [i ].getMethodName ();
296- if (name .equals ("createVirtualDisplayLocked" )) {
297- return chain .proceed ();
300+ for (var frame : stackTrace ) {
301+ var name = frame .getMethodName ();
302+ try {
303+ if (name .equals ("createVirtualDisplayLocked" ) &&
304+ classLoader .loadClass (frame .getClassName ()).getClassLoader () == systemServerCl ) {
305+ return chain .proceed ();
306+ }
307+ } catch (ClassNotFoundException ignored ) {
298308 }
299309 }
300310 }
0 commit comments