diff --git a/app/build.gradle b/app/build.gradle index a5ee1a5b4..c544d2828 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ android { productFlavors { full { - versionCode 129 + versionCode 130 versionName "5.8.3" } stub { @@ -57,7 +57,7 @@ dependencies { fullImplementation "com.android.support:recyclerview-v7:${rootProject.ext.supportLibVersion}" fullImplementation "com.android.support:cardview-v7:${rootProject.ext.supportLibVersion}" fullImplementation "com.android.support:design:${rootProject.ext.supportLibVersion}" - fullImplementation 'com.github.topjohnwu:libsu:1.3.0' + fullImplementation 'com.github.topjohnwu:libsu:2.0.0' fullImplementation 'com.atlassian.commonmark:commonmark:0.11.0' fullImplementation 'org.kamranzafar:jtar:2.3' fullImplementation 'com.jakewharton:butterknife:8.8.1' diff --git a/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java b/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java index 8c892d724..b4840adb8 100644 --- a/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java @@ -51,7 +51,7 @@ public class FlashActivity extends Activity { @OnClick(R.id.reboot) void reboot() { - Shell.Async.su("/system/bin/reboot"); + Shell.su("/system/bin/reboot").submit(); } @OnClick(R.id.save_logs) diff --git a/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java b/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java index eef4e01c6..d11297edd 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java @@ -2,7 +2,6 @@ package com.topjohnwu.magisk; import android.Manifest; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.text.TextUtils; @@ -22,12 +21,10 @@ import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.utils.Const; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; -import com.topjohnwu.superuser.ShellUtils; import java.io.File; import java.io.IOException; import java.util.Calendar; -import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; @@ -93,24 +90,15 @@ public class MagiskLogFragment extends Fragment { } public void readLogs() { - Shell.Async.su(new Shell.Async.Callback() { - @Override - public void onTaskResult(@Nullable List out, @Nullable List err) { - progressBar.setVisibility(View.GONE); - if (ShellUtils.isValidOutput(out)) { - txtLog.setText(TextUtils.join("\n", out)); - } else { - txtLog.setText(R.string.log_is_empty); - } - svLog.postDelayed(() -> svLog.fullScroll(ScrollView.FOCUS_DOWN), 100); - hsvLog.postDelayed(() -> hsvLog.fullScroll(ScrollView.FOCUS_LEFT), 100); - } - - @Override - public void onTaskError(@NonNull Throwable throwable) { + Shell.su("cat " + Const.MAGISK_LOG + " | tail -n 5000").submit(result -> { + progressBar.setVisibility(View.GONE); + if (result.getOut().isEmpty()) txtLog.setText(R.string.log_is_empty); - } - }, "cat " + Const.MAGISK_LOG + " | tail -n 5000"); + else + txtLog.setText(TextUtils.join("\n", result.getOut())); + svLog.postDelayed(() -> svLog.fullScroll(ScrollView.FOCUS_DOWN), 100); + hsvLog.postDelayed(() -> hsvLog.fullScroll(ScrollView.FOCUS_LEFT), 100); + }); } public void saveLogs() { @@ -127,19 +115,13 @@ public class MagiskLogFragment extends Fragment { } catch (IOException e) { return; } - Shell.Async.su(new Shell.Async.Callback() { - @Override - public void onTaskResult(@Nullable List out, @Nullable List err) { - SnackbarMaker.make(txtLog, targetFile.getPath(), Snackbar.LENGTH_SHORT).show(); - } - - @Override - public void onTaskError(@NonNull Throwable throwable) {} - }, "cat " + Const.MAGISK_LOG + " > " + targetFile); + Shell.su("cat " + Const.MAGISK_LOG + " > " + targetFile) + .submit(result -> + SnackbarMaker.make(txtLog, targetFile.getPath(), Snackbar.LENGTH_SHORT).show()); } public void clearLogs() { - Shell.Async.su("echo -n > " + Const.MAGISK_LOG); + Shell.su("echo -n > " + Const.MAGISK_LOG).submit(); SnackbarMaker.make(txtLog, R.string.logs_cleared, Snackbar.LENGTH_SHORT).show(); } } diff --git a/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java b/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java index 2f777a188..a7f01dd70 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java +++ b/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java @@ -8,7 +8,6 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.preference.PreferenceManager; -import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Xml; @@ -19,7 +18,6 @@ import com.topjohnwu.magisk.database.RepoDatabaseHelper; import com.topjohnwu.magisk.services.UpdateCheckService; import com.topjohnwu.magisk.utils.Const; import com.topjohnwu.magisk.utils.RootUtils; -import com.topjohnwu.magisk.utils.ShellInitializer; import com.topjohnwu.magisk.utils.Topic; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; @@ -37,7 +35,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class MagiskManager extends Application implements Shell.Container { +public class MagiskManager extends Application { // Topics public final Topic magiskHideDone = new Topic(); @@ -89,31 +87,20 @@ public class MagiskManager extends Application implements Shell.Container { public MagiskDatabaseHelper mDB; public RepoDatabaseHelper repoDB; - private volatile Shell mShell; + private Shell.Container container; public MagiskManager() { weakSelf = new WeakReference<>(this); - Shell.setContainer(this); - } - - @Nullable - @Override - public Shell getShell() { - return mShell; - } - - @Override - public void setShell(@Nullable Shell shell) { - mShell = shell; + container = Shell.Config.newContainer(); } @Override public void onCreate() { super.onCreate(); - Shell.setFlags(Shell.FLAG_MOUNT_MASTER); - Shell.verboseLogging(BuildConfig.DEBUG); - Shell.setInitializer(ShellInitializer.class); + Shell.Config.setFlags(Shell.FLAG_MOUNT_MASTER); + Shell.Config.verboseLogging(BuildConfig.DEBUG); + Shell.Config.setInitializer(RootUtils.class); prefs = PreferenceManager.getDefaultSharedPreferences(this); mDB = MagiskDatabaseHelper.getInstance(this); @@ -194,7 +181,7 @@ public class MagiskManager extends Application implements Shell.Container { magiskVersionCode = Integer.parseInt(ShellUtils.fastCmd("magisk -V")); String s = ShellUtils.fastCmd((magiskVersionCode >= Const.MAGISK_VER.RESETPROP_PERSIST ? "resetprop -p " : "getprop ") + Const.MAGISKHIDE_PROP); - magiskHide = s == null || Integer.parseInt(s) != 0; + magiskHide = Integer.parseInt(s) != 0; } catch (Exception ignored) {} } @@ -227,7 +214,7 @@ public class MagiskManager extends Application implements Shell.Container { prefs.edit().commit(); File xml = new File(getFilesDir().getParent() + "/shared_prefs", getPackageName() + "_preferences.xml"); - Shell.Sync.su(Utils.fmt("for usr in /data/user/*; do cat %s > ${usr}/%s; done", xml, Const.MANAGER_CONFIGS)); + Shell.su(Utils.fmt("for usr in /data/user/*; do cat %s > ${usr}/%s; done", xml, Const.MANAGER_CONFIGS)).exec(); } public void loadPrefs() { diff --git a/app/src/full/java/com/topjohnwu/magisk/ModulesFragment.java b/app/src/full/java/com/topjohnwu/magisk/ModulesFragment.java index db3a79ebd..f995ca982 100644 --- a/app/src/full/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/ModulesFragment.java @@ -112,16 +112,16 @@ public class ModulesFragment extends Fragment implements Topic.Subscriber { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.reboot: - Shell.Async.su("/system/bin/reboot"); + Shell.su("/system/bin/reboot").submit(); return true; case R.id.reboot_recovery: - Shell.Async.su("/system/bin/reboot recovery"); + Shell.su("/system/bin/reboot recovery").submit(); return true; case R.id.reboot_bootloader: - Shell.Async.su("/system/bin/reboot bootloader"); + Shell.su("/system/bin/reboot bootloader").submit(); return true; case R.id.reboot_download: - Shell.Async.su("/system/bin/reboot download"); + Shell.su("/system/bin/reboot download").submit(); return true; default: return false; diff --git a/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java b/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java index ef0d06170..ee633e38a 100644 --- a/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java @@ -254,20 +254,20 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { break; case Const.Key.MAGISKHIDE: if (prefs.getBoolean(key, false)) { - Shell.Async.su("magiskhide --enable"); + Shell.su("magiskhide --enable").submit(); } else { - Shell.Async.su("magiskhide --disable"); + Shell.su("magiskhide --disable").submit(); } break; case Const.Key.HOSTS: if (prefs.getBoolean(key, false)) { - Shell.Async.su( - "cp -af /system/etc/hosts " + Const.MAGISK_HOST_FILE, - "mount -o bind " + Const.MAGISK_HOST_FILE + " /system/etc/hosts"); + Shell.su("cp -af /system/etc/hosts " + Const.MAGISK_HOST_FILE, + "mount -o bind " + Const.MAGISK_HOST_FILE + " /system/etc/hosts") + .submit(); } else { - Shell.Async.su( - "umount -l /system/etc/hosts", - "rm -f " + Const.MAGISK_HOST_FILE); + Shell.su("umount -l /system/etc/hosts", + "rm -f " + Const.MAGISK_HOST_FILE) + .submit(); } break; case Const.Key.ROOT_ACCESS: diff --git a/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java b/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java index 2bb1e3c50..8dbd826aa 100644 --- a/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java @@ -14,7 +14,6 @@ import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.database.RepoDatabaseHelper; import com.topjohnwu.magisk.receivers.ShortcutReceiver; import com.topjohnwu.magisk.utils.Const; -import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; @@ -24,7 +23,6 @@ public class SplashActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - RootUtils.init(); MagiskManager mm = getMagiskManager(); mm.repoDB = new RepoDatabaseHelper(this); diff --git a/app/src/full/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java b/app/src/full/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java index 8cad5b196..1e730d0a9 100644 --- a/app/src/full/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java +++ b/app/src/full/java/com/topjohnwu/magisk/adapters/ApplicationAdapter.java @@ -59,10 +59,10 @@ public class ApplicationAdapter extends RecyclerView.Adapter { if (isChecked) { - Shell.Async.su("magiskhide --add " + info.packageName); + Shell.su("magiskhide --add " + info.packageName).submit(); hideList.add(info.packageName); } else { - Shell.Async.su("magiskhide --rm " + info.packageName); + Shell.su("magiskhide --rm " + info.packageName).submit(); hideList.remove(info.packageName); } }); @@ -128,7 +128,7 @@ public class ApplicationAdapter extends RecyclerView.Adapter i = fullList.iterator(); i.hasNext(); ) { ApplicationInfo info = i.next(); if (Const.HIDE_BLACKLIST.contains(info.packageName) || !info.enabled) { diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckSafetyNet.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckSafetyNet.java index 9fb81bbac..0b39f2deb 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckSafetyNet.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckSafetyNet.java @@ -30,7 +30,7 @@ public class CheckSafetyNet extends ParallelTask { } private void dlSnet() throws Exception { - Shell.Sync.sh("rm -rf " + dexPath.getParent()); + Shell.sh("rm -rf " + dexPath.getParent()).exec(); dexPath.getParentFile().mkdir(); HttpURLConnection conn = WebService.request(Const.Url.SNET_URL, null); try ( diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java index 85255425a..58e4b4d05 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java @@ -2,7 +2,6 @@ package com.topjohnwu.magisk.asyncs; import android.app.Activity; import android.net.Uri; -import android.text.TextUtils; import android.view.View; import com.topjohnwu.magisk.FlashActivity; @@ -66,12 +65,10 @@ public class FlashZip extends ParallelTask { } if (!unzipAndCheck()) return 0; console.add("- Installing " + Utils.getNameFromUri(mm, mUri)); - Shell.Sync.su(console, logs, - "cd " + mCachedFile.getParent(), - "BOOTMODE=true sh update-binary dummy 1 " + mCachedFile + " || echo 'Failed!'" - ); - - if (TextUtils.equals(console.get(console.size() - 1), "Failed!")) + if (!Shell.su("cd " + mCachedFile.getParent(), + "BOOTMODE=true sh update-binary dummy 1 " + mCachedFile) + .to(console, logs) + .exec().isSuccess()) return -1; } catch (Exception e) { @@ -86,10 +83,7 @@ public class FlashZip extends ParallelTask { @Override protected void onPostExecute(Integer result) { FlashActivity activity = (FlashActivity) getActivity(); - Shell.Async.su( - "rm -rf " + mCachedFile.getParent(), - "rm -rf " + Const.TMP_FOLDER_PATH - ); + Shell.su("rm -rf " + mCachedFile.getParent(), "rm -rf " + Const.TMP_FOLDER_PATH).submit(); switch (result) { case -1: console.add("! Installation failed"); diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java index 82f7d877a..fab7fcff7 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java @@ -17,6 +17,7 @@ import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.ZipUtils; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; +import com.topjohnwu.superuser.internal.NOPList; import com.topjohnwu.superuser.io.SuFile; import com.topjohnwu.superuser.io.SuFileInputStream; import com.topjohnwu.superuser.io.SuFileOutputStream; @@ -33,7 +34,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.AbstractList; import java.util.Arrays; import java.util.List; @@ -76,7 +76,7 @@ public class InstallMagisk extends ParallelTask { if (mode == FIX_ENV_MODE) { Activity a = getActivity(); dialog = ProgressDialog.show(a, a.getString(R.string.setup_title), a.getString(R.string.setup_msg)); - console = new NOPList<>(); + console = NOPList.getInstance(); } } @@ -101,12 +101,12 @@ public class InstallMagisk extends ParallelTask { console.add("! Cannot unzip zip"); throw e; } - Shell.Sync.sh(Utils.fmt("chmod -R 755 %s/*; %s/magiskinit -x magisk %s/magisk", - installDir, installDir, installDir)); + Shell.sh(Utils.fmt("chmod -R 755 %s/*; %s/magiskinit -x magisk %s/magisk", + installDir, installDir, installDir)).exec(); } private boolean dumpBoot() { - console.add("- Copying image locally"); + console.add("- Copying image to cache"); // Copy boot image to local try (InputStream in = mm.getContentResolver().openInputStream(bootUri); OutputStream out = new FileOutputStream(mBoot) @@ -152,16 +152,13 @@ public class InstallMagisk extends ParallelTask { } // Patch boot image - Shell.Sync.sh(console, logs, - "cd " + installDir, - Utils.fmt("KEEPFORCEENCRYPT=%b KEEPVERITY=%b sh update-binary indep " + - "boot_patch.sh %s || echo 'Failed!'", - mm.keepEnc, mm.keepVerity, mBoot)); - - if (TextUtils.equals(console.get(console.size() - 1), "Failed!")) + if (!Shell.sh("cd " + installDir, Utils.fmt( + "KEEPFORCEENCRYPT=%b KEEPVERITY=%b sh update-binary indep boot_patch.sh %s", + mm.keepEnc, mm.keepVerity, mBoot)) + .to(console, logs).exec().isSuccess()) return null; - Shell.Sync.sh("mv bin/busybox busybox", + Shell.Job job = Shell.sh("mv bin/busybox busybox", "rm -rf magisk.apk bin boot.img update-binary", "cd /"); @@ -174,8 +171,9 @@ public class InstallMagisk extends ParallelTask { ) { SignBoot.doSignature("/boot", in, out, null, null); } - Shell.Sync.su("mv -f " + signed + " " + patched); + job.add("mv -f " + signed + " " + patched); } + job.exec(); return patched; } @@ -199,7 +197,7 @@ public class InstallMagisk extends ParallelTask { ShellUtils.pump(in, out); out.close(); } - Shell.Sync.su("rm -f " + patched); + Shell.sh("rm -f " + patched).exec(); console.add(""); console.add("****************************"); console.add(" Patched image is placed in "); @@ -208,10 +206,11 @@ public class InstallMagisk extends ParallelTask { break; case SECOND_SLOT_MODE: case DIRECT_MODE: - Shell.Sync.sh(console, logs, - Utils.fmt("direct_install %s %s %s", patched, mBoot, installDir)); + Shell.Job job = Shell.su(Utils.fmt("direct_install %s %s %s", patched, mBoot, installDir)) + .to(console, logs); if (!mm.keepVerity) - Shell.Sync.sh(console, logs, "find_dtbo_image", "patch_dtbo_image"); + job.add("find_dtbo_image", "patch_dtbo_image"); + job.exec(); break; } } @@ -221,7 +220,7 @@ public class InstallMagisk extends ParallelTask { try (InputStream in = mm.getResources().openRawResource(R.raw.bootctl); OutputStream out = new SuFileOutputStream(bootctl)) { ShellUtils.pump(in, out); - Shell.Sync.su("post_ota " + bootctl.getParent()); + Shell.su("post_ota " + bootctl.getParent()).exec(); console.add("***************************************"); console.add(" Next reboot will boot to second slot!"); console.add("***************************************"); @@ -234,14 +233,14 @@ public class InstallMagisk extends ParallelTask { protected Boolean doInBackground(Void... voids) { if (mode == FIX_ENV_MODE) { installDir = new File("/data/adb/magisk"); - Shell.Sync.sh("rm -rf /data/adb/magisk/*"); + Shell.su("rm -rf /data/adb/magisk/*").exec(); } else { installDir = new File( (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? mm.createDeviceProtectedStorageContext() : mm) .getFilesDir().getParent() , "install"); - Shell.Sync.sh("rm -rf " + installDir); + Shell.sh("rm -rf " + installDir).exec(); installDir.mkdirs(); } @@ -298,7 +297,7 @@ public class InstallMagisk extends ParallelTask { try { extractFiles(arch); if (mode == FIX_ENV_MODE) { - Shell.Sync.sh("fix_env"); + Shell.su("fix_env").exec(); } else { File patched = patchBoot(); if (patched == null) @@ -324,26 +323,11 @@ public class InstallMagisk extends ParallelTask { // Running in FlashActivity FlashActivity activity = (FlashActivity) getActivity(); if (!result) { - Shell.Async.sh("rm -rf " + installDir); + Shell.sh("rm -rf " + installDir).submit(); console.add("! Installation failed"); activity.reboot.setVisibility(View.GONE); } activity.buttonPanel.setVisibility(View.VISIBLE); } } - - private static class NOPList extends AbstractList { - @Override - public E get(int index) { - return null; - } - - @Override - public int size() { - return 0; - } - - @Override - public void add(int index, E element) {} - } } diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java index 06c95df49..52ae9ecab 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java @@ -4,15 +4,13 @@ import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.container.Module; import com.topjohnwu.magisk.container.ValueSortedMap; import com.topjohnwu.magisk.utils.Const; -import com.topjohnwu.superuser.Shell; - -import java.util.List; +import com.topjohnwu.superuser.io.SuFile; public class LoadModules extends ParallelTask { - private List getModList() { - String command = "ls -d " + Const.MAGISK_PATH + "/* | grep -v lost+found"; - return Shell.Sync.su(command); + private String[] getModList() { + SuFile path = new SuFile(Const.MAGISK_PATH); + return path.list((file, name) -> !name.equals("lost+found") && !name.equals(".core")); } @Override @@ -20,8 +18,8 @@ public class LoadModules extends ParallelTask { MagiskManager mm = MagiskManager.get(); mm.moduleMap = new ValueSortedMap<>(); - for (String path : getModList()) { - Module module = new Module(path); + for (String name : getModList()) { + Module module = new Module(Const.MAGISK_PATH + "/" + name); mm.moduleMap.put(module.getId(), module); } diff --git a/app/src/full/java/com/topjohnwu/magisk/container/Module.java b/app/src/full/java/com/topjohnwu/magisk/container/Module.java index 399854cf9..3ba863216 100644 --- a/app/src/full/java/com/topjohnwu/magisk/container/Module.java +++ b/app/src/full/java/com/topjohnwu/magisk/container/Module.java @@ -14,9 +14,9 @@ public class Module extends BaseModule { parseProps(Shell.Sync.su("dos2unix < " + path + "/module.prop")); } catch (NumberFormatException ignored) {} - mRemoveFile = new SuFile(path + "/remove"); - mDisableFile = new SuFile(path + "/disable"); - mUpdateFile = new SuFile(path + "/update"); + mRemoveFile = new SuFile(path, "remove"); + mDisableFile = new SuFile(path, "disable"); + mUpdateFile = new SuFile(path, "update"); if (getId() == null) { int sep = path.lastIndexOf('/'); diff --git a/app/src/full/java/com/topjohnwu/magisk/database/MagiskDatabaseHelper.java b/app/src/full/java/com/topjohnwu/magisk/database/MagiskDatabaseHelper.java index 36548119f..746d4e468 100644 --- a/app/src/full/java/com/topjohnwu/magisk/database/MagiskDatabaseHelper.java +++ b/app/src/full/java/com/topjohnwu/magisk/database/MagiskDatabaseHelper.java @@ -44,7 +44,7 @@ public class MagiskDatabaseHelper { return new MagiskDatabaseHelper(mm); } catch (Exception e) { // Let's cleanup everything and try again - Shell.Sync.su("db_clean '*'"); + Shell.su("db_clean '*'").exec(); return new MagiskDatabaseHelper(mm); } } @@ -74,7 +74,7 @@ public class MagiskDatabaseHelper { } mm.loadMagiskInfo(); // Cleanup - Shell.Sync.su("db_clean " + Const.USER_ID); + Shell.su("db_clean " + Const.USER_ID).exec(); if (mm.magiskVersionCode < Const.MAGISK_VER.FBE_AWARE) { // Super old legacy mode return mm.openOrCreateDatabase("su.db", Context.MODE_PRIVATE, null); @@ -91,15 +91,15 @@ public class MagiskDatabaseHelper { de.deleteDatabase("su.db"); if (mm.magiskVersionCode < Const.MAGISK_VER.SEPOL_REFACTOR) { // We need some additional policies on old versions - Shell.Sync.su("db_sepatch"); + Shell.su("db_sepatch").exec(); } if (!GLOBAL_DB.exists()) { - Shell.Sync.su("db_init"); + Shell.su("db_init").exec(); SQLiteDatabase.openOrCreateDatabase(GLOBAL_DB, null).close(); - Shell.Sync.su("db_restore"); + Shell.su("db_restore").exec(); } } - Shell.Sync.su("db_setup " + Process.myUid()); + Shell.su("db_setup " + Process.myUid()).exec(); } // Not using legacy mode, open the mounted global DB return SQLiteDatabase.openOrCreateDatabase(DB_FILE, null); diff --git a/app/src/full/java/com/topjohnwu/magisk/receivers/PackageReceiver.java b/app/src/full/java/com/topjohnwu/magisk/receivers/PackageReceiver.java index 0fb4cfb01..c64fafba8 100644 --- a/app/src/full/java/com/topjohnwu/magisk/receivers/PackageReceiver.java +++ b/app/src/full/java/com/topjohnwu/magisk/receivers/PackageReceiver.java @@ -25,7 +25,7 @@ public class PackageReceiver extends BroadcastReceiver { break; case Intent.ACTION_PACKAGE_FULLY_REMOVED: mm.mDB.deletePolicy(pkg); - Shell.Async.su("magiskhide --rm " + pkg); + Shell.su("magiskhide --rm " + pkg).submit(); break; } } diff --git a/app/src/full/java/com/topjohnwu/magisk/receivers/RebootReceiver.java b/app/src/full/java/com/topjohnwu/magisk/receivers/RebootReceiver.java index 44794e461..078128388 100644 --- a/app/src/full/java/com/topjohnwu/magisk/receivers/RebootReceiver.java +++ b/app/src/full/java/com/topjohnwu/magisk/receivers/RebootReceiver.java @@ -9,6 +9,6 @@ import com.topjohnwu.superuser.Shell; public class RebootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - Shell.Async.su("/system/bin/reboot"); + Shell.su("/system/bin/reboot").submit(); } } diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java b/app/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java index b2e3318a3..39bd49f99 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java @@ -1,26 +1,59 @@ package com.topjohnwu.magisk.utils; +import android.content.Context; +import android.support.annotation.NonNull; + +import com.topjohnwu.magisk.R; +import com.topjohnwu.superuser.BusyBox; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.io.SuFile; -public class RootUtils { +import java.io.File; +import java.io.IOException; +import java.io.InputStream; - public static void init() { - if (Shell.rootAccess()) { - Const.MAGISK_DISABLE_FILE = new SuFile("/cache/.disable_magisk"); - SuFile file = new SuFile("/sbin/.core/img"); - if (file.exists()) { - Const.MAGISK_PATH = file; - } else if ((file = new SuFile("/dev/magisk/img")).exists()) { - Const.MAGISK_PATH = file; - } else { - Const.MAGISK_PATH = new SuFile("/magisk"); - } - Const.MAGISK_HOST_FILE = new SuFile(Const.MAGISK_PATH + "/.core/hosts"); - } +public class RootUtils extends Shell.Initializer { + + static { + BusyBox.BB_PATH = new File(Const.BUSYBOX_PATH); } + private static boolean fileInit = false; + public static void uninstallPkg(String pkg) { - Shell.Sync.su("db_clean " + Const.USER_ID, "pm uninstall " + pkg); + Shell.su("db_clean " + Const.USER_ID, "pm uninstall " + pkg).exec(); + } + + private void initConsts() { + Const.MAGISK_DISABLE_FILE = new SuFile("/cache/.disable_magisk"); + SuFile file = new SuFile("/sbin/.core/img"); + if (file.exists()) { + Const.MAGISK_PATH = file; + } else if ((file = new SuFile("/dev/magisk/img")).exists()) { + Const.MAGISK_PATH = file; + } else { + Const.MAGISK_PATH = new SuFile("/magisk"); + } + Const.MAGISK_HOST_FILE = new SuFile(Const.MAGISK_PATH + "/.core/hosts"); + fileInit = true; + } + + @Override + public boolean onInit(Context context, @NonNull Shell shell) { + if (shell.isRoot()) { + try (InputStream magiskUtils = context.getResources().openRawResource(R.raw.util_functions); + InputStream managerUtils = context.getResources().openRawResource(R.raw.utils) + ) { + shell.newJob() + .add(magiskUtils).add(managerUtils) + .add("mount_partitions", "get_flags", "run_migrations") + .exec(); + } catch (IOException e) { + return false; + } + if (!fileInit) + initConsts(); + } + return true; } } diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/ShellInitializer.java b/app/src/full/java/com/topjohnwu/magisk/utils/ShellInitializer.java deleted file mode 100644 index 317e2aa14..000000000 --- a/app/src/full/java/com/topjohnwu/magisk/utils/ShellInitializer.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.topjohnwu.magisk.utils; - -import android.content.Context; -import android.support.annotation.NonNull; - -import com.topjohnwu.magisk.R; -import com.topjohnwu.superuser.BusyBox; -import com.topjohnwu.superuser.Shell; -import com.topjohnwu.superuser.ShellUtils; - -import java.io.File; -import java.io.InputStream; - -public class ShellInitializer extends Shell.Initializer { - - static { - BusyBox.BB_PATH = new File(Const.BUSYBOX_PATH); - } - - @Override - public boolean onRootShellInit(Context context, @NonNull Shell shell) throws Exception { - try (InputStream magiskUtils = context.getResources().openRawResource(R.raw.util_functions); - InputStream managerUtils = context.getResources().openRawResource(R.raw.utils) - ) { - shell.execTask((in, err, out) -> { - ShellUtils.pump(magiskUtils, in); - ShellUtils.pump(managerUtils, in); - }); - } - shell.run(null, null, - "mount_partitions", - "get_flags", - "run_migrations"); - return true; - } -}