11package org.frknkrc44.hma_oss.zygote.hook
22
3+ import android.annotation.SuppressLint
34import android.os.Build
45import android.os.SystemProperties
56import androidx.annotation.RequiresApi
67import org.frknkrc44.hma_oss.common.BuildConfig
78import org.frknkrc44.hma_oss.zygote.service.BulkHooker
89import org.frknkrc44.hma_oss.zygote.service.HMAService
10+ import org.frknkrc44.hma_oss.zygote.service.SystemServerHook
911import org.frknkrc44.hma_oss.zygote.util.Logcat.logD
1012import org.frknkrc44.hma_oss.zygote.util.Logcat.logE
1113import org.frknkrc44.hma_oss.zygote.util.Logcat.logI
@@ -15,9 +17,11 @@ import org.frknkrc44.hma_oss.zygote.util.Utils4Zygote.getIntField
1517import org.frknkrc44.hma_oss.zygote.util.Utils4Zygote.getObjectField
1618import org.frknkrc44.hma_oss.zygote.util.Utils4Zygote.setBooleanField
1719import org.frknkrc44.hma_oss.zygote.util.ZygoteConstants.PROCESS_LIST_CLASS
20+ import org.frknkrc44.hma_oss.zygote.util.ZygoteConstants.PROCESS_RECORD_INTERNAL_CLASS
1821import org.frknkrc44.hma_oss.zygote.util.ZygoteConstants.STORAGE_MANAGER_SERVICE_CLASS
1922import java.util.Map
2023
24+ @SuppressLint(" PrivateApi" )
2125@RequiresApi(Build .VERSION_CODES .R )
2226class AppDataIsolationHook (private val service : HMAService ): IFrameworkHook {
2327 override val TAG = " AppDataIsolationHook"
@@ -30,6 +34,15 @@ class AppDataIsolationHook(private val service: HMAService): IFrameworkHook {
3034
3135 private var voldHookSkipped = false
3236
37+ private val processRecordIntClass: Class <* > by lazy {
38+ Class .forName(
39+ PROCESS_RECORD_INTERNAL_CLASS ,
40+ true ,
41+ SystemServerHook .classLoader,
42+ )
43+ }
44+
45+ @SuppressLint(" PrivateApi" )
3346 override fun load () {
3447 if (! (service.config.altAppDataIsolation || service.config.altVoldAppDataIsolation)) return
3548 logI(TAG ) { " Load hook" }
@@ -87,19 +100,29 @@ class AppDataIsolationHook(private val service: HMAService): IFrameworkHook {
87100 ) { param ->
88101 if (service.config.altVoldAppDataIsolation) {
89102 val app = param.args.find { it?.javaClass?.simpleName == " ProcessRecord" }!!
90- val uid = getIntField(app, " uid" )
103+ val uid = runCatching {
104+ getIntField(app, " uid" )
105+ }.getOrElse {
106+ getIntField(app, " uid" , processRecordIntClass)
107+ }
91108 val processName = runCatching {
92109 getObjectField(app, " processName" )
93- }.getOrDefault(" <unknown>" )
110+ }.getOrElse {
111+ getObjectField(app, " processName" , processRecordIntClass)
112+ }
94113 val mountNode = runCatching {
95114 getIntField(app, " mMountMode" )
96115 }.getOrDefault(0 )
97116 val isolated = runCatching {
98117 getBooleanField(app, " isolated" )
99- }.getOrDefault(false )
118+ }.getOrElse {
119+ getBooleanField(app, " isolated" , processRecordIntClass)
120+ }
100121 val appZygote = runCatching {
101122 getBooleanField(app, " appZygote" )
102- }.getOrDefault(false )
123+ }.getOrElse {
124+ getBooleanField(app, " appZygote" , processRecordIntClass)
125+ }
103126
104127 val apps = Utils4Zygote .getCallingApps(service, uid)
105128
0 commit comments