From a07ca5ff505787552243dbc53721c1b7c1432b6f Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 3 Sep 2017 03:26:01 +0800 Subject: [PATCH] Slightly change busybox handling --- .../com/topjohnwu/magisk/MagiskManager.java | 34 ++++++---- .../magisk/asyncs/DownloadBusybox.java | 68 ++++++++----------- .../topjohnwu/magisk/asyncs/ParallelTask.java | 3 +- 3 files changed, 54 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java index 25d8dea4b..c14e74cbd 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java @@ -35,6 +35,7 @@ import java.io.File; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.concurrent.ExecutionException; public class MagiskManager extends Application { @@ -47,7 +48,7 @@ public class MagiskManager extends Application { public static final String MAGISKHIDE_PROP = "persist.magisk.hide"; public static final String DISABLE_INDICATION_PROP = "ro.magisk.disable"; public static final String NOTIFICATION_CHANNEL = "magisk_update_notice"; - public static final String BUSYBOX_VERSION = "1.27.1"; + public static final String BUSYBOXPATH = "/dev/magisk/bin"; public static final int UPDATE_SERVICE_ID = 1; // Topics @@ -107,7 +108,7 @@ public class MagiskManager extends Application { public Shell shell; private static Handler mHandler = new Handler(); - private boolean startup = false; + private boolean started = false; private static class LoadLocale extends ParallelTask { @@ -186,14 +187,26 @@ public class MagiskManager extends Application { } public void startup() { - if (startup) + if (started) return; - startup = true; + started = true; + + boolean hasNetwork = Utils.checkNetworkStatus(this); - shell = Shell.getShell(); - new LoadLocale(this).exec(); - new DownloadBusybox(this).exec(); getMagiskInfo(); + new LoadLocale(this).exec(); + + // Force synchronous, make sure we have busybox to use + if (hasNetwork && Shell.rootAccess() + && !Utils.itemExist(shell, BUSYBOXPATH + "/busybox")) { + try { + new DownloadBusybox(this).exec().get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + shell.su_raw("export PATH=" + BUSYBOXPATH + ":$PATH"); + updateBlockInfo(); // Write back default values @@ -211,13 +224,9 @@ public class MagiskManager extends Application { .putString("multiuser_mode", String.valueOf(multiuserMode)) .putString("mnt_ns", String.valueOf(suNamespaceMode)) .putString("update_channel", String.valueOf(updateChannel)) - .putString("busybox_version", BUSYBOX_VERSION) .putString("locale", localeConfig) .apply(); - // Add busybox to PATH - shell.su_raw("PATH=" + getApplicationInfo().dataDir + "/busybox:$PATH"); - // Create notification channel on Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL, @@ -227,7 +236,7 @@ public class MagiskManager extends Application { LoadModules loadModuleTask = new LoadModules(this); // Start update check job - if (Utils.checkNetworkStatus(this)) { + if (hasNetwork) { ComponentName service = new ComponentName(this, UpdateCheckService.class); JobInfo jobInfo = new JobInfo.Builder(UPDATE_SERVICE_ID, service) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) @@ -244,6 +253,7 @@ public class MagiskManager extends Application { public void getMagiskInfo() { List ret; + Shell.getShell(this); ret = shell.sh("su -v"); if (Utils.isValidShellResponse(ret)) { suVersion = ret.get(0); diff --git a/app/src/main/java/com/topjohnwu/magisk/asyncs/DownloadBusybox.java b/app/src/main/java/com/topjohnwu/magisk/asyncs/DownloadBusybox.java index 4c824b772..f602591d5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/DownloadBusybox.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/DownloadBusybox.java @@ -3,6 +3,7 @@ package com.topjohnwu.magisk.asyncs; import android.content.Context; import android.os.Build; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.WebService; @@ -15,7 +16,6 @@ public class DownloadBusybox extends ParallelTask { private static final String BUSYBOX_ARM = "https://github.com/topjohnwu/ndk-busybox/releases/download/1.27.1/busybox-arm"; private static final String BUSYBOX_X86 = "https://github.com/topjohnwu/ndk-busybox/releases/download/1.27.1/busybox-x86"; - private static final String BUSYBOXPATH = "/dev/magisk/bin"; private File busybox; @@ -24,47 +24,39 @@ public class DownloadBusybox extends ParallelTask { busybox = new File(context.getCacheDir(), "busybox"); } - @Override - protected void onPreExecute() { - getShell().su_raw("export PATH=" + BUSYBOXPATH + ":$PATH"); - } - @Override protected Void doInBackground(Void... voids) { Context context = getMagiskManager(); - if (!Utils.itemExist(getShell(), BUSYBOXPATH + "/busybox")) { - if (!busybox.exists() && Utils.checkNetworkStatus(context)) { - Utils.removeItem(getShell(), context.getApplicationInfo().dataDir + "/busybox"); - try { - FileOutputStream out = new FileOutputStream(busybox); - InputStream in = WebService.request(WebService.GET, - Build.SUPPORTED_32_BIT_ABIS[0].contains("x86") ? - BUSYBOX_X86 : - BUSYBOX_ARM, - null - ); - if (in == null) throw new IOException(); - byte[] buffer = new byte[4096]; - int read; - while ((read = in.read(buffer)) != -1) { - out.write(buffer, 0, read); - } - out.close(); - in.close(); + Utils.removeItem(getShell(), context.getApplicationInfo().dataDir + "/busybox"); + try { + FileOutputStream out = new FileOutputStream(busybox); + InputStream in = WebService.request(WebService.GET, + Build.SUPPORTED_32_BIT_ABIS[0].contains("x86") ? + BUSYBOX_X86 : + BUSYBOX_ARM, + null + ); + if (in == null) throw new IOException(); + byte[] buffer = new byte[4096]; + int read; + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + out.close(); + in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (busybox.exists()) { - getShell().su_raw( - "rm -rf " + BUSYBOXPATH, - "mkdir -p " + BUSYBOXPATH, - "cp " + busybox + " " + BUSYBOXPATH, - "chmod -R 755 " + BUSYBOXPATH, - BUSYBOXPATH + "/busybox --install -s " + BUSYBOXPATH - ); - } + } catch (IOException e) { + e.printStackTrace(); + } + if (busybox.exists()) { + getShell().su_raw( + "rm -rf " + MagiskManager.BUSYBOXPATH, + "mkdir -p " + MagiskManager.BUSYBOXPATH, + "cp " + busybox + " " + MagiskManager.BUSYBOXPATH, + "chmod -R 755 " + MagiskManager.BUSYBOXPATH, + MagiskManager.BUSYBOXPATH + "/busybox --install -s " + MagiskManager.BUSYBOXPATH + ); + busybox.delete(); } return null; } 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 be5bd9069..bef4375ae 100644 --- a/app/src/main/java/com/topjohnwu/magisk/asyncs/ParallelTask.java +++ b/app/src/main/java/com/topjohnwu/magisk/asyncs/ParallelTask.java @@ -42,8 +42,9 @@ public abstract class ParallelTask extends AsyncTask

exec(Params... params) { executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); + return this; } @Override