@@ -167,15 +167,16 @@ private Shell.Task startRootProcess(ComponentName name, String action) {
167167 Log .e (TAG , JVMTI_ERROR );
168168 }
169169
170+ String mainJarName = "main.jar" ;
170171 Context ctx = ContextUtils .getContext ();
171172 Context de = ContextUtils .getDeContext (ctx );
172173 File mainJar ;
173174 try {
174- mainJar = new File (FileUtils .getExternalCachePath (de ), "main.jar" );
175+ mainJar = new File (FileUtils .getExternalCachePath (de ), mainJarName );
175176 } catch (IOException e ) {
176177 throw new IllegalStateException ("External directory unavailable." , e );
177178 }
178- File stagingMainJar = new File (PACKAGE_STAGING_DIRECTORY , "main.jar" );
179+ File stagingMainJar = new File (PACKAGE_STAGING_DIRECTORY , mainJarName );
179180 // Dump main.jar as trampoline
180181 try (InputStream in = context .getResources ().getAssets ().open ("main.jar" );
181182 OutputStream out = new FileOutputStream (mainJar )) {
@@ -186,10 +187,7 @@ private Shell.Task startRootProcess(ComponentName name, String action) {
186187 StringBuilder env = new StringBuilder ();
187188 String params = getParams (env );
188189
189- // Classpath
190- env .append (CLASSPATH_ENV + "=" ).append (Ops .isSystem () ? mainJar : stagingMainJar ).append (" " );
191-
192- String cmd = getRunnerScript (env .toString (), mainJar , stagingMainJar , name , action , params );
190+ String cmd = getRunnerScript (env , mainJar , stagingMainJar , name , action , params );
193191 Log .d (TAG , cmd );
194192 // Write command to stdin
195193 byte [] bytes = cmd .getBytes (StandardCharsets .UTF_8 );
@@ -228,7 +226,7 @@ private static String getParams(StringBuilder env) {
228226 }
229227
230228 @ NonNull
231- private String getRunnerScript (@ NonNull String env ,
229+ private String getRunnerScript (@ NonNull StringBuilder env ,
232230 @ NonNull File mainJar ,
233231 @ NonNull File stagingMainJar ,
234232 @ NonNull ComponentName serviceName ,
@@ -238,17 +236,25 @@ private String getRunnerScript(@NonNull String env,
238236 @ SuppressLint ("RestrictedApi" )
239237 String execFile = "/system/bin/app_process" + (Utils .isProcess64Bit () ? "64" : "32" );
240238 String packageStagingCommand ;
241- if (!Ops .isSystem ()) {
239+ env .append (CLASSPATH_ENV ).append ("=" );
240+ if (Ops .hasRoot ()) {
241+ // Avoid using the package staging directory
242+ env .append (mainJar );
243+ packageStagingCommand = "" ;
244+ } else if (!Ops .isSystem ()) {
242245 // Use package staging directory
246+ env .append (stagingMainJar );
243247 packageStagingCommand = PackageUtils .ensurePackageStagingDirectoryCommand () +
244248 // Copy to main.jar to package staging directory
245249 String .format (Locale .ROOT , " && cp %s %s && " , mainJar , PACKAGE_STAGING_DIRECTORY ) +
246250 // Change permission of the main.jar
247251 String .format (Locale .ROOT , "chmod 755 %s && chown shell:shell %s && " , stagingMainJar , stagingMainJar );
248252 } else {
249253 // System can't use package staging directory
254+ env .append (mainJar );
250255 packageStagingCommand = "" ;
251256 }
257+ env .append (" " );
252258 return (packageStagingCommand +
253259 String .format (Locale .ROOT , "(%s %s %s /system/bin %s %s '%s' %d %s 2>&1)&" ,
254260 env , // Environments
0 commit comments