diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0fb63315..67653221 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,7 +19,6 @@ /sbin/.magisk/img/wireguard/module.prop; ", BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)); script.append("touch /sbin/.magisk/img/wireguard/auto_mount; "); - for (final String[] names : EXECUTABLES) { - final File destination = new File("/sbin/.magisk/img/wireguard" + INSTALL_DIR, names[1]); + for (final String name : EXECUTABLES) { + final File destination = new File("/sbin/.magisk/img/wireguard" + INSTALL_DIR, name); script.append(String.format("cp '%s' '%s'; chmod 755 '%s'; chcon 'u:object_r:system_file:s0' '%s' || true; ", - new File(nativeLibraryDir, names[0]), destination, destination, destination)); + new File(localBinaryDir, name), destination, destination, destination)); } script.append("trap - INT TERM EXIT;"); @@ -135,15 +128,16 @@ public final class ToolsInstaller { } } - private int installSystem() throws NoRootException { + private int installSystem() throws NoRootException, IOException { if (INSTALL_DIR == null) return OsConstants.ENOENT; + extract(); final StringBuilder script = new StringBuilder("set -ex; "); script.append("trap 'mount -o ro,remount /system' EXIT; mount -o rw,remount /system; "); - for (final String[] names : EXECUTABLES) { - final File destination = new File(INSTALL_DIR, names[1]); + for (final String name : EXECUTABLES) { + final File destination = new File(INSTALL_DIR, name); script.append(String.format("cp '%s' '%s'; chmod 755 '%s'; restorecon '%s' || true; ", - new File(nativeLibraryDir, names[0]), destination, destination, destination)); + new File(localBinaryDir, name), destination, destination, destination)); } try { return Application.getRootShell().run(null, script.toString()) == 0 ? YES | SYSTEM : ERROR; @@ -152,27 +146,23 @@ public final class ToolsInstaller { } } - public int symlink() throws NoRootException { - final StringBuilder script = new StringBuilder("set -x; "); - for (final String[] names : EXECUTABLES) { - script.append(String.format("test '%s' -ef '%s' && ", - new File(nativeLibraryDir, names[0]), - new File(localBinaryDir, names[1]))); + public boolean extract() throws IOException { + localBinaryDir.mkdirs(); + final File files[] = new File[EXECUTABLES.length]; + boolean allExist = true; + for (int i = 0; i < files.length; ++i) { + files[i] = new File(localBinaryDir, EXECUTABLES[i]); + allExist &= files[i].exists(); } - script.append("exit ").append(OsConstants.EALREADY).append("; set -e; "); - - for (final String[] names : EXECUTABLES) { - script.append(String.format("ln -fns '%s' '%s'; ", - new File(nativeLibraryDir, names[0]), - new File(localBinaryDir, names[1]))); - } - script.append("exit ").append(OsConstants.EXIT_SUCCESS).append(';'); - - try { - return Application.getRootShell().run(null, script.toString()); - } catch (final IOException ignored) { - return OsConstants.EXIT_FAILURE; + if (allExist) + return false; + for (int i = 0; i < files.length; ++i) { + if (!SharedLibraryLoader.extractLibrary(context, EXECUTABLES[i], files[i])) + throw new FileNotFoundException("Unable to find " + EXECUTABLES[i]); + if (!files[i].setExecutable(true, false)) + throw new IOException("Unable to mark " + files[i].getAbsolutePath() + " as executable"); } + return true; } private boolean willInstallAsMagiskModule() {