Skip to content

Commit 6c4ac3a

Browse files
committed
Use private cache directory instead of the staging directory for root services
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
1 parent aea42ac commit 6c4ac3a

1 file changed

Lines changed: 14 additions & 8 deletions

File tree

app/src/main/java/io/github/muntashirakon/AppManager/ipc/RootServiceManager.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)