diff --git a/app/build.gradle b/app/build.gradle index b6248af..65063fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,19 +1,15 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 30 + compileSdkVersion rootProject.ext.androidCompileSdkVersion defaultConfig { - applicationId "com.storm.wind.xposed" - minSdkVersion 27 - targetSdkVersion 28 - versionCode version_code as Integer - versionName version_name + applicationId "org.lsposed.lspatch" + minSdkVersion rootProject.ext.androidMinSdkVersion + targetSdkVersion rootProject.ext.androidTargetSdkVersion + versionCode rootProject.ext.verCode + versionName rootProject.ext.verName multiDexEnabled false - - ndk { - abiFilters 'armeabi-v7a', 'arm64-v8a' - } } buildTypes { debug { @@ -65,6 +61,5 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation("androidx.core:core:1.3.2") implementation project(path: ':lspcore') } diff --git a/app/src/main/java/com/storm/wind/xposed/MainActivity.java b/app/src/main/java/com/storm/wind/xposed/MainActivity.java index d607b65..30c9151 100644 --- a/app/src/main/java/com/storm/wind/xposed/MainActivity.java +++ b/app/src/main/java/com/storm/wind/xposed/MainActivity.java @@ -1,41 +1,23 @@ package com.storm.wind.xposed; -import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; -import android.content.pm.PackageManager; -import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.TextView; -import androidx.core.app.ActivityCompat; - import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; -//import android.support.v4.app.ActivityCompat; public class MainActivity extends Activity { - private static final int REQUEST_PERMISSION_CODE = 1; - private static String[] PERMISSIONS_STORAGE = { - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - }; - @SuppressLint("SetTextI18n") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE); - } - } - XposedHelpers.findAndHookMethod(this.getClass(), "checkXposed", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { diff --git a/app/src/main/java/com/wind/xposed/entry/MMPLoader.java b/app/src/main/java/com/wind/xposed/entry/MMPLoader.java index 4e52df2..9cffe1f 100644 --- a/app/src/main/java/com/wind/xposed/entry/MMPLoader.java +++ b/app/src/main/java/com/wind/xposed/entry/MMPLoader.java @@ -182,6 +182,7 @@ public class MMPLoader { boolean configFileExist = configFileExist(); + // todo: Android 11 for (PackageInfo pkg : pm.getInstalledPackages(PackageManager.GET_META_DATA)) { ApplicationInfo app = pkg.applicationInfo; if (!app.enabled) { @@ -228,7 +229,7 @@ public class MMPLoader { return modulePathList; } - // 从sd卡中加载指定文件,以加载指定的xposed module + // 从 sd 卡中加载指定文件,以加载指定的 xposed module private static List loadPackageNameListFromFile(boolean loadActivedPackages) { File moduleFile = new File(DIR_BASE, XPOSED_MODULE_FILE_PATH); if (!moduleFile.exists()) { @@ -236,11 +237,8 @@ public class MMPLoader { } List modulePackageList = new ArrayList<>(); - FileInputStream fileInputStream = null; - BufferedReader bufferedReader = null; - try { - fileInputStream = new FileInputStream(moduleFile); - bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); + try (FileInputStream fileInputStream = new FileInputStream(moduleFile); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream))) { String modulePackageName; while ((modulePackageName = bufferedReader.readLine()) != null) { modulePackageName = modulePackageName.trim(); @@ -263,10 +261,6 @@ public class MMPLoader { e.printStackTrace(); return null; } - finally { - closeStream(fileInputStream); - closeStream(bufferedReader); - } return modulePackageList; } @@ -282,12 +276,8 @@ public class MMPLoader { throw new IllegalStateException("create " + XPOSED_MODULE_FILE_PATH + " err"); } } - FileOutputStream outputStream = null; - BufferedWriter writer = null; - try { - outputStream = new FileOutputStream(moduleFile, true); - writer = new BufferedWriter(new OutputStreamWriter(outputStream)); - + try (FileOutputStream outputStream = new FileOutputStream(moduleFile, true); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream))) { for (Pair packageInfo : packageNameList) { String packageName = packageInfo.first; String appName = packageInfo.second; @@ -300,10 +290,6 @@ public class MMPLoader { catch (Exception e) { e.printStackTrace(); } - finally { - closeStream(outputStream); - closeStream(writer); - } } private static boolean configFileExist() { diff --git a/app/src/main/java/com/wind/xposed/entry/util/FileUtils.java b/app/src/main/java/com/wind/xposed/entry/util/FileUtils.java index 0b23bfe..b0cbec9 100644 --- a/app/src/main/java/com/wind/xposed/entry/util/FileUtils.java +++ b/app/src/main/java/com/wind/xposed/entry/util/FileUtils.java @@ -21,15 +21,15 @@ public class FileUtils { public static boolean isSdcardPermissionGranted(Context context) { int pid = android.os.Process.myPid(); int uid = Process.myUid(); - return context.checkPermission(PERMISSIONS_STORAGE[0], pid, uid) == PackageManager.PERMISSION_GRANTED && context.checkPermission(PERMISSIONS_STORAGE[1], pid, uid) == PackageManager.PERMISSION_GRANTED; + return context.checkPermission(PERMISSIONS_STORAGE[0], pid, uid) == PackageManager.PERMISSION_GRANTED && context.checkPermission(PERMISSIONS_STORAGE[1], pid, + uid) == PackageManager.PERMISSION_GRANTED; } public static String readTextFromAssets(Context context, String assetsFileName) { if (context == null) { throw new IllegalStateException("context null"); } - try { - InputStream is = context.getAssets().open(assetsFileName); + try (InputStream is = context.getAssets().open(assetsFileName)) { return readTextFromInputStream(is); } catch (Exception e) { diff --git a/app/src/main/java/com/wind/xposed/entry/util/ReflectionApiCheck.java b/app/src/main/java/com/wind/xposed/entry/util/ReflectionApiCheck.java deleted file mode 100644 index 7dc9d63..0000000 --- a/app/src/main/java/com/wind/xposed/entry/util/ReflectionApiCheck.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.wind.xposed.entry.util; - -import static android.os.Build.VERSION.SDK_INT; - -import android.os.Build; -import android.util.Log; - -import java.lang.reflect.Method; - -/** - * @author Windysha - */ -public class ReflectionApiCheck { - - private static final String TAG = ReflectionApiCheck.class.getSimpleName(); - private static final int ERROR_EXEMPT_FAILED = -21; - private static Object sVmRuntime; - private static Method setHiddenApiExemptions; - - static { - if (SDK_INT >= Build.VERSION_CODES.P) { - try { - Method forName = Class.class.getDeclaredMethod("forName", String.class); - Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class); - - Class vmRuntimeClass = (Class) forName.invoke(null, "dalvik.system.VMRuntime"); - Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null); - if (getRuntime == null) { - throw new IllegalStateException("getRuntime method null"); - } - setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", new Class[]{String[].class}); - sVmRuntime = getRuntime.invoke(null); - } - catch (Throwable e) { - Log.e(TAG, "reflect bootstrap failed:", e); - } - } - } - - public static int unseal() { - if (SDK_INT < 28) { - // Below Android P, ignore - return 0; - } - - // try exempt API first. - if (exemptAll()) { - return 0; - } - else { - return ERROR_EXEMPT_FAILED; - } - } - - /** - * make the method exempted from hidden API check. - * - * @param method the method signature prefix. - * @return true if success. - */ - public static boolean exempt(String method) { - return exempt(new String[]{method}); - } - - /** - * make specific methods exempted from hidden API check. - * - * @param methods the method signature prefix, such as "Ldalvik/system", "Landroid" or even "L" - * @return true if success - */ - public static boolean exempt(String... methods) { - if (sVmRuntime == null || setHiddenApiExemptions == null) { - return false; - } - - try { - setHiddenApiExemptions.invoke(sVmRuntime, new Object[]{methods}); - return true; - } - catch (Throwable e) { - return false; - } - } - - /** - * Make all hidden API exempted. - * - * @return true if success. - */ - public static boolean exemptAll() { - return exempt(new String[]{"L"}); - } -} diff --git a/app/src/main/java/com/wind/xposed/entry/util/XpatchUtils.java b/app/src/main/java/com/wind/xposed/entry/util/XpatchUtils.java index cc8683f..8900eec 100644 --- a/app/src/main/java/com/wind/xposed/entry/util/XpatchUtils.java +++ b/app/src/main/java/com/wind/xposed/entry/util/XpatchUtils.java @@ -10,7 +10,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class XpatchUtils { - final static String TAG = "MMP" + XpatchUtils.class.getSimpleName(); + final static String TAG = "LSP" + XpatchUtils.class.getSimpleName(); public static Context createAppContext() { try { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index deafab4..dff33c0 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,8 +7,8 @@ \ No newline at end of file diff --git a/build.gradle b/build.gradle index 3dbf6b7..ac4c6cc 100644 --- a/build.gradle +++ b/build.gradle @@ -9,20 +9,21 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:7.0.0-alpha14' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.30" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32" } } +// sync from https://github.com/LSPosed/LSPosed/blob/master/build.gradle.kts ext { androidCompileSdkVersion = 30 androidCompileNdkVersion = "22.1.7171670" androidBuildToolsVersion = "30.0.3" androidMinSdkVersion = 27 - androidTargetSdkVersion = 28 + androidTargetSdkVersion = 30 verCode = 1 - verName = "mmpatch" + verName = "lspatch" apiCode = 93 - defaultManagerPackageName = "org.github.mmpatch" + defaultManagerPackageName = "org.lsposed.lspatch" androidSourceCompatibility = JavaVersion.VERSION_11 androidTargetCompatibility = JavaVersion.VERSION_11 zipPathMagiskReleasePath = project(":lspcore").projectDir.path + "/build/tmp/release/magisk/" diff --git a/settings.gradle b/settings.gradle index 79f0fa0..5dc23fc 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,5 @@ include ':app' -rootProject.name='MMPLoader' +rootProject.name='LSPatch' include ':lspcore' project(':lspcore').projectDir = new File('mmp/core') include ':hiddenapi-stubs'