diff --git a/app/build.gradle b/app/build.gradle index 95b929e..dd72d79 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { defaultConfig { applicationId "com.aoleyun.sn" - versionCode 254 - versionName "1.6.1023" + versionCode 256 + versionName "1.6.1026" //There are no CERT files because If the mini sdk version is 23+, the AGP will ignore the V1 scheme signature. minSdkVersion 24 diff --git a/app/src/main/java/com/aoleyun/sn/hook/AoleyunActivityController.java b/app/src/main/java/com/aoleyun/sn/hook/AoleyunActivityController.java index 123fcbb..4725925 100644 --- a/app/src/main/java/com/aoleyun/sn/hook/AoleyunActivityController.java +++ b/app/src/main/java/com/aoleyun/sn/hook/AoleyunActivityController.java @@ -1,7 +1,14 @@ package com.aoleyun.sn.hook; import android.app.IActivityController; +import android.content.ContentResolver; +import android.content.Context; import android.content.Intent; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; +import android.text.TextUtils; import android.util.Log; import com.aoleyun.sn.comm.CommonConfig; @@ -9,17 +16,101 @@ import com.aoleyun.sn.utils.ApkUtils; import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + public class AoleyunActivityController extends IActivityController.Stub { private static final String TAG = "AoleyunActivityController"; private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + private final Context mContext; + + /** + * 当前需要禁止启动的包名:本地默认禁用({@link ApkUtils#DEFAULT_DISABLE_APP_MAP}) + * + 接口下发禁用(getSnAppAttr 在线禁用、getIconControl 应用管控禁用), + * 统一由 {@link ApkUtils#getKeepDisablePkgs(Context)} 汇总。 + *
+ * activityStarting 每次启动 activity 都会被系统同步回调,这里做进程内缓存,
+ * 避免每次都跨进程读 Settings.Global;清单变化由 Settings 的 ContentObserver 刷新。
+ */
+ private volatile Set
+ * activityStarting 运行在 binder 线程上,Toast 对该线程有 Looper 要求,
+ * 因此这里兜底捕获异常,避免拦截失败变成进程异常。
+ */
+ private void showDisableTip() {
+ try {
+ Toaster.show("应用已被禁用");
+ } catch (Exception e) {
+ Log.e(TAG, "showDisableTip: " + e.getMessage());
+ }
+ }
@Override
public boolean activityStarting(Intent intent, String pkg) {
Log.e(TAG, "activityStarting: " + pkg + ", intent= " + intent);
- if (ApkUtils.disableSystemapp.contains(pkg)) {
- Toaster.show("应用已被禁用");
+ if (TextUtils.isEmpty(pkg)) {
+ return true;
+ }
+ //本地默认禁用应用 + 接口下发的禁用应用,禁止启动
+ if (mDisablePkgs.contains(pkg)) {
+ Log.e(TAG, "activityStarting: 应用已被禁用,拦截启动 " + pkg);
+ showDisableTip();
return false;
}
return true;
@@ -72,4 +163,3 @@ public class AoleyunActivityController extends IActivityController.Stub {
}
}
-
diff --git a/app/src/main/java/com/aoleyun/sn/service/main/MainService.java b/app/src/main/java/com/aoleyun/sn/service/main/MainService.java
index 18b9bdc..f697678 100644
--- a/app/src/main/java/com/aoleyun/sn/service/main/MainService.java
+++ b/app/src/main/java/com/aoleyun/sn/service/main/MainService.java
@@ -543,7 +543,7 @@ public class MainService extends BaseService implements NetworkUtils.OnNetworkSt
IActivityManager activityManager = ActivityManagerNative.getDefault();
try {
- activityManager.setActivityController(new AoleyunActivityController(), false);
+ activityManager.setActivityController(new AoleyunActivityController(MainService.this), false);
} catch (RemoteException e) {
Log.e(TAG, "setActivityController: " + e.getMessage());
}
diff --git a/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java b/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java
index 24eef41..2aec203 100644
--- a/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java
+++ b/app/src/main/java/com/aoleyun/sn/utils/ApkUtils.java
@@ -393,7 +393,7 @@ public class ApkUtils {
this.add("org.chromium.chrome");
this.add("com.onyx.appmarket");
this.add("com.onyx.aiassistant");
- this.add("com.onyx.android.production.test");
+// this.add("com.onyx.android.production.test");
this.add("com.onyx.dict");
this.add("com.onyx.mail");
this.add("com.onyx.musicplayer");