在 Android 9 上绕过 android USB 主机权限确认对话框
Bypass android usb host permission confirmation dialog on Android 9
在 Android 9 之前我可以 bypass android usb host permission confirmation dialog by using root, systemizing my app and using next usb classes
但它不适用于最新的 Android 版本 - 9
它抛出 java.lang.NoSuchMethodError: No interface method grantDevicePermission(Landroid/hardware/usb/UsbDevice;I)V in class Landroid/hardware/usb/IUsbManager; or its super classes (declaration of 'android.hardware.usb.IUsbManager' appears in /system/framework/framework.jar)
fun setUsbPermissionRoot(device: UsbDevice) : Boolean {
if (BuildConfig.DEBUG) Log.i(TAG, "trying set permission")
try {
val pm = App.context.packageManager
val ai = pm.getApplicationInfo(App.context.packageName, 0)
ai?.let {
val b = ServiceManager.getService(Context.USB_SERVICE)
val service = IUsbManager.Stub.asInterface(b)
service.grantDevicePermission(device, it.uid)
try {
service.setDevicePackage(device, App.context.packageName, it.uid)
} catch (e: Exception) {
e.printStackTrace()
}
if (BuildConfig.DEBUG) Log.i(TAG, "permission was set usb device")
return true
}
} catch (e: PackageManager.NameNotFoundException) {
if (BuildConfig.DEBUG) e.printStackTrace()
} catch (e: RemoteException) {
if (BuildConfig.DEBUG) e.printStackTrace()
}
return false
}
有什么方法可以让它在 Android 9 上运行吗?
我们可以输入:
解决
adb shell
su
settings put global hidden_api_policy_pre_p_apps 1
settings put global hidden_api_policy_p_apps 1
对非SDK接口的限制(Android 9):https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
然后 grantDevicePermission
方法将通过 Android 上的反射再次可用 9:
public static boolean grantAutomaticUsbPermissionRoot(Context context, UsbDevice usbDevice) {
try {
PackageManager pkgManager = context.getPackageManager();
ApplicationInfo appInfo = pkgManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
Class serviceManagerClass = Class.forName("android.os.ServiceManager");
Method getServiceMethod = serviceManagerClass.getDeclaredMethod("getService", String.class);
getServiceMethod.setAccessible(true);
android.os.IBinder binder = (android.os.IBinder)getServiceMethod.invoke(null, Context.USB_SERVICE);
Class iUsbManagerClass = Class.forName("android.hardware.usb.IUsbManager");
Class stubClass = Class.forName("android.hardware.usb.IUsbManager$Stub");
Method asInterfaceMethod = stubClass.getDeclaredMethod("asInterface", android.os.IBinder.class);
asInterfaceMethod.setAccessible(true);
Object iUsbManager=asInterfaceMethod.invoke(null, binder);
final Method grantDevicePermissionMethod = iUsbManagerClass.getDeclaredMethod("grantDevicePermission", UsbDevice.class, int.class);
grantDevicePermissionMethod.setAccessible(true);
grantDevicePermissionMethod.invoke(iUsbManager, usbDevice,appInfo.uid);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
p.s。你当然需要root并系统化你的应用程序(移动到/system/priv-app/
)
在 Android 9 之前我可以 bypass android usb host permission confirmation dialog by using root, systemizing my app and using next usb classes
但它不适用于最新的 Android 版本 - 9
它抛出 java.lang.NoSuchMethodError: No interface method grantDevicePermission(Landroid/hardware/usb/UsbDevice;I)V in class Landroid/hardware/usb/IUsbManager; or its super classes (declaration of 'android.hardware.usb.IUsbManager' appears in /system/framework/framework.jar)
fun setUsbPermissionRoot(device: UsbDevice) : Boolean {
if (BuildConfig.DEBUG) Log.i(TAG, "trying set permission")
try {
val pm = App.context.packageManager
val ai = pm.getApplicationInfo(App.context.packageName, 0)
ai?.let {
val b = ServiceManager.getService(Context.USB_SERVICE)
val service = IUsbManager.Stub.asInterface(b)
service.grantDevicePermission(device, it.uid)
try {
service.setDevicePackage(device, App.context.packageName, it.uid)
} catch (e: Exception) {
e.printStackTrace()
}
if (BuildConfig.DEBUG) Log.i(TAG, "permission was set usb device")
return true
}
} catch (e: PackageManager.NameNotFoundException) {
if (BuildConfig.DEBUG) e.printStackTrace()
} catch (e: RemoteException) {
if (BuildConfig.DEBUG) e.printStackTrace()
}
return false
}
有什么方法可以让它在 Android 9 上运行吗?
我们可以输入:
解决adb shell
su
settings put global hidden_api_policy_pre_p_apps 1
settings put global hidden_api_policy_p_apps 1
对非SDK接口的限制(Android 9):https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
然后 grantDevicePermission
方法将通过 Android 上的反射再次可用 9:
public static boolean grantAutomaticUsbPermissionRoot(Context context, UsbDevice usbDevice) {
try {
PackageManager pkgManager = context.getPackageManager();
ApplicationInfo appInfo = pkgManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
Class serviceManagerClass = Class.forName("android.os.ServiceManager");
Method getServiceMethod = serviceManagerClass.getDeclaredMethod("getService", String.class);
getServiceMethod.setAccessible(true);
android.os.IBinder binder = (android.os.IBinder)getServiceMethod.invoke(null, Context.USB_SERVICE);
Class iUsbManagerClass = Class.forName("android.hardware.usb.IUsbManager");
Class stubClass = Class.forName("android.hardware.usb.IUsbManager$Stub");
Method asInterfaceMethod = stubClass.getDeclaredMethod("asInterface", android.os.IBinder.class);
asInterfaceMethod.setAccessible(true);
Object iUsbManager=asInterfaceMethod.invoke(null, binder);
final Method grantDevicePermissionMethod = iUsbManagerClass.getDeclaredMethod("grantDevicePermission", UsbDevice.class, int.class);
grantDevicePermissionMethod.setAccessible(true);
grantDevicePermissionMethod.invoke(iUsbManager, usbDevice,appInfo.uid);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
p.s。你当然需要root并系统化你的应用程序(移动到/system/priv-app/
)