From efeddda32866f509a1a4ae0418f6fcbfb79d5f29 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 6 Jun 2017 03:06:23 +0800 Subject: [PATCH] Use Java synchronize instead serial tasks --- .../topjohnwu/magisk/MagiskLogFragment.java | 6 +- .../topjohnwu/magisk/SettingsActivity.java | 41 +++++-------- .../com/topjohnwu/magisk/SplashActivity.java | 18 ++---- .../magisk/adapters/ModulesAdapter.java | 58 +++++++------------ .../topjohnwu/magisk/asyncs/CheckUpdates.java | 1 + .../com/topjohnwu/magisk/asyncs/FlashZip.java | 6 +- .../magisk/asyncs/GetBootBlocks.java | 9 ++- .../topjohnwu/magisk/asyncs/LoadModules.java | 5 +- .../topjohnwu/magisk/asyncs/LoadRepos.java | 1 + .../topjohnwu/magisk/asyncs/MagiskHide.java | 5 +- .../topjohnwu/magisk/asyncs/ParallelTask.java | 17 +++++- .../magisk/asyncs/ProcessMagiskZip.java | 15 ++--- .../com/topjohnwu/magisk/asyncs/RootTask.java | 33 +++++++++++ .../topjohnwu/magisk/asyncs/SerialTask.java | 30 ---------- .../com/topjohnwu/magisk/module/Module.java | 12 ++-- .../com/topjohnwu/magisk/utils/Shell.java | 14 +++++ .../com/topjohnwu/magisk/utils/Utils.java | 18 ++---- 17 files changed, 143 insertions(+), 146 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/asyncs/RootTask.java delete mode 100644 app/src/main/java/com/topjohnwu/magisk/asyncs/SerialTask.java diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java index 00ae6a9af..3245c86cf 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java @@ -24,7 +24,7 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; -import com.topjohnwu.magisk.asyncs.SerialTask; +import com.topjohnwu.magisk.asyncs.RootTask; import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.utils.Shell; @@ -127,14 +127,14 @@ public class MagiskLogFragment extends Fragment { } } - public class LogManager extends SerialTask { + private class LogManager extends RootTask { int mode; File targetFile; @SuppressLint("DefaultLocale") @Override - protected Object doInBackground(Object... params) { + protected Object doInRoot(Object... params) { mode = (int) params[0]; switch (mode) { case 0: diff --git a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java index 217db8733..2abf08d2a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java @@ -12,7 +12,6 @@ import android.support.v7.widget.Toolbar; import android.widget.Toast; import com.topjohnwu.magisk.asyncs.MagiskHide; -import com.topjohnwu.magisk.asyncs.SerialTask; import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.components.AlertDialogBuilder; import com.topjohnwu.magisk.database.SuDatabaseHelper; @@ -140,18 +139,11 @@ public class SettingsActivity extends Activity { break; case "disable": enabled = prefs.getBoolean("disable", false); - new SerialTask() { - private boolean enable = enabled; - @Override - protected Void doInBackground(Void... voids) { - if (enable) { - Utils.createFile(MagiskManager.MAGISK_DISABLE_FILE); - } else { - Utils.removeItem(MagiskManager.MAGISK_DISABLE_FILE); - } - return null; - } - }.exec(); + if (enabled) { + Utils.createFile(MagiskManager.MAGISK_DISABLE_FILE); + } else { + Utils.removeItem(MagiskManager.MAGISK_DISABLE_FILE); + } Toast.makeText(getActivity(), R.string.settings_reboot_toast, Toast.LENGTH_LONG).show(); break; case "magiskhide": @@ -173,20 +165,15 @@ public class SettingsActivity extends Activity { break; case "hosts": enabled = prefs.getBoolean("hosts", false); - new SerialTask() { - private boolean enable = enabled; - @Override - protected Void doInBackground(Void... voids) { - if (enable) { - Shell.su("cp -af /system/etc/hosts /magisk/.core/hosts", - "mount -o bind /magisk/.core/hosts /system/etc/hosts"); - } else { - Shell.su("umount -l /system/etc/hosts", - "rm -f /magisk/.core/hosts"); - } - return null; - } - }.exec(); + if (enabled) { + Shell.su_async(null, + "cp -af /system/etc/hosts /magisk/.core/hosts", + "mount -o bind /magisk/.core/hosts /system/etc/hosts"); + } else { + Shell.su_async(null, + "umount -l /system/etc/hosts", + "rm -f /magisk/.core/hosts"); + } break; case "su_access": magiskManager.suAccessState = Utils.getPrefsInt(prefs, "su_access", 3); diff --git a/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java b/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java index ea7cfa695..0d8460362 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java @@ -25,28 +25,18 @@ public class SplashActivity extends Activity{ super.onCreate(savedInstanceState); - MagiskManager magiskManager = getApplicationContext(); - // Init the info and configs and root shell - magiskManager.init(); + getApplicationContext().init(); // Now fire all async tasks new GetBootBlocks(this).exec(); - new LoadModules(this) { - @Override - protected void onPostExecute(Void v) { - super.onPostExecute(v); - if (Utils.checkNetworkStatus(activity)) { - new LoadRepos(activity).exec(); - } - } - }.exec(); + new LoadModules(this).setCallBack(() -> new LoadRepos(this).exec()).exec(); new LoadApps(this).exec(); if (Utils.checkNetworkStatus(this)) { // Initialize the update check service, notify every 12 hours if (!TextUtils.equals("install", getIntent().getStringExtra(MagiskManager.INTENT_SECTION))) { - ComponentName service = new ComponentName(magiskManager, UpdateCheckService.class); + ComponentName service = new ComponentName(this, UpdateCheckService.class); JobInfo jobInfo = new JobInfo.Builder(UPDATE_SERVICE_ID, service) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPersisted(true) @@ -57,7 +47,7 @@ public class SplashActivity extends Activity{ } } - Intent intent = new Intent(magiskManager, MainActivity.class); + Intent intent = new Intent(this, MainActivity.class); String section = getIntent().getStringExtra(MagiskManager.INTENT_SECTION); if (section != null) { intent.putExtra(MagiskManager.INTENT_SECTION, section); diff --git a/app/src/main/java/com/topjohnwu/magisk/adapters/ModulesAdapter.java b/app/src/main/java/com/topjohnwu/magisk/adapters/ModulesAdapter.java index 62042bdcf..fb305ba1c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/adapters/ModulesAdapter.java +++ b/app/src/main/java/com/topjohnwu/magisk/adapters/ModulesAdapter.java @@ -12,7 +12,6 @@ import android.widget.ImageView; import android.widget.TextView; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.asyncs.SerialTask; import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.utils.Shell; @@ -53,44 +52,31 @@ public class ModulesAdapter extends RecyclerView.Adapter new SerialTask() { - @Override - protected Void doInBackground(Void... voids) { - if (isChecked) { - module.removeDisableFile(); - } else { - module.createDisableFile(); - } - return null; + holder.checkBox.setOnCheckedChangeListener((v, isChecked) -> { + int snack; + if (isChecked) { + module.removeDisableFile(); + snack = R.string.disable_file_removed; + } else { + module.createDisableFile(); + snack = R.string.disable_file_created; } + SnackbarMaker.make(holder.itemView, snack, Snackbar.LENGTH_SHORT).show(); + }); - @Override - protected void onPostExecute(Void v) { - int snack = isChecked ? R.string.disable_file_removed : R.string.disable_file_created; - SnackbarMaker.make(holder.itemView, snack, Snackbar.LENGTH_SHORT).show(); + holder.delete.setOnClickListener(v -> { + boolean removed = module.willBeRemoved(); + int snack; + if (removed) { + module.deleteRemoveFile(); + snack = R.string.remove_file_deleted; + } else { + module.createRemoveFile(); + snack = R.string.remove_file_created; } - }.exec()); - - holder.delete.setOnClickListener(v -> new SerialTask() { - private final boolean removed = module.willBeRemoved(); - - @Override - protected Void doInBackground(Void... voids) { - if (removed) { - module.deleteRemoveFile(); - } else { - module.createRemoveFile(); - } - return null; - } - - @Override - protected void onPostExecute(Void v) { - int snack = removed ? R.string.remove_file_deleted : R.string.remove_file_created; - SnackbarMaker.make(holder.itemView, snack, Snackbar.LENGTH_SHORT).show(); - updateDeleteButton(holder, module); - } - }.exec()); + SnackbarMaker.make(holder.itemView, snack, Snackbar.LENGTH_SHORT).show(); + updateDeleteButton(holder, module); + }); if (module.isUpdated()) { holder.notice.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java index 36ea6b7a7..8b0f2cc8d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java @@ -68,5 +68,6 @@ public class CheckUpdates extends ParallelTask { notificationManager.notify(NOTIFICATION_ID, builder.build()); } magiskManager.updateCheckDone.trigger(); + super.onPostExecute(v); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/FlashZip.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/FlashZip.java index d39672424..a4e7e5613 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/FlashZip.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/FlashZip.java @@ -21,7 +21,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.List; -public class FlashZip extends SerialTask { +public class FlashZip extends RootTask { private Uri mUri; private File mCachedFile, mScriptFile, mCheckFile; @@ -96,7 +96,7 @@ public class FlashZip extends SerialTask { } @Override - protected Integer doInBackground(Void... voids) { + protected Integer doInRoot(Void... voids) { Logger.dev("FlashZip Running... " + mFilename); List ret; try { @@ -124,7 +124,6 @@ public class FlashZip extends SerialTask { // -1 = error, manual install; 0 = invalid zip; 1 = success @Override protected void onPostExecute(Integer result) { - super.onPostExecute(result); progress.dismiss(); switch (result) { case -1: @@ -138,6 +137,7 @@ public class FlashZip extends SerialTask { onSuccess(); break; } + super.onPostExecute(result); } protected void onSuccess() { diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/GetBootBlocks.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/GetBootBlocks.java index ff33ccf4e..f445a0f8e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/GetBootBlocks.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/GetBootBlocks.java @@ -5,15 +5,17 @@ import android.app.Activity; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; -public class GetBootBlocks extends SerialTask { +public class GetBootBlocks extends RootTask { public GetBootBlocks(Activity context) { super(context); } @Override - protected Void doInBackground(Void... params) { - magiskManager.blockList = Shell.su("ls /dev/block | grep mmc"); + protected Void doInRoot(Void... params) { + magiskManager.blockList = Shell.su( + "find /dev/block -type b -maxdepth 1 | grep -v -E \"loop|ram|dm-0\"" + ); if (magiskManager.bootBlock == null) { magiskManager.bootBlock = Utils.detectBootImage(); } @@ -23,5 +25,6 @@ public class GetBootBlocks extends SerialTask { @Override protected void onPostExecute(Void v) { magiskManager.blockDetectionDone.trigger(); + super.onPostExecute(v); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadModules.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadModules.java index 96ed1dcd5..20fbf913d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadModules.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadModules.java @@ -9,14 +9,14 @@ import com.topjohnwu.magisk.utils.Logger; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.ValueSortedMap; -public class LoadModules extends SerialTask { +public class LoadModules extends RootTask { public LoadModules(Activity context) { super(context); } @Override - protected Void doInBackground(Void... voids) { + protected Void doInRoot(Void... voids) { Logger.dev("LoadModules: Loading modules"); magiskManager.moduleMap = new ValueSortedMap<>(); @@ -37,5 +37,6 @@ public class LoadModules extends SerialTask { @Override protected void onPostExecute(Void v) { magiskManager.moduleLoadDone.trigger(); + super.onPostExecute(v); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadRepos.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadRepos.java index 827f4e289..27d8b4f81 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadRepos.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/LoadRepos.java @@ -184,5 +184,6 @@ public class LoadRepos extends ParallelTask { @Override protected void onPostExecute(Void v) { magiskManager.repoLoadDone.trigger(); + super.onPostExecute(v); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/MagiskHide.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/MagiskHide.java index 1aa01d6db..11fe3b4c2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/MagiskHide.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/MagiskHide.java @@ -6,7 +6,7 @@ import com.topjohnwu.magisk.utils.Shell; import java.util.List; -public class MagiskHide extends SerialTask { +public class MagiskHide extends RootTask { private boolean isList = false; @@ -17,7 +17,7 @@ public class MagiskHide extends SerialTask { } @Override - protected Void doInBackground(Object... params) { + protected Void doInRoot(Object... params) { String command = (String) params[0]; List ret = Shell.su("magiskhide --" + command); if (isList) { @@ -31,6 +31,7 @@ public class MagiskHide extends SerialTask { if (isList) { magiskManager.magiskHideDone.trigger(); } + super.onPostExecute(v); } public void add(CharSequence packageName) { diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/ParallelTask.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/ParallelTask.java index 6779d6cb2..9400fe1f8 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/ParallelTask.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/ParallelTask.java @@ -7,9 +7,12 @@ import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.utils.Utils; public abstract class ParallelTask extends AsyncTask { + protected Activity activity; protected MagiskManager magiskManager; + private Runnable callback = null; + public ParallelTask() {} public ParallelTask(Activity context) { @@ -17,8 +20,18 @@ public abstract class ParallelTask extends AsyncTask

setCallBack(Runnable next) { + callback = next; + return this; + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/ProcessMagiskZip.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/ProcessMagiskZip.java index 203aaa919..7bda3f842 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/ProcessMagiskZip.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/ProcessMagiskZip.java @@ -33,13 +33,13 @@ public class ProcessMagiskZip extends ParallelTask { @Override protected Boolean doInBackground(Void... params) { if (Shell.rootAccess()) { - // Running in parallel mode, open new shell - Shell.su(true, - "rm -f /dev/.magisk", - (mBoot != null) ? "echo \"BOOTIMAGE=/dev/block/" + mBoot + "\" >> /dev/.magisk" : "", - "echo \"KEEPFORCEENCRYPT=" + String.valueOf(mEnc) + "\" >> /dev/.magisk", - "echo \"KEEPVERITY=" + String.valueOf(mVerity) + "\" >> /dev/.magisk" - ); + synchronized (Shell.lock) { + Shell.su("rm -f /dev/.magisk", + (mBoot != null) ? "echo \"BOOTIMAGE=" + mBoot + "\" >> /dev/.magisk" : "", + "echo \"KEEPFORCEENCRYPT=" + String.valueOf(mEnc) + "\" >> /dev/.magisk", + "echo \"KEEPVERITY=" + String.valueOf(mVerity) + "\" >> /dev/.magisk" + ); + } return true; } return false; @@ -53,5 +53,6 @@ public class ProcessMagiskZip extends ParallelTask { } else { Utils.showUriSnack(activity, mUri); } + super.onPostExecute(result); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/RootTask.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/RootTask.java new file mode 100644 index 000000000..50d942224 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/RootTask.java @@ -0,0 +1,33 @@ +package com.topjohnwu.magisk.asyncs; + +import android.app.Activity; + +import com.topjohnwu.magisk.utils.Shell; + +public abstract class RootTask extends ParallelTask { + + public RootTask() {} + + public RootTask(Activity context) { + super(context); + } + + @SafeVarargs + @Override + final protected Result doInBackground(Params... params) { + synchronized (Shell.lock) { + return doInRoot(params); + } + } + + @SuppressWarnings("unchecked") + abstract protected Result doInRoot(Params... params); + + @SuppressWarnings("unchecked") + @Override + public void exec(Params... params) { + if (Shell.rootAccess()) { + super.exec(params); + } + } +} diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/SerialTask.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/SerialTask.java deleted file mode 100644 index 825fbbf41..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/SerialTask.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.topjohnwu.magisk.asyncs; - -import android.app.Activity; -import android.os.AsyncTask; - -import com.topjohnwu.magisk.MagiskManager; -import com.topjohnwu.magisk.utils.Shell; -import com.topjohnwu.magisk.utils.Utils; - -/** - * This class is only used for running root commands - **/ - -public abstract class SerialTask extends AsyncTask { - protected Activity activity; - protected MagiskManager magiskManager; - - public SerialTask() {} - - public SerialTask(Activity context) { - activity = context; - magiskManager = Utils.getMagiskManager(context); - } - - @SafeVarargs - public final void exec(Params... params) { - if (!Shell.rootAccess()) return; - executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params); - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/module/Module.java b/app/src/main/java/com/topjohnwu/magisk/module/Module.java index 5889e0e62..07c4fb59c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/Module.java @@ -33,11 +33,13 @@ public class Module extends BaseModule { } public void createDisableFile() { - mEnable = !Utils.createFile(mDisableFile); + mEnable = false; + Utils.createFile(mDisableFile); } public void removeDisableFile() { - mEnable = Utils.removeItem(mDisableFile); + mEnable = true; + Utils.removeItem(mDisableFile); } public boolean isEnabled() { @@ -45,11 +47,13 @@ public class Module extends BaseModule { } public void createRemoveFile() { - mRemove = Utils.createFile(mRemoveFile); + mRemove = true; + Utils.createFile(mRemoveFile); } public void deleteRemoveFile() { - mRemove = !Utils.removeItem(mRemoveFile); + mRemove = false; + Utils.removeItem(mRemoveFile); } public boolean willBeRemoved() { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Shell.java b/app/src/main/java/com/topjohnwu/magisk/utils/Shell.java index 7baec8574..bb0226672 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Shell.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Shell.java @@ -1,5 +1,7 @@ package com.topjohnwu.magisk.utils; +import com.topjohnwu.magisk.asyncs.RootTask; + import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -14,6 +16,7 @@ public class Shell { // -1 = problematic/unknown issue; 0 = not rooted; 1 = properly rooted public static int rootStatus; + public static final Object lock = new Object(); private static boolean isInit = false; private static Process rootShell; @@ -212,4 +215,15 @@ public class Shell { return new ArrayList<>(res); } + + public static void su_async(List result, String... commands) { + new RootTask() { + @Override + protected Void doInRoot(Void... params) { + List ret = Shell.su(commands); + if (result != null) result.addAll(ret); + return null; + } + }.exec(); + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java index a3df1e937..ff37d8d5a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -39,23 +39,15 @@ public class Utils { return isValidShellResponse(ret) && Boolean.parseBoolean(ret.get(0)); } - public static boolean commandExists(String s) { - String command = "if [ -z $(which " + s + ") ]; then echo false; else echo true; fi"; - List ret = Shell.sh(command); - return isValidShellResponse(ret) && Boolean.parseBoolean(ret.get(0)); - } - - public static boolean createFile(String path) { + public static void createFile(String path) { String folder = path.substring(0, path.lastIndexOf('/')); String command = "mkdir -p " + folder + " 2>/dev/null; touch " + path + " 2>/dev/null; if [ -f \"" + path + "\" ]; then echo true; else echo false; fi"; - List ret = Shell.su(command); - return isValidShellResponse(ret) && Boolean.parseBoolean(ret.get(0)); + Shell.su_async(null, command); } - public static boolean removeItem(String path) { + public static void removeItem(String path) { String command = "rm -rf " + path + " 2>/dev/null; if [ -e " + path + " ]; then echo false; else echo true; fi"; - List ret = Shell.su(command); - return isValidShellResponse(ret) && Boolean.parseBoolean(ret.get(0)); + Shell.su_async(null, command); } public static List getModList(String path) { @@ -116,7 +108,7 @@ public class Utils { "BOOTIMAGE=`readlink /dev/block/by-name/$PARTITION || readlink /dev/block/platform/*/by-name/$PARTITION || readlink /dev/block/platform/*/*/by-name/$PARTITION`", "if [ ! -z \"$BOOTIMAGE\" ]; then break; fi", "done", - "echo \"${BOOTIMAGE##*/}\"" + "echo \"$BOOTIMAGE\"" }; List ret = Shell.su(commands); if (isValidShellResponse(ret)) {