From 183dccde17e8778e960dcbf024aae1364ceecee3 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Sat, 13 Feb 2021 23:52:21 +0800 Subject: [PATCH] [core] Implement get all installed packages from all users --- .gitmodules | 3 + app/build.gradle | 2 +- .../receivers/LSPosedServiceClient.java | 45 +- core/build.gradle | 3 +- .../main/java/android/app/package-info.java | 24 - .../android/content/res/XModuleResources.java | 4 +- .../android/content/res/package-info.java | 24 - .../lspd/hooker/XposedInstallerHooker.java | 8 +- .../lsposed/lspd/service/BridgeService.java | 39 +- .../lsposed/lspd/service/LSPosedService.java | 14 +- .../lsposed/lspd/service/PackageReceiver.java | 43 +- .../lsposed/lspd/service/PackageService.java | 62 ++ .../lsposed/lspd/service/SystemService.java | 4 + .../lsposed/lspd/service/UserService.java | 40 ++ gradle/wrapper/gradle-wrapper.properties | 4 +- hiddenapi-bridge/.gitignore | 1 + hiddenapi-bridge/build.gradle | 5 + .../src/main/java/hidden/HiddenApiBridge.java | 52 ++ hiddenapi-stubs/build.gradle | 7 +- .../main/java/android/annotation/NonNull.java | 38 ++ .../java/android/annotation/Nullable.java | 44 ++ .../main/java/android/app/Application.java | 4 + .../main/java/android/app/ContextImpl.java | 544 ------------------ .../java/android/content/ComponentName.java | 4 + .../main/java/android/content/Context.java | 4 + .../android/content/pm/ApplicationInfo.java | 4 + .../content/pm/BaseParceledListSlice.java | 10 + .../android/content/pm/IPackageManager.java | 55 ++ .../java/android/content/pm/PackageInfo.java | 6 + .../android/content/pm/PackageManager.java | 10 + .../android/content/pm/ParceledListSlice.java | 4 + .../java/android/content/pm/UserInfo.java | 5 + .../content/res/CompatibilityInfo.java | 11 - .../android/content/res/Configuration.java | 4 + .../java/android/content/res/Resources.java | 191 ------ .../java/android/content/res/TypedArray.java | 170 +++--- .../src/main/java/android/graphics/Movie.java | 4 + .../android/graphics/drawable/Drawable.java | 4 + .../src/main/java/android/os/Binder.java | 58 ++ .../src/main/java/android/os/IBinder.java | 33 ++ .../src/main/java/android/os/IInterface.java | 6 + .../main/java/android/os/IUserManager.java | 28 + .../src/main/java/android/os/Parcel.java | 4 + .../src/main/java/android/os/Parcelable.java | 4 + .../main/java/android/os/RemoteException.java | 8 + .../main/java/android/os/ServiceManager.java | 29 +- .../src/main/java/android/os/UserHandle.java | 12 + .../src/main/java/android/os/UserManager.java | 11 + .../java/android/util/DisplayMetrics.java | 4 + .../main/java/android/util/TypedValue.java | 4 + .../java/androidx/annotation/IntRange.java | 51 ++ .../java/androidx/annotation/RequiresApi.java | 51 ++ .../xmlpull/v1/XmlPullParserException.java | 4 + service | 1 + service/.gitignore | 1 - service/build.gradle | 21 - service/proguard-rules.pro | 21 - service/src/main/AndroidManifest.xml | 5 - .../lsposed/lspd/service/ILSPosedService.aidl | 5 - settings.gradle | 7 +- 60 files changed, 808 insertions(+), 1060 deletions(-) delete mode 100644 core/src/main/java/android/app/package-info.java delete mode 100644 core/src/main/java/android/content/res/package-info.java create mode 100644 core/src/main/java/io/github/lsposed/lspd/service/PackageService.java create mode 100644 core/src/main/java/io/github/lsposed/lspd/service/SystemService.java create mode 100644 core/src/main/java/io/github/lsposed/lspd/service/UserService.java create mode 100644 hiddenapi-bridge/.gitignore create mode 100644 hiddenapi-bridge/build.gradle create mode 100644 hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java create mode 100644 hiddenapi-stubs/src/main/java/android/annotation/NonNull.java create mode 100644 hiddenapi-stubs/src/main/java/android/annotation/Nullable.java create mode 100644 hiddenapi-stubs/src/main/java/android/app/Application.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/ComponentName.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/Context.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/pm/ApplicationInfo.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/pm/BaseParceledListSlice.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/pm/IPackageManager.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/pm/PackageInfo.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/pm/PackageManager.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/pm/ParceledListSlice.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java create mode 100644 hiddenapi-stubs/src/main/java/android/content/res/Configuration.java create mode 100644 hiddenapi-stubs/src/main/java/android/graphics/Movie.java create mode 100644 hiddenapi-stubs/src/main/java/android/graphics/drawable/Drawable.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/Binder.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/IBinder.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/IInterface.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/IUserManager.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/Parcel.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/Parcelable.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/RemoteException.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/UserHandle.java create mode 100644 hiddenapi-stubs/src/main/java/android/os/UserManager.java create mode 100644 hiddenapi-stubs/src/main/java/android/util/DisplayMetrics.java create mode 100644 hiddenapi-stubs/src/main/java/android/util/TypedValue.java create mode 100644 hiddenapi-stubs/src/main/java/androidx/annotation/IntRange.java create mode 100644 hiddenapi-stubs/src/main/java/androidx/annotation/RequiresApi.java create mode 100644 hiddenapi-stubs/src/main/java/org/xmlpull/v1/XmlPullParserException.java create mode 160000 service delete mode 100644 service/.gitignore delete mode 100644 service/build.gradle delete mode 100644 service/proguard-rules.pro delete mode 100644 service/src/main/AndroidManifest.xml delete mode 100644 service/src/main/aidl/io/github/lsposed/lspd/service/ILSPosedService.aidl diff --git a/.gitmodules b/.gitmodules index 41adb223..24e26c12 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "core/src/main/cpp/external/Dobby"] path = core/src/main/cpp/external/Dobby url = https://github.com/jmpews/Dobby.git +[submodule "service"] + path = service + url = https://github.com/Xposed-Modules-Repo/XposedService.git diff --git a/app/build.gradle b/app/build.gradle index acb280cd..e4a971bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -144,7 +144,7 @@ dependencies { implementation 'me.zhanghai.android.fastscroll:library:1.1.5' implementation files('libs/WeatherView-2.0.3.aar') compileOnly project(":hiddenapi-stubs") - implementation project(path: ':service') + implementation project(":service") } configurations { diff --git a/app/src/main/java/io/github/lsposed/manager/receivers/LSPosedServiceClient.java b/app/src/main/java/io/github/lsposed/manager/receivers/LSPosedServiceClient.java index 3023bd8f..5cf734f7 100644 --- a/app/src/main/java/io/github/lsposed/manager/receivers/LSPosedServiceClient.java +++ b/app/src/main/java/io/github/lsposed/manager/receivers/LSPosedServiceClient.java @@ -1,45 +1,20 @@ package io.github.lsposed.manager.receivers; -import android.os.IBinder; +import android.content.pm.PackageInfo; import android.os.RemoteException; import android.util.Log; +import java.util.List; + import io.github.lsposed.manager.App; -import io.github.lsposed.lspd.service.ILSPosedService; +import io.github.xposed.xposedservice.XposedService; public class LSPosedServiceClient { - public static IBinder binder = null; - public static ILSPosedService service = null; - - private static final IBinder.DeathRecipient DEATH_RECIPIENT = () -> { - binder = null; - service = null; - }; - - public static IBinder getBinder() { - try { - Log.e(App.TAG, "Cannot get binder"); - } catch (Throwable ignored) { - } - return null; - } public static void testBinder() { - if (binder == null && service == null) { - binder = getBinder(); - } - if (binder == null) { - return; - } - - try { - binder.linkToDeath(DEATH_RECIPIENT, 0); - } catch (Throwable e) { - e.printStackTrace(); - } - - service = ILSPosedService.Stub.asInterface(binder); + XposedService service = XposedService.getService(); if (service == null) { + Log.e(App.TAG, "Version fail"); return; } int ver = -1; @@ -49,5 +24,13 @@ public class LSPosedServiceClient { e.printStackTrace(); } Log.i(App.TAG, "Got version " + ver); + + List ps = null; + try { + ps = service.getInstalledPackagesFromAllUsers(0); + } catch (RemoteException e) { + e.printStackTrace(); + } + Log.i(App.TAG, String.valueOf(ps)); } } diff --git a/core/build.gradle b/core/build.gradle index 16e1b4d5..76c1b2f1 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -58,10 +58,11 @@ dependencies { implementation 'rikka.ndk:riru:10' implementation 'com.android.tools.build:apksig:4.1.2' implementation project(path: ':sandhook-hooklib') - implementation project(path: ':service') compileOnly project(':hiddenapi-stubs') compileOnly project(':key-selector') compileOnly 'androidx.annotation:annotation:1.1.0' + implementation project(':interface') + implementation project(':hiddenapi-bridge') } android { diff --git a/core/src/main/java/android/app/package-info.java b/core/src/main/java/android/app/package-info.java deleted file mode 100644 index 7160d7db..00000000 --- a/core/src/main/java/android/app/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is part of LSPosed. - * - * LSPosed is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * LSPosed is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with LSPosed. If not, see . - * - * Copyright (C) 2020 EdXposed Contributors - * Copyright (C) 2021 LSPosed Contributors - */ - -/** - * Contains {@link android.app.AndroidAppHelper} with various methods for information about the current app. - */ -package android.app; diff --git a/core/src/main/java/android/content/res/XModuleResources.java b/core/src/main/java/android/content/res/XModuleResources.java index 77bbf3e4..f4acd76c 100644 --- a/core/src/main/java/android/content/res/XModuleResources.java +++ b/core/src/main/java/android/content/res/XModuleResources.java @@ -28,6 +28,7 @@ import de.robv.android.xposed.IXposedHookZygoteInit; import de.robv.android.xposed.IXposedHookZygoteInit.StartupParam; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_InitPackageResources.InitPackageResourcesParam; +import hidden.HiddenApiBridge; /** * Provides access to resources from a certain path (usually the module's own path). @@ -54,8 +55,7 @@ public class XModuleResources extends Resources { throw new IllegalArgumentException("path must not be null"); AssetManager assets = new AssetManager(); - XposedHelpers.callMethod(assets, "addAssetPath", path); - //assets.addAssetPath(path); + HiddenApiBridge.AssetManager_addAssetPath(assets, path); XModuleResources res; if (origRes != null) diff --git a/core/src/main/java/android/content/res/package-info.java b/core/src/main/java/android/content/res/package-info.java deleted file mode 100644 index 2489194b..00000000 --- a/core/src/main/java/android/content/res/package-info.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is part of LSPosed. - * - * LSPosed is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * LSPosed is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with LSPosed. If not, see . - * - * Copyright (C) 2020 EdXposed Contributors - * Copyright (C) 2021 LSPosed Contributors - */ - -/** - * Contains classes that are required for replacing resources. - */ -package android.content.res; diff --git a/core/src/main/java/io/github/lsposed/lspd/hooker/XposedInstallerHooker.java b/core/src/main/java/io/github/lsposed/lspd/hooker/XposedInstallerHooker.java index cd65744c..5fff575f 100644 --- a/core/src/main/java/io/github/lsposed/lspd/hooker/XposedInstallerHooker.java +++ b/core/src/main/java/io/github/lsposed/lspd/hooker/XposedInstallerHooker.java @@ -115,12 +115,8 @@ public class XposedInstallerHooker { return ConfigManager.getMiscPath(); } }); - XposedHelpers.findAndHookMethod("io.github.lsposed.manager.receivers.LSPosedServiceClient", classLoader, "getBinder", new XC_MethodReplacement(){ - @Override - protected Object replaceHookedMethod(MethodHookParam param) { - return BridgeService.requireBinder(); - } - }); + Class serviceClass = XposedHelpers.findClass("io.github.xposed.xposedservice.XposedService", classLoader); + XposedHelpers.setStaticObjectField(serviceClass, "serviceBinder", BridgeService.requireBinder()); Utils.logI("Hooked LSPosed Manager"); } catch (Throwable t) { diff --git a/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java b/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java index 01ef3597..389cdef9 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/BridgeService.java @@ -1,7 +1,5 @@ package io.github.lsposed.lspd.service; -import android.app.ActivityThread; -import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.os.IBinder; @@ -17,8 +15,9 @@ import java.lang.reflect.Field; import java.util.Map; import io.github.lsposed.lspd.nativebridge.ConfigManager; -import io.github.lsposed.lspd.util.Utils; +import io.github.xposed.xposedservice.IXposedService; +import static android.os.Binder.getCallingUid; import static io.github.lsposed.lspd.service.LSPosedService.TAG; public class BridgeService { @@ -30,7 +29,7 @@ public class BridgeService { private static final int ACTION_GET_BINDER = ACTION_SEND_BINDER + 1; private static IBinder serviceBinder = null; - private static ILSPosedService service = null; + private static IXposedService service = null; private static final IBinder.DeathRecipient BRIDGE_SERVICE_DEATH_RECIPIENT = () -> { Log.i(TAG, "service " + SERVICE_NAME + " is dead. "); @@ -150,7 +149,7 @@ public class BridgeService { } serviceBinder = binder; - service = ILSPosedService.Stub.asInterface(serviceBinder); + service = IXposedService.Stub.asInterface(serviceBinder); try { serviceBinder.linkToDeath(LSPSERVICE_DEATH_RECIPIENT, 0); } catch (RemoteException ignored) { @@ -166,26 +165,10 @@ public class BridgeService { sendToBridge(false); } - public static ILSPosedService getService() { + public static IXposedService getService() { return service; } - private static PackageManager getPackageManager() { - if (pm != null) return pm; - ActivityThread activityThread = ActivityThread.currentActivityThread(); - if (activityThread == null) { - Utils.logW("ActivityThread is null"); - return null; - } - Context context = activityThread.getSystemContext(); - if (context == null) { - Utils.logW("context is null"); - return null; - } - pm = context.getPackageManager(); - return pm; - } - public static IBinder requireBinder() { IBinder binder = ServiceManager.getService(SERVICE_NAME); if (binder == null) return null; @@ -229,17 +212,11 @@ public class BridgeService { break; } case ACTION_GET_BINDER: { - String InstallerPackageName = ConfigManager.getInstallerPackageName(); - boolean isInstaller = false; - PackageManager pm = getPackageManager(); - if (pm == null) return false; - for (String pkg : pm.getPackagesForUid(Binder.getCallingUid())) { - isInstaller = isInstaller || InstallerPackageName.equals(pkg); - } - if (!isInstaller) { + try { + if (!PackageService.isInstaller(getCallingUid())) return false; + } catch (Throwable ignored) { return false; } - if (reply != null) { reply.writeNoException(); Log.d(TAG, "saved binder is " + serviceBinder.toString()); diff --git a/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java b/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java index 2562f440..4cbc35e7 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/LSPosedService.java @@ -1,14 +1,17 @@ package io.github.lsposed.lspd.service; -import android.os.Build; +import android.content.pm.PackageInfo; import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.util.Log; -import de.robv.android.xposed.XposedBridge; +import java.util.List; -public class LSPosedService extends ILSPosedService.Stub { +import de.robv.android.xposed.XposedBridge; +import io.github.xposed.xposedservice.IXposedService; + +public class LSPosedService extends IXposedService.Stub { public static final String TAG = "LSPosedService"; // call by ourselves @@ -50,4 +53,9 @@ public class LSPosedService extends ILSPosedService.Stub { public int getVersion() { return XposedBridge.getXposedVersion(); } + + @Override + public List getInstalledPackagesFromAllUsers(int flags) throws RemoteException { + return PackageService.getInstalledPackagesFromAllUsers(flags); + } } diff --git a/core/src/main/java/io/github/lsposed/lspd/service/PackageReceiver.java b/core/src/main/java/io/github/lsposed/lspd/service/PackageReceiver.java index eba4f7f4..418a4af9 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/PackageReceiver.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/PackageReceiver.java @@ -32,10 +32,8 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; -import android.os.IBinder; -import android.os.ServiceManager; +import android.os.RemoteException; import android.os.UserHandle; -import android.os.UserManager; import android.widget.Toast; import io.github.lsposed.lspd.nativebridge.ConfigManager; @@ -46,7 +44,6 @@ import java.io.PrintWriter; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Scanner; @@ -56,8 +53,6 @@ import de.robv.android.xposed.XposedHelpers; public class PackageReceiver { private static final BroadcastReceiver RECEIVER = new BroadcastReceiver() { - private PackageManager pm = null; - private final String MODULES_LIST_FILENAME = "conf/modules.list"; private final String ENABLED_MODULES_LIST_FILENAME = "conf/enabled_modules.list"; private final String MODULE_UPDATED = "io.github.lsposed.action.MODULE_UPDATED"; @@ -68,34 +63,15 @@ public class PackageReceiver { return (uri != null) ? uri.getSchemeSpecificPart() : null; } - private void getPackageManager() { - if (pm != null) return; - ActivityThread activityThread = ActivityThread.currentActivityThread(); - if (activityThread == null) { - Utils.logW("ActivityThread is null"); - return; - } - Context context = activityThread.getSystemContext(); - if (context == null) { - Utils.logW("context is null"); - return; - } - pm = context.getPackageManager(); - } private boolean isXposedModule(ApplicationInfo app) { return app != null && app.enabled && app.metaData != null && app.metaData.containsKey("xposedmodule"); } - private PackageInfo getPackageInfo(String packageName) { - getPackageManager(); - if (pm == null) { - Utils.logW("PM is null"); - return null; - } + private PackageInfo getPackageInfo(String packageName, int uid) { try { - return pm.getPackageInfo(packageName, PackageManager.GET_META_DATA); - } catch (PackageManager.NameNotFoundException e) { + return PackageService.getPackageInfo(packageName, PackageManager.GET_META_DATA, uid); + } catch (RemoteException e) { return null; } } @@ -108,7 +84,7 @@ public class PackageReceiver { Scanner scanner = new Scanner(enabledModules); while (scanner.hasNextLine()) { String packageName = scanner.nextLine(); - PackageInfo info = getPackageInfo(packageName); + PackageInfo info = getPackageInfo(packageName, 0); if (info != null && isXposedModule(info.applicationInfo)) result.put(packageName, info.applicationInfo.sourceDir); else if (info == null) @@ -189,17 +165,12 @@ public class PackageReceiver { } } - PackageInfo pkgInfo = getPackageInfo(packageName); + PackageInfo pkgInfo = getPackageInfo(packageName, intent.getIntExtra(Intent.EXTRA_USER, 0)); if (pkgInfo != null && !isXposedModule(pkgInfo.applicationInfo)) return; try { - UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); - @SuppressLint("DiscouragedPrivateApi") - Method m = UserManager.class.getDeclaredMethod("getUsers"); - m.setAccessible(true); - for (Object uh : (List) m.invoke(um)) { - int uid = (int) uh.getClass().getDeclaredField("id").get(uh); + for (int uid : UserService.getUsers()) { Utils.logI("updating uid: " + uid); boolean activated = updateModuleList(uid, packageName); UserHandle userHandle = null; diff --git a/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java b/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java new file mode 100644 index 00000000..678ff448 --- /dev/null +++ b/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java @@ -0,0 +1,62 @@ +package io.github.lsposed.lspd.service; + +import android.content.pm.IPackageManager; +import android.content.pm.PackageInfo; +import android.os.Binder; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +import io.github.lsposed.lspd.nativebridge.ConfigManager; + +public class PackageService { + private static IPackageManager pm = null; + private static IBinder binder = null; + + public static IPackageManager getPackageManager() { + if (binder == null && pm == null) { + binder = ServiceManager.getService("package"); + pm = IPackageManager.Stub.asInterface(binder); + } + return pm; + } + + public static PackageInfo getPackageInfo(String packageName, int flags, int uid) throws RemoteException { + pm = getPackageManager(); + if (pm == null) return null; + return pm.getPackageInfo(packageName, flags, uid); + } + + public static String[] getPackagesForUid(int uid) throws RemoteException { + pm = getPackageManager(); + if (pm == null) return new String[0]; + return pm.getPackagesForUid(uid); + } + + public static boolean isInstaller(int uid) throws RemoteException { + boolean res = false; + String InstallerPackageName = ConfigManager.getInstallerPackageName(); + for (String pkg : getPackagesForUid(uid)) { + res = res || InstallerPackageName.equals(pkg); + } + return res; + } + + public static List getInstalledPackagesFromAllUsers(int flags) throws RemoteException { + if (!isInstaller(Binder.getCallingUid())) { + throw new RemoteException("Permission denied"); + } + ArrayList res = new ArrayList<>(); + IPackageManager pm = getPackageManager(); + if (pm == null) return res; + for (int uid : UserService.getUsers()) { + Log.w("LSPosed", "uid: " + uid); + res.addAll(pm.getInstalledPackages(flags, uid).getList()); + } + return res; + } +} diff --git a/core/src/main/java/io/github/lsposed/lspd/service/SystemService.java b/core/src/main/java/io/github/lsposed/lspd/service/SystemService.java new file mode 100644 index 00000000..67c11a1a --- /dev/null +++ b/core/src/main/java/io/github/lsposed/lspd/service/SystemService.java @@ -0,0 +1,4 @@ +package io.github.lsposed.lspd.service; + +public class SystemService { +} diff --git a/core/src/main/java/io/github/lsposed/lspd/service/UserService.java b/core/src/main/java/io/github/lsposed/lspd/service/UserService.java new file mode 100644 index 00000000..0d5d2a6c --- /dev/null +++ b/core/src/main/java/io/github/lsposed/lspd/service/UserService.java @@ -0,0 +1,40 @@ +package io.github.lsposed.lspd.service; + +import android.content.pm.UserInfo; +import android.os.Build; +import android.os.IBinder; +import android.os.IUserManager; +import android.os.RemoteException; +import android.os.ServiceManager; + +import java.util.List; + +public class UserService { + private static IUserManager um = null; + private static IBinder binder = null; + + public static IUserManager getUserManager() { + if (binder == null && um == null) { + binder = ServiceManager.getService("user"); + um = IUserManager.Stub.asInterface(binder); + } + return um; + } + + public static int[] getUsers() throws RemoteException { + IUserManager um = getUserManager(); + if (um == null) return new int[0]; + List users; + if(Build.VERSION.SDK_INT >= 30) { + users = um.getUsers(true, true, true); + } else { + users = um.getUsers(true); + } + int[] userArray = new int[users.size()]; + for (int i = 0; i < users.size(); i++) { + UserInfo uh = users.get(i); + userArray[i] = uh.id; + } + return userArray; + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f107431a..d81afae6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jan 25 20:15:25 CST 2021 +#Wed Feb 10 17:44:10 CST 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip diff --git a/hiddenapi-bridge/.gitignore b/hiddenapi-bridge/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/hiddenapi-bridge/.gitignore @@ -0,0 +1 @@ +/build diff --git a/hiddenapi-bridge/build.gradle b/hiddenapi-bridge/build.gradle new file mode 100644 index 00000000..5c19efaa --- /dev/null +++ b/hiddenapi-bridge/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'java-library' + +dependencies { + compileOnly project(':hiddenapi-stubs') +} \ No newline at end of file diff --git a/hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java b/hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java new file mode 100644 index 00000000..499df31a --- /dev/null +++ b/hiddenapi-bridge/src/main/java/hidden/HiddenApiBridge.java @@ -0,0 +1,52 @@ +package hidden; + +//import android.annotation.NonNull; +//import android.app.ActivityThread; +//import android.content.pm.ApplicationInfo; +//import android.content.pm.PackageInfo; +//import android.content.pm.PackageManager; +//import android.os.UserHandle; +import android.annotation.NonNull; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.UserInfo; +import android.content.res.AssetManager; +import android.os.UserManager; + +import java.util.List; + +public class HiddenApiBridge { + public static int AssetManager_addAssetPath(AssetManager am, String path) { + return am.addAssetPath(path); + } + public static List UserManager_getUsers(UserManager um) { + return um.getUsers(); + } +// public static ApplicationInfo PackageManager_getApplicationInfoAsUser(PackageManager packageManager, @NonNull String packageName, int flags, int userId) throws android.content.pm.PackageManager.NameNotFoundException { +// return packageManager.getApplicationInfoAsUser(packageName, flags, userId); +// } +// +// public static PackageInfo PackageManager_getPackageInfoAsUser(PackageManager packageManager, @NonNull String packageName, int flags, int userId) throws android.content.pm.PackageManager.NameNotFoundException { +// return packageManager.getPackageInfoAsUser(packageName, flags, userId); +// } +// +// public static List PackageManager_getInstalledApplicationsAsUser(PackageManager packageManager, int flags, int userId) { +// return packageManager.getInstalledApplicationsAsUser(flags, userId); +// } +// + public static List PackageManager_getInstalledPackagesAsUser(PackageManager packageManager, int flags, int userId) { + return packageManager.getInstalledPackagesAsUser(flags, userId); + } +// +// public static UserHandle createUserHandle(int userId) { +// return new UserHandle(userId); +// } +// +// public static ActivityThread ActivityThread_systemMain() { +// return ActivityThread.systemMain(); +// } +// +// public static String PackageInfo_overlayTarget(PackageInfo packageInfo) { +// return packageInfo.overlayTarget; +// } +} diff --git a/hiddenapi-stubs/build.gradle b/hiddenapi-stubs/build.gradle index 6d88a709..9900fd60 100644 --- a/hiddenapi-stubs/build.gradle +++ b/hiddenapi-stubs/build.gradle @@ -1,6 +1 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion androidCompileSdkVersion.toInteger() - ndkVersion androidCompileNdkVersion -} +apply plugin: 'java-library' diff --git a/hiddenapi-stubs/src/main/java/android/annotation/NonNull.java b/hiddenapi-stubs/src/main/java/android/annotation/NonNull.java new file mode 100644 index 00000000..ef6d55ac --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/annotation/NonNull.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +/** + * Denotes that a parameter, field or method return value can never be null. + *

+ * This is a marker annotation and it has no specific attributes. + * + * @paramDoc This value must never be {@code null}. + * @returnDoc This value will never be {@code null}. + * @hide + */ +@Retention(SOURCE) +@Target({METHOD, PARAMETER, FIELD}) +public @interface NonNull { +} \ No newline at end of file diff --git a/hiddenapi-stubs/src/main/java/android/annotation/Nullable.java b/hiddenapi-stubs/src/main/java/android/annotation/Nullable.java new file mode 100644 index 00000000..daea2b80 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/annotation/Nullable.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +/** + * Denotes that a parameter, field or method return value can be null. + *

+ * When decorating a method call parameter, this denotes that the parameter can + * legitimately be null and the method will gracefully deal with it. Typically + * used on optional parameters. + *

+ * When decorating a method, this denotes the method might legitimately return + * null. + *

+ * This is a marker annotation and it has no specific attributes. + * + * @paramDoc This value may be {@code null}. + * @returnDoc This value may be {@code null}. + */ +@Retention(SOURCE) +@Target({METHOD, PARAMETER, FIELD}) +public @interface Nullable { +} diff --git a/hiddenapi-stubs/src/main/java/android/app/Application.java b/hiddenapi-stubs/src/main/java/android/app/Application.java new file mode 100644 index 00000000..a7fe902e --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/app/Application.java @@ -0,0 +1,4 @@ +package android.app; + +public class Application { +} diff --git a/hiddenapi-stubs/src/main/java/android/app/ContextImpl.java b/hiddenapi-stubs/src/main/java/android/app/ContextImpl.java index c16b3a59..12c44eaa 100644 --- a/hiddenapi-stubs/src/main/java/android/app/ContextImpl.java +++ b/hiddenapi-stubs/src/main/java/android/app/ContextImpl.java @@ -1,550 +1,6 @@ package android.app; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.ContentResolver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.IntentSender; -import android.content.ServiceConnection; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.res.AssetManager; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.database.DatabaseErrorHandler; -import android.database.sqlite.SQLiteDatabase; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.UserHandle; -import android.view.Display; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; public class ContextImpl extends Context { - @Override - public AssetManager getAssets() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Resources getResources() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public PackageManager getPackageManager() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public ContentResolver getContentResolver() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Looper getMainLooper() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Context getApplicationContext() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void setTheme(int resid) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Resources.Theme getTheme() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public ClassLoader getClassLoader() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public String getPackageName() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public ApplicationInfo getApplicationInfo() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public String getPackageResourcePath() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public String getPackageCodePath() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public SharedPreferences getSharedPreferences(String name, int mode) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean moveSharedPreferencesFrom(Context sourceContext, String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean deleteSharedPreferences(String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public FileInputStream openFileInput(String name) throws FileNotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean deleteFile(String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getFileStreamPath(String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getDataDir() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getFilesDir() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getNoBackupFilesDir() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getExternalFilesDir(String type) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File[] getExternalFilesDirs(String type) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getObbDir() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File[] getObbDirs() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getCacheDir() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getCodeCacheDir() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getExternalCacheDir() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File[] getExternalCacheDirs() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File[] getExternalMediaDirs() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public String[] fileList() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getDir(String name, int mode) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean moveDatabaseFrom(Context sourceContext, String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean deleteDatabase(String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public File getDatabasePath(String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public String[] databaseList() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Drawable getWallpaper() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Drawable peekWallpaper() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int getWallpaperDesiredMinimumWidth() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int getWallpaperDesiredMinimumHeight() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void setWallpaper(Bitmap bitmap) throws IOException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void setWallpaper(InputStream data) throws IOException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void clearWallpaper() throws IOException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void startActivity(Intent intent) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void startActivity(Intent intent, Bundle options) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void startActivities(Intent[] intents) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void startActivities(Intent[] intents, Bundle options) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags) throws IntentSender.SendIntentException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options) throws IntentSender.SendIntentException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendBroadcast(Intent intent) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendBroadcast(Intent intent, String receiverPermission) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendOrderedBroadcast(Intent intent, String receiverPermission) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendBroadcastAsUser(Intent intent, UserHandle user) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendStickyBroadcast(Intent intent) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void removeStickyBroadcast(Intent intent) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void unregisterReceiver(BroadcastReceiver receiver) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public ComponentName startService(Intent service) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public ComponentName startForegroundService(Intent service) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean stopService(Intent service) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean bindService(Intent service, ServiceConnection conn, int flags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void unbindService(ServiceConnection conn) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean startInstrumentation(ComponentName className, String profileFile, Bundle arguments) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Object getSystemService(String name) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public String getSystemServiceName(Class serviceClass) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkPermission(String permission, int pid, int uid) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkCallingPermission(String permission) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkCallingOrSelfPermission(String permission) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkSelfPermission(String permission) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void enforcePermission(String permission, int pid, int uid, String message) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void enforceCallingPermission(String permission, String message) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void enforceCallingOrSelfPermission(String permission, String message) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void grantUriPermission(String toPackage, Uri uri, int modeFlags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void revokeUriPermission(Uri uri, int modeFlags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void revokeUriPermission(String toPackage, Uri uri, int modeFlags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkCallingUriPermission(Uri uri, int modeFlags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public int checkUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void enforceCallingUriPermission(Uri uri, int modeFlags, String message) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void enforceUriPermission(Uri uri, String readPermission, String writePermission, int pid, int uid, int modeFlags, String message) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Context createPackageContext(String packageName, int flags) throws PackageManager.NameNotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Context createContextForSplit(String splitName) throws PackageManager.NameNotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Context createConfigurationContext(Configuration overrideConfiguration) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Context createDisplayContext(Display display) { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public Context createDeviceProtectedStorageContext() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public boolean isDeviceProtectedStorage() { - throw new UnsupportedOperationException("STUB"); - } } diff --git a/hiddenapi-stubs/src/main/java/android/content/ComponentName.java b/hiddenapi-stubs/src/main/java/android/content/ComponentName.java new file mode 100644 index 00000000..47ef5a70 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/ComponentName.java @@ -0,0 +1,4 @@ +package android.content; + +public final class ComponentName { +} diff --git a/hiddenapi-stubs/src/main/java/android/content/Context.java b/hiddenapi-stubs/src/main/java/android/content/Context.java new file mode 100644 index 00000000..565c977e --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/Context.java @@ -0,0 +1,4 @@ +package android.content; + +public class Context { +} diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/ApplicationInfo.java b/hiddenapi-stubs/src/main/java/android/content/pm/ApplicationInfo.java new file mode 100644 index 00000000..e0d81c50 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/pm/ApplicationInfo.java @@ -0,0 +1,4 @@ +package android.content.pm; + +public class ApplicationInfo { +} diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/BaseParceledListSlice.java b/hiddenapi-stubs/src/main/java/android/content/pm/BaseParceledListSlice.java new file mode 100644 index 00000000..d9af8b52 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/pm/BaseParceledListSlice.java @@ -0,0 +1,10 @@ +package android.content.pm; + +import java.util.List; + +abstract class BaseParceledListSlice { + + public List getList() { + throw new RuntimeException("STUB"); + } +} diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/IPackageManager.java b/hiddenapi-stubs/src/main/java/android/content/pm/IPackageManager.java new file mode 100644 index 00000000..1addb6a5 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/pm/IPackageManager.java @@ -0,0 +1,55 @@ +package android.content.pm; + +import android.os.Binder; +import android.os.IBinder; +import android.os.IInterface; +import android.os.RemoteException; + +public interface IPackageManager extends IInterface { + + ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) + throws RemoteException; + + PackageInfo getPackageInfo(String packageName, int flags, int userId) + throws RemoteException; + + int getPackageUid(String packageName, int userId) + throws RemoteException; + + String[] getPackagesForUid(int uid) + throws RemoteException; + + ParceledListSlice getInstalledPackages(int flags, int userId) + throws RemoteException; + + ParceledListSlice getInstalledApplications(int flags, int userId) + throws RemoteException; + + int getUidForSharedUser(String sharedUserName) + throws RemoteException; + + void grantRuntimePermission(String packageName, String permissionName, int userId) + throws RemoteException; + + void revokeRuntimePermission(String packageName, String permissionName, int userId) + throws RemoteException; + + int getPermissionFlags(String permissionName, String packageName, int userId) + throws RemoteException; + + void updatePermissionFlags(String permissionName, String packageName, int flagMask, int flagValues, int userId) + throws RemoteException; + + int checkPermission(String permName, String pkgName, int userId) + throws RemoteException; + + int checkUidPermission(String permName, int uid) + throws RemoteException; + + abstract class Stub extends Binder implements IPackageManager { + + public static IPackageManager asInterface(IBinder obj) { + throw new UnsupportedOperationException(); + } + } +} diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/PackageInfo.java b/hiddenapi-stubs/src/main/java/android/content/pm/PackageInfo.java new file mode 100644 index 00000000..f087c27c --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/pm/PackageInfo.java @@ -0,0 +1,6 @@ +package android.content.pm; + +public class PackageInfo { + + public String overlayTarget; +} diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/PackageManager.java b/hiddenapi-stubs/src/main/java/android/content/pm/PackageManager.java new file mode 100644 index 00000000..3d7e3a08 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/pm/PackageManager.java @@ -0,0 +1,10 @@ +package android.content.pm; + +import java.util.List; + +public class PackageManager { + public List getInstalledPackagesAsUser(int flags, int userId) { + throw new UnsupportedOperationException("STUB"); + } + +} diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/ParceledListSlice.java b/hiddenapi-stubs/src/main/java/android/content/pm/ParceledListSlice.java new file mode 100644 index 00000000..927754cc --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/pm/ParceledListSlice.java @@ -0,0 +1,4 @@ +package android.content.pm; + +public class ParceledListSlice extends BaseParceledListSlice { +} diff --git a/hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java b/hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java new file mode 100644 index 00000000..503920b5 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/pm/UserInfo.java @@ -0,0 +1,5 @@ +package android.content.pm; + +public class UserInfo { + public int id; +} diff --git a/hiddenapi-stubs/src/main/java/android/content/res/CompatibilityInfo.java b/hiddenapi-stubs/src/main/java/android/content/res/CompatibilityInfo.java index 64ef519e..cd5b2a17 100644 --- a/hiddenapi-stubs/src/main/java/android/content/res/CompatibilityInfo.java +++ b/hiddenapi-stubs/src/main/java/android/content/res/CompatibilityInfo.java @@ -4,15 +4,4 @@ import android.os.Parcel; import android.os.Parcelable; public class CompatibilityInfo implements Parcelable { - @Override - public int describeContents() { - throw new UnsupportedOperationException("STUB"); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - throw new UnsupportedOperationException("STUB"); - } - - public static final Parcelable.Creator CREATOR = null; } diff --git a/hiddenapi-stubs/src/main/java/android/content/res/Configuration.java b/hiddenapi-stubs/src/main/java/android/content/res/Configuration.java new file mode 100644 index 00000000..80e4df10 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/content/res/Configuration.java @@ -0,0 +1,4 @@ +package android.content.res; + +public class Configuration { +} diff --git a/hiddenapi-stubs/src/main/java/android/content/res/Resources.java b/hiddenapi-stubs/src/main/java/android/content/res/Resources.java index 7894d566..236bef8b 100644 --- a/hiddenapi-stubs/src/main/java/android/content/res/Resources.java +++ b/hiddenapi-stubs/src/main/java/android/content/res/Resources.java @@ -1,26 +1,8 @@ package android.content.res; -import android.graphics.Movie; -import android.graphics.drawable.Drawable; import android.util.DisplayMetrics; -import android.util.TypedValue; - -import java.io.InputStream; public class Resources { - @SuppressWarnings("serial") - public static class NotFoundException extends RuntimeException { - public NotFoundException() { - } - - public NotFoundException(String name) { - throw new UnsupportedOperationException("STUB"); - } - } - - public final class Theme { - } - public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config) { throw new UnsupportedOperationException("STUB"); } @@ -28,177 +10,4 @@ public class Resources { public Resources(ClassLoader classLoader) { throw new UnsupportedOperationException("STUB"); } - - public void setImpl(ResourcesImpl impl) { - throw new UnsupportedOperationException("STUB"); - } - - public static Resources getSystem() { - throw new UnsupportedOperationException("STUB"); - } - - public XmlResourceParser getAnimation(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public final AssetManager getAssets() { - throw new UnsupportedOperationException("STUB"); - } - - public boolean getBoolean(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public int getColor(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public ColorStateList getColorStateList(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public Configuration getConfiguration() { - throw new UnsupportedOperationException("STUB"); - } - - public float getDimension(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public int getDimensionPixelOffset(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public int getDimensionPixelSize(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public DisplayMetrics getDisplayMetrics() { - throw new UnsupportedOperationException("STUB"); - } - - public Drawable getDrawable(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - /** Since SDK21 */ - public Drawable getDrawable(int id, Theme theme) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - /** Since SDK21, CM12 */ - public Drawable getDrawable(int id, Theme theme, boolean supportComposedIcons) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public Drawable getDrawableForDensity(int id, int density) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - /** Since SDK21 */ - public Drawable getDrawableForDensity(int id, int density, Theme theme) { - throw new UnsupportedOperationException("STUB"); - } - - /** Since SDK21, CM12 */ - public Drawable getDrawableForDensity(int id, int density, Theme theme, boolean supportComposedIcons) { - throw new UnsupportedOperationException("STUB"); - } - - /** Since SDK21 */ - public float getFloat(int id) { - throw new UnsupportedOperationException("STUB"); - } - - public float getFraction(int id, int base, int pbase) { - throw new UnsupportedOperationException("STUB"); - } - - public int getIdentifier(String name, String defType, String defPackage) { - throw new UnsupportedOperationException("STUB"); - } - - public int[] getIntArray(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public int getInteger(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public XmlResourceParser getLayout(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public Movie getMovie(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getQuantityString(int id, int quantity) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getQuantityString(int id, int quantity, Object... formatArgs) { - throw new UnsupportedOperationException("STUB"); - } - - public CharSequence getQuantityText(int id, int quantity) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getResourceEntryName(int resid) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getResourceName(int resid) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getResourcePackageName(int resid) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getResourceTypeName(int resid) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getString(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String getString(int id, Object... formatArgs) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public String[] getStringArray(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public CharSequence getText(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public CharSequence getText(int id, CharSequence def) { - throw new UnsupportedOperationException("STUB"); - } - - public CharSequence[] getTextArray(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public void getValue(int id, TypedValue outValue, boolean resolveRefs) { - throw new UnsupportedOperationException("STUB"); - } - - public XmlResourceParser getXml(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public InputStream openRawResource(int id) throws NotFoundException { - throw new UnsupportedOperationException("STUB"); - } - - public TypedArray obtainTypedArray (int id) { - throw new UnsupportedOperationException("STUB"); - } } diff --git a/hiddenapi-stubs/src/main/java/android/content/res/TypedArray.java b/hiddenapi-stubs/src/main/java/android/content/res/TypedArray.java index f45897c2..67fa44b5 100644 --- a/hiddenapi-stubs/src/main/java/android/content/res/TypedArray.java +++ b/hiddenapi-stubs/src/main/java/android/content/res/TypedArray.java @@ -3,92 +3,92 @@ package android.content.res; import android.graphics.drawable.Drawable; public class TypedArray { - /** Only for API stubs creation, DO NOT USE! */ - /*package*/ TypedArray() { - throw new UnsupportedOperationException("STUB"); - } - +// /** Only for API stubs creation, DO NOT USE! */ +// /*package*/ TypedArray() { +// throw new UnsupportedOperationException("STUB"); +// } +// protected TypedArray(Resources resources) { throw new UnsupportedOperationException("STUB"); } - - protected TypedArray(Resources resources, int[] data, int[] indices, int len) { - throw new UnsupportedOperationException("STUB"); - } - - public boolean getBoolean(int index, boolean defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public int getColor(int index, int defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public ColorStateList getColorStateList(int index) { - throw new UnsupportedOperationException("STUB"); - } - - public float getDimension(int index, float defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public int getDimensionPixelOffset(int index, int defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public int getDimensionPixelSize(int index, int defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public Drawable getDrawable(int index) { - throw new UnsupportedOperationException("STUB"); - } - - public float getFloat(int index, float defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public float getFraction(int index, int base, int pbase, float defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public int getInt(int index, int defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public int getInteger(int index, int defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public int getLayoutDimension(int index, int defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public int getLayoutDimension(int index, String name) { - throw new UnsupportedOperationException("STUB"); - } - - public int getResourceId(int index, int defValue) { - throw new UnsupportedOperationException("STUB"); - } - - public Resources getResources() { - throw new UnsupportedOperationException("STUB"); - } - - public String getString(int index) { - throw new UnsupportedOperationException("STUB"); - } - - public CharSequence getText(int index) { - throw new UnsupportedOperationException("STUB"); - } - - public CharSequence[] getTextArray(int index) { - throw new UnsupportedOperationException("STUB"); - } - - public void recycle() { - throw new UnsupportedOperationException("STUB"); - } +// +// protected TypedArray(Resources resources, int[] data, int[] indices, int len) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public boolean getBoolean(int index, boolean defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getColor(int index, int defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public ColorStateList getColorStateList(int index) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public float getDimension(int index, float defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getDimensionPixelOffset(int index, int defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getDimensionPixelSize(int index, int defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public Drawable getDrawable(int index) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public float getFloat(int index, float defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public float getFraction(int index, int base, int pbase, float defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getInt(int index, int defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getInteger(int index, int defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getLayoutDimension(int index, int defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getLayoutDimension(int index, String name) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public int getResourceId(int index, int defValue) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public Resources getResources() { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public String getString(int index) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public CharSequence getText(int index) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public CharSequence[] getTextArray(int index) { +// throw new UnsupportedOperationException("STUB"); +// } +// +// public void recycle() { +// throw new UnsupportedOperationException("STUB"); +// } } diff --git a/hiddenapi-stubs/src/main/java/android/graphics/Movie.java b/hiddenapi-stubs/src/main/java/android/graphics/Movie.java new file mode 100644 index 00000000..22b2384d --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/graphics/Movie.java @@ -0,0 +1,4 @@ +package android.graphics; + +public class Movie { +} diff --git a/hiddenapi-stubs/src/main/java/android/graphics/drawable/Drawable.java b/hiddenapi-stubs/src/main/java/android/graphics/drawable/Drawable.java new file mode 100644 index 00000000..789035d9 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/graphics/drawable/Drawable.java @@ -0,0 +1,4 @@ +package android.graphics.drawable; + +public class Drawable { +} diff --git a/hiddenapi-stubs/src/main/java/android/os/Binder.java b/hiddenapi-stubs/src/main/java/android/os/Binder.java new file mode 100644 index 00000000..49c87162 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/Binder.java @@ -0,0 +1,58 @@ +package android.os; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +import java.io.FileDescriptor; + +public class Binder implements IBinder { + + @Override + public boolean transact(int code, @NonNull Parcel data, Parcel reply, int flags) { + throw new RuntimeException("STUB"); + } + + @Override + public String getInterfaceDescriptor() { + throw new RuntimeException("STUB"); + } + + public boolean pingBinder() { + throw new RuntimeException("STUB"); + } + + @Override + public boolean isBinderAlive() { + throw new RuntimeException("STUB"); + } + + @Override + public IInterface queryLocalInterface(@NonNull String descriptor) { + throw new RuntimeException("STUB"); + } + + @Override + public void dump(@NonNull FileDescriptor fd, String[] args) { + throw new RuntimeException("STUB"); + } + + @Override + public void dumpAsync(@NonNull FileDescriptor fd, String[] args) { + throw new RuntimeException("STUB"); + } + + @Override + public void linkToDeath(@NonNull DeathRecipient recipient, int flags) { + throw new RuntimeException("STUB"); + } + + @Override + public boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags) { + throw new RuntimeException("STUB"); + } + + protected boolean onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, + int flags) throws RemoteException { + throw new RuntimeException("STUB"); + } +} diff --git a/hiddenapi-stubs/src/main/java/android/os/IBinder.java b/hiddenapi-stubs/src/main/java/android/os/IBinder.java new file mode 100644 index 00000000..81ad36c9 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/IBinder.java @@ -0,0 +1,33 @@ +package android.os; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +import java.io.FileDescriptor; + +public interface IBinder { + + boolean transact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags); + + @Nullable + String getInterfaceDescriptor(); + + boolean pingBinder(); + + boolean isBinderAlive(); + + @Nullable + IInterface queryLocalInterface(@NonNull String descriptor); + + void dump(@NonNull FileDescriptor fd, @Nullable String[] args); + + void dumpAsync(@NonNull FileDescriptor fd, @Nullable String[] args); + + void linkToDeath(@NonNull DeathRecipient recipient, int flags); + + boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags); + + interface DeathRecipient { + void binderDied(); + } +} diff --git a/hiddenapi-stubs/src/main/java/android/os/IInterface.java b/hiddenapi-stubs/src/main/java/android/os/IInterface.java new file mode 100644 index 00000000..997e330f --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/IInterface.java @@ -0,0 +1,6 @@ +package android.os; + +public interface IInterface { + + IBinder asBinder(); +} diff --git a/hiddenapi-stubs/src/main/java/android/os/IUserManager.java b/hiddenapi-stubs/src/main/java/android/os/IUserManager.java new file mode 100644 index 00000000..fcedfb1d --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/IUserManager.java @@ -0,0 +1,28 @@ +package android.os; + +import android.content.pm.UserInfo; + +import androidx.annotation.RequiresApi; + +import java.util.List; + +public interface IUserManager extends IInterface { + + @RequiresApi(26) + boolean isUserUnlocked(int userId) + throws RemoteException; + + List getUsers(boolean excludeDying) + throws RemoteException; + + @RequiresApi(30) + List getUsers(boolean excludePartial, boolean excludeDying, boolean excludePreCreated) + throws RemoteException; + + abstract class Stub extends Binder implements IUserManager { + + public static IUserManager asInterface(IBinder obj) { + throw new RuntimeException("STUB"); + } + } +} diff --git a/hiddenapi-stubs/src/main/java/android/os/Parcel.java b/hiddenapi-stubs/src/main/java/android/os/Parcel.java new file mode 100644 index 00000000..f506a638 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/Parcel.java @@ -0,0 +1,4 @@ +package android.os; + +public class Parcel { +} diff --git a/hiddenapi-stubs/src/main/java/android/os/Parcelable.java b/hiddenapi-stubs/src/main/java/android/os/Parcelable.java new file mode 100644 index 00000000..3ac3685e --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/Parcelable.java @@ -0,0 +1,4 @@ +package android.os; + +public interface Parcelable { +} diff --git a/hiddenapi-stubs/src/main/java/android/os/RemoteException.java b/hiddenapi-stubs/src/main/java/android/os/RemoteException.java new file mode 100644 index 00000000..9b24d72b --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/RemoteException.java @@ -0,0 +1,8 @@ +package android.os; + +public class RemoteException extends Exception { + + public RemoteException(String message) { + throw new RuntimeException("STUB"); + } +} diff --git a/hiddenapi-stubs/src/main/java/android/os/ServiceManager.java b/hiddenapi-stubs/src/main/java/android/os/ServiceManager.java index fbe5a2ee..bf1a9f21 100644 --- a/hiddenapi-stubs/src/main/java/android/os/ServiceManager.java +++ b/hiddenapi-stubs/src/main/java/android/os/ServiceManager.java @@ -1,13 +1,28 @@ package android.os; +import android.annotation.Nullable; + public class ServiceManager { - private static IServiceManager sServiceManager; - private static IServiceManager getIServiceManager() { - throw new IllegalArgumentException("Stub!"); - } + /** + * Returns a reference to a service with the given name. + * + * @param name the name of the service to get + * @return a reference to the service, or null if the service doesn't exist + */ + @Nullable + public static IBinder getService(String name) { + throw new RuntimeException("STUB"); + } - public static IBinder getService(String name) { - throw new UnsupportedOperationException("STUB"); - } + /** + * Place a new @a service called @a name into the service + * manager. + * + * @param name the name of the new service + * @param service the service object + */ + public static void addService(String name, IBinder service) { + throw new RuntimeException("STUB"); + } } diff --git a/hiddenapi-stubs/src/main/java/android/os/UserHandle.java b/hiddenapi-stubs/src/main/java/android/os/UserHandle.java new file mode 100644 index 00000000..a85185d1 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/UserHandle.java @@ -0,0 +1,12 @@ +package android.os; + +public class UserHandle { + + public UserHandle(int h) { + throw new RuntimeException("STUB"); + } + + public int getIdentifier() { + throw new RuntimeException("STUB"); + } +} diff --git a/hiddenapi-stubs/src/main/java/android/os/UserManager.java b/hiddenapi-stubs/src/main/java/android/os/UserManager.java new file mode 100644 index 00000000..1dda5b63 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/os/UserManager.java @@ -0,0 +1,11 @@ +package android.os; + +import android.content.pm.UserInfo; + +import java.util.List; + +public class UserManager { + public List getUsers() { + throw new UnsupportedOperationException("STUB"); + } +} diff --git a/hiddenapi-stubs/src/main/java/android/util/DisplayMetrics.java b/hiddenapi-stubs/src/main/java/android/util/DisplayMetrics.java new file mode 100644 index 00000000..35c44ff0 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/util/DisplayMetrics.java @@ -0,0 +1,4 @@ +package android.util; + +public class DisplayMetrics { +} diff --git a/hiddenapi-stubs/src/main/java/android/util/TypedValue.java b/hiddenapi-stubs/src/main/java/android/util/TypedValue.java new file mode 100644 index 00000000..dd6c9a34 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/android/util/TypedValue.java @@ -0,0 +1,4 @@ +package android.util; + +public class TypedValue { +} diff --git a/hiddenapi-stubs/src/main/java/androidx/annotation/IntRange.java b/hiddenapi-stubs/src/main/java/androidx/annotation/IntRange.java new file mode 100644 index 00000000..80691fd3 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/androidx/annotation/IntRange.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package androidx.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.CLASS; + +/** + * Denotes that the annotated element should be an int or long in the given range + *

+ * Example: + *


+ *  @IntRange(from=0,to=255)
+ *  public int getAlpha() {
+ *      ...
+ *  }
+ * 
+ */ +@Retention(CLASS) +@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE}) +public @interface IntRange { + /** + * Smallest value, inclusive + */ + long from() default Long.MIN_VALUE; + + /** + * Largest value, inclusive + */ + long to() default Long.MAX_VALUE; +} \ No newline at end of file diff --git a/hiddenapi-stubs/src/main/java/androidx/annotation/RequiresApi.java b/hiddenapi-stubs/src/main/java/androidx/annotation/RequiresApi.java new file mode 100644 index 00000000..cb1d4624 --- /dev/null +++ b/hiddenapi-stubs/src/main/java/androidx/annotation/RequiresApi.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package androidx.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +/** + * Denotes that the annotated element should only be called on the given API level + * or higher. + *

+ * This is similar in purpose to the older {@code @TargetApi} annotation, but more + * clearly expresses that this is a requirement on the caller, rather than being + * used to "suppress" warnings within the method that exceed the {@code minSdkVersion}. + */ +@Retention(SOURCE) +@Target({TYPE, METHOD, CONSTRUCTOR, FIELD}) +public @interface RequiresApi { + + /** + * The API level to require. Alias for {@link #api} which allows you to leave out the + * {@code api=} part. + */ + @IntRange(from = 1) + int value() default 1; + + /** + * The API level to require + */ + @IntRange(from = 1) + int api() default 1; +} \ No newline at end of file diff --git a/hiddenapi-stubs/src/main/java/org/xmlpull/v1/XmlPullParserException.java b/hiddenapi-stubs/src/main/java/org/xmlpull/v1/XmlPullParserException.java new file mode 100644 index 00000000..220847ba --- /dev/null +++ b/hiddenapi-stubs/src/main/java/org/xmlpull/v1/XmlPullParserException.java @@ -0,0 +1,4 @@ +package org.xmlpull.v1; + +public class XmlPullParserException extends Throwable { +} diff --git a/service b/service new file mode 160000 index 00000000..b012241d --- /dev/null +++ b/service @@ -0,0 +1 @@ +Subproject commit b012241d59c3496960159e02c0f2e5787275bc3a diff --git a/service/.gitignore b/service/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/service/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/service/build.gradle b/service/build.gradle deleted file mode 100644 index dc40fc49..00000000 --- a/service/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -plugins { - id 'com.android.library' -} - -android { - compileSdkVersion androidCompileSdkVersion.toInteger() - ndkVersion androidCompileNdkVersion - buildToolsVersion androidBuildToolsVersion - - defaultConfig { - minSdkVersion androidMinSdkVersion.toInteger() - targetSdkVersion androidTargetSdkVersion.toInteger() - versionCode 1 - versionName "1.0" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} diff --git a/service/proguard-rules.pro b/service/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/service/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/service/src/main/AndroidManifest.xml b/service/src/main/AndroidManifest.xml deleted file mode 100644 index 6ab17fc5..00000000 --- a/service/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/service/src/main/aidl/io/github/lsposed/lspd/service/ILSPosedService.aidl b/service/src/main/aidl/io/github/lsposed/lspd/service/ILSPosedService.aidl deleted file mode 100644 index 1eb4f2fd..00000000 --- a/service/src/main/aidl/io/github/lsposed/lspd/service/ILSPosedService.aidl +++ /dev/null @@ -1,5 +0,0 @@ -package io.github.lsposed.lspd.service; - -interface ILSPosedService { - int getVersion() = 1; -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index fcdea69c..3c263db6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,6 @@ rootProject.name = "LSPosed" -include ':service' -include ':core', ':hiddenapi-stubs', ':sandhook-hooklib', ':sandhook-annotation', ':app', ':key-selector' +include ':core', ':hiddenapi-stubs', ':sandhook-hooklib', ':sandhook-annotation', ':app', ':key-selector', ':service', ':interface', ':hiddenapi-bridge' + +def service_root = "service" +project(':interface').projectDir = file("$service_root${File.separator}interface") +project(':service').projectDir = file("$service_root${File.separator}service")