diff --git a/app/build.gradle b/app/build.gradle index f331330b..cc2eaa40 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,11 +66,9 @@ dependencies { implementation "androidx.recyclerview:recyclerview:1.1.0" implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'com.github.bumptech.glide:glide:4.11.0' - implementation "com.github.topjohnwu.libsu:core:2.5.1" implementation 'com.google.android.material:material:1.2.1' implementation 'com.takisoft.preferencex:preferencex:1.1.0' implementation 'com.takisoft.preferencex:preferencex-colorpicker:1.1.0' - implementation "rikka.shizuku:api:11.0.1" implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2' implementation 'me.zhanghai.android.appiconloader:appiconloader-glide:1.2.0' implementation 'me.zhanghai.android.fastscroll:library:1.1.5' diff --git a/app/src/main/java/io/github/lsposed/manager/App.java b/app/src/main/java/io/github/lsposed/manager/App.java index ebe32327..39642c5f 100644 --- a/app/src/main/java/io/github/lsposed/manager/App.java +++ b/app/src/main/java/io/github/lsposed/manager/App.java @@ -4,8 +4,6 @@ import android.annotation.SuppressLint; import android.app.Application; import android.content.Intent; import android.content.SharedPreferences; -import android.os.Handler; -import android.os.Looper; import androidx.preference.PreferenceManager; @@ -13,61 +11,18 @@ import java.io.PrintWriter; import java.io.StringWriter; import io.github.lsposed.manager.ui.activity.CrashReportActivity; -import io.github.lsposed.manager.util.CompileUtil; import io.github.lsposed.manager.util.NotificationUtil; -import rikka.shizuku.Shizuku; -import rikka.sui.Sui; - -import static android.content.pm.PackageManager.PERMISSION_GRANTED; public class App extends Application { public static final String TAG = "LSPosedManager"; @SuppressLint("StaticFieldLeak") private static App instance = null; - private static Thread uiThread; - private static Handler mainHandler; private SharedPreferences pref; - private final Shizuku.OnRequestPermissionResultListener REQUEST_PERMISSION_RESULT_LISTENER = this::onRequestPermissionsResult; - - static { - Sui.init(BuildConfig.APPLICATION_ID); - } - - private void onRequestPermissionsResult(int requestCode, int grantResult) { - CompileUtil.onRequestPermissionsResult(requestCode, grantResult); - } - - public static int checkPermission(int code) { - try { - if (!Shizuku.isPreV11() && Shizuku.getVersion() >= 11) { - if (Shizuku.checkSelfPermission() == PERMISSION_GRANTED) { - return 0; - } else if (Shizuku.shouldShowRequestPermissionRationale()) { - return -1; - } else { - Shizuku.requestPermission(code); - return -1; - } - } - } catch (Throwable e) { - e.printStackTrace(); - } - return -2; - } - public static App getInstance() { return instance; } - public static void runOnUiThread(Runnable action) { - if (Thread.currentThread() != uiThread) { - mainHandler.post(action); - } else { - action.run(); - } - } - public static SharedPreferences getPreferences() { return instance.pref; } @@ -104,13 +59,9 @@ public class App extends Application { } instance = this; - uiThread = Thread.currentThread(); - mainHandler = new Handler(Looper.getMainLooper()); pref = PreferenceManager.getDefaultSharedPreferences(this); NotificationUtil.init(); - - Shizuku.addRequestPermissionResultListener(REQUEST_PERMISSION_RESULT_LISTENER); } } diff --git a/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java index 75c481df..75bcfb2b 100644 --- a/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/io/github/lsposed/manager/adapters/ScopeAdapter.java @@ -47,8 +47,8 @@ import java.util.List; import io.github.lsposed.manager.App; import io.github.lsposed.manager.R; import io.github.lsposed.manager.ui.activity.AppListActivity; +import io.github.lsposed.manager.ui.fragment.CompileDialogFragment; import io.github.lsposed.manager.ui.widget.MasterSwitch; -import io.github.lsposed.manager.util.CompileUtil; import io.github.lsposed.manager.util.GlideApp; import io.github.lsposed.manager.util.ModuleUtil; @@ -247,8 +247,8 @@ public class ScopeAdapter extends RecyclerView.Adapter if (launchIntent != null) { activity.startActivity(launchIntent); } - } else if (itemId == R.id.app_menu_compile_reset) { - CompileUtil.reset(activity, activity.getSupportFragmentManager(), info); + } else if (itemId == R.id.app_menu_compile_speed) { + CompileDialogFragment.speed(activity, activity.getSupportFragmentManager(), info); } else if (itemId == R.id.app_menu_store) { Uri uri = Uri.parse("market://details?id=" + info.packageName); Intent intent = new Intent(Intent.ACTION_VIEW, uri); @@ -352,7 +352,7 @@ public class ScopeAdapter extends RecyclerView.Adapter menu.removeItem(R.id.app_menu_launch); } if (android) { - menu.removeItem(R.id.app_menu_compile_reset); + menu.removeItem(R.id.app_menu_compile_speed); menu.removeItem(R.id.app_menu_store); } }); diff --git a/app/src/main/java/io/github/lsposed/manager/ui/fragment/CompileDialogFragment.java b/app/src/main/java/io/github/lsposed/manager/ui/fragment/CompileDialogFragment.java index 4fb007dc..8967a3c6 100644 --- a/app/src/main/java/io/github/lsposed/manager/ui/fragment/CompileDialogFragment.java +++ b/app/src/main/java/io/github/lsposed/manager/ui/fragment/CompileDialogFragment.java @@ -12,50 +12,40 @@ import android.view.LayoutInflater; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.FragmentManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.topjohnwu.superuser.Shell; +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; import io.github.lsposed.manager.App; import io.github.lsposed.manager.R; import io.github.lsposed.manager.databinding.FragmentCompileDialogBinding; -import io.github.lsposed.manager.util.CompileUtil; import io.github.lsposed.manager.util.ToastUtil; -import rikka.shizuku.ShizukuSystemProperties; - -import static android.content.pm.PackageManager.PERMISSION_DENIED; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; @SuppressWarnings("deprecation") public class CompileDialogFragment extends AppCompatDialogFragment { // TODO: - private static final String COMPILE_COMMAND_PREFIX = "cmd package "; - private static final String COMPILE_RESET_COMMAND = COMPILE_COMMAND_PREFIX + "compile --reset "; + private static final String[] COMPILE_RESET_COMMAND = new String[]{"cmd", "package", "compile", "-f", "-m", "speed", ""}; private static final String KEY_APP_INFO = "app_info"; private static final String KEY_MSG = "msg"; - private static final String KEY_TYPE = "type"; private ApplicationInfo appInfo; - public CompileDialogFragment() { } - public static CompileDialogFragment newInstance(ApplicationInfo appInfo, - String msg, CompileUtil.CompileType type) { + public static void speed(Context context, FragmentManager fragmentManager, ApplicationInfo info) { Bundle arguments = new Bundle(); - arguments.putParcelable(KEY_APP_INFO, appInfo); - arguments.putString(KEY_MSG, msg); - arguments.putInt(KEY_TYPE, type.ordinal()); + arguments.putParcelable(KEY_APP_INFO, info); + arguments.putString(KEY_MSG, context.getString(R.string.compile_speed_msg)); CompileDialogFragment fragment = new CompileDialogFragment(); fragment.setArguments(arguments); fragment.setCancelable(false); - return fragment; + fragment.show(fragmentManager, "compile_dialog"); } @Override @@ -83,66 +73,14 @@ public class CompileDialogFragment extends AppCompatDialogFragment { return alertDialog; } - public void onRequestPermissionsResult(int requestCode, int grantResult) { - CompileUtil.CompileType mode = CompileUtil.CompileType.values()[requestCode]; - if (grantResult == PERMISSION_GRANTED) { - AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { - try { - boolean checkProfiles = ShizukuSystemProperties.getBoolean("dalvik.vm.usejitprofiles", false); - if (mode == CompileUtil.CompileType.RESET) { - CompileUtil.PACKAGE_MANAGER.get().clearApplicationProfileData(appInfo.packageName); - String filter = ShizukuSystemProperties.get("pm.dexopt.install"); - CompileUtil.PACKAGE_MANAGER.get().performDexOptMode(appInfo.packageName, checkProfiles, filter, true, true, null); - } - App.runOnUiThread(() -> { - ToastUtil.showLongToast(App.getInstance(), R.string.done); - try { - dismissAllowingStateLoss(); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } catch (Throwable t) { - t.printStackTrace(); - compileWithShell(mode); - } - }); - } else { - compileWithShell(mode); - } - } - @Override public void onAttach(@NonNull Context context) { super.onAttach(context); Bundle arguments = getArguments(); if (arguments != null) { - int type = arguments.getInt(KEY_TYPE); appInfo = arguments.getParcelable(KEY_APP_INFO); - int result = App.checkPermission(type); - switch (result) { - case 0: - onRequestPermissionsResult(type, PERMISSION_GRANTED); - break; - case -2: - onRequestPermissionsResult(type, PERMISSION_DENIED); - break; - } - } else { - try { - dismissAllowingStateLoss(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private void compileWithShell(CompileUtil.CompileType type) { - String command = null; - if (type == CompileUtil.CompileType.RESET) { - command = COMPILE_RESET_COMMAND + appInfo.packageName; - } - if (command != null) { + String[] command = COMPILE_RESET_COMMAND; + command[6] = appInfo.packageName; new CompileTask(this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, command); } else { try { @@ -164,18 +102,37 @@ public class CompileDialogFragment extends AppCompatDialogFragment { @Override protected String doInBackground(String... commands) { if (outerRef.get() == null) { - return App.getInstance().getString(R.string.compile_failed); + return ""; } - // Also get STDERR - List stdout = new ArrayList<>(); - List stderr = new ArrayList<>(); - Shell.Result result = Shell.su(commands).to(stdout, stderr).exec(); - if (stderr.size() > 0) { - return "Error: " + TextUtils.join("\n", stderr); - } else if (!result.isSuccess()) { // they might don't write to stderr - return "Error: " + TextUtils.join("\n", stdout); - } else { - return TextUtils.join("\n", stdout); + try { + Process process = Runtime.getRuntime().exec(commands); + BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); + int read; + char[] buffer = new char[4096]; + StringBuilder err = new StringBuilder(); + while ((read = errorReader.read(buffer)) > 0) { + err.append(buffer, 0, read); + } + StringBuilder input = new StringBuilder(); + while ((read = inputReader.read(buffer)) > 0) { + input.append(buffer, 0, read); + } + errorReader.close(); + inputReader.close(); + process.waitFor(); + String result = ""; + if (process.exitValue() != 0) { + result = "Error "; + } + if (TextUtils.isEmpty(err)) { + return result + input.toString(); + } else { + return result + err.toString(); + } + } catch (Exception e) { + e.printStackTrace(); + return "Error " + e.getCause(); } } diff --git a/app/src/main/java/io/github/lsposed/manager/util/CompileUtil.java b/app/src/main/java/io/github/lsposed/manager/util/CompileUtil.java deleted file mode 100644 index 6d485fcb..00000000 --- a/app/src/main/java/io/github/lsposed/manager/util/CompileUtil.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.github.lsposed.manager.util; - -import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageManager; - -import androidx.fragment.app.FragmentManager; - -import io.github.lsposed.manager.R; -import io.github.lsposed.manager.ui.fragment.CompileDialogFragment; -import rikka.shizuku.ShizukuBinderWrapper; -import rikka.shizuku.SystemServiceHelper; - -public class CompileUtil { - // TODO: - - public enum CompileType { - RESET; - - @Override - public String toString() { - return super.toString().toLowerCase(); - } - } - - private static CompileDialogFragment instance; - - private static final String TAG_COMPILE_DIALOG = "compile_dialog"; - - public static final Singleton PACKAGE_MANAGER = new Singleton() { - @Override - protected IPackageManager create() { - return IPackageManager.Stub.asInterface(new ShizukuBinderWrapper(SystemServiceHelper.getSystemService("package"))); - } - }; - - public static void onRequestPermissionsResult(int requestCode, int grantResult) { - if (instance != null) { - instance.onRequestPermissionsResult(requestCode, grantResult); - } - } - - public static void reset(Context context, FragmentManager fragmentManager, - ApplicationInfo info) { - compilePackageInBg(fragmentManager, info, - context.getString(R.string.compile_reset_msg)); - } - - private static void compilePackageInBg(FragmentManager fragmentManager, - ApplicationInfo info, String msg) { - instance = CompileDialogFragment.newInstance(info, msg, CompileType.RESET); - instance.show(fragmentManager, TAG_COMPILE_DIALOG); - } - -} diff --git a/app/src/main/res/menu/menu_app_item.xml b/app/src/main/res/menu/menu_app_item.xml index 50981d9a..07751e70 100644 --- a/app/src/main/res/menu/menu_app_item.xml +++ b/app/src/main/res/menu/menu_app_item.xml @@ -4,8 +4,8 @@ android:id="@+id/app_menu_launch" android:title="@string/app_launch" /> + android:id="@+id/app_menu_compile_speed" + android:title="@string/compile_speed" /> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5042e655..279a6f5d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -82,8 +82,6 @@ 此处仅显示 LSPosed 及模块相关日志信息\n如果您想抓取系统日志, 可以尝试我们的 Log Catcher Magisk 模块 - 取消优化 - 清除中… 优化中… 完成! @@ -132,6 +130,7 @@ 由于未选择任何应用,模块 %s 已被禁用。 系统框架 此应用程序已被损坏,请确保您从官方来源下载该应用程序。 + 重新优化 <b>警告:<\/b>SELinux 未处于严格模式!对此进行攻击的恶意程序可以完全控制你的设备,并可能造成你的财产损失和法律责任。 SELinux 未处于严格模式! diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 770f3f61..f4c6abec 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -81,8 +81,6 @@ 此處僅顯示 LSPosed 及模塊相關日誌信息\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模塊 - 取消優化 - 清除中… 優化中… 完成! diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 724a1146..e7335176 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -81,8 +81,6 @@ 此處僅顯示 LSPosed 及模組相關日誌資訊\n如果您想抓取系統日誌, 可以嘗試我們的 Log Catcher Magisk 模組 - 取消優化 - 清除中… 優化中… 完成! diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2917aeef..c07d5546 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,8 +89,6 @@ Done! - De-optimize - Resetting … Optimizing … https://github.com/LSPosed/LSPosed/ @@ -139,6 +137,7 @@ Module %s has been disabled since no app selected. System Framework This application has been destroyed, please make sure you download it from the official source. + Re-optimize <b>WARNING:<\/b> SELinux is not enforcing! the malicious program that attacks this can completely control your device and may cause your property damage and legal liability. SELinux is not enforcing!