// force stop app @Throws(Throwable::class) privatefunforceStop(context: Context, packageName: String, userid: Int) { // Access activity manager as system user val id = Binder.clearCallingIdentity() try { // public void forceStopPackageAsUser(String packageName, int userId) val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val mForceStop: Method = am.javaClass.getMethod( "forceStopPackageAsUser", String::class.java, Int::class.javaPrimitiveType ) mForceStop.invoke(am, packageName, userid) } finally { Binder.restoreCallingIdentity(id) } }
这里需要的是 packageName 和 userid
packageName 是通过 PackageManager 获取
userid 要麻烦一点要通过应用的 uid 转换.
android 4.2 以前不支持多用户,4.2 以后支持多用户.
应用在内部虽然有多用户,但只有一个 uid,在不同的用户下,通过 uid 和用户 id 合成一个新的 uid,以保证在每个用户下能够区分.
反推是除以 100000 得到多用户下该用户的 userid
1 2 3 4 5 6 7 8 9 10 11
privateconstval PER_USER_RANGE = 100000 privatefungetUserId(uid: Int): Int { returntry { // public static final int getUserId(int uid) val method = UserHandle::class.java.getDeclaredMethod("getUserId", Int::class.javaPrimitiveType) method.invoke(null, uid) asInt } catch (ex: Throwable) { return uid / PER_USER_RANGE } }
privatefunmakeCall(param: XC_MethodHook.MethodHookParam) { try { val method = param.args[0] as String? val arg = param.args[1] as String? val extras = param.args[2] as Bundle?
if ("DeepSleep" == method) { // if call form DeepSleep try { val mGetContext = param.thisObject.javaClass.getMethod("getContext") val context: Context = mGetContext.invoke(param.thisObject) as Context