公司有需求,禁止部分应用开机的时候自启动,实现代码如下:
--- a/frameworks/base/core/res/res/values/config.xml
+++ b/frameworks/base/core/res/res/values/config.xml
@@ -3540,4 +3540,32 @@
<string-array translatable="false" name="apk_whitelist" >
<item>"com.onstyle.track"</item>
</string-array>
+
+ <!--for disallow auto start-->
+ <string-array translatable="false" name="disallowlist" >
+ <item>"com.chinatsp.smartlights:lights_server"</item>
+ <item>"com.chinatsp.dvrcamera"</item>
+ <item>"com.changan.oushangCos1"</item>
+ <item>"com.incall.apps.softmanager"</item>
+ <item>"com.huawei.hiviewlite"</item>
+ <item>"com.huawei.hisight"</item>
+ <item>"com.huawei.dmsdpdevice"</item>
+ <item>"com.huawei.hicar.demoapp"</item>
+ <item>"com.oushang.uploadservice"</item>
+ <item>"com.huawei.nearby"</item>
+ <item>"com.chinatsp.smartlights"</item>
+ <item>"com.chinatsp.media.scan"</item>
+ <item>"com.android.car.messenger"</item>
+ <item>"com.mediatek.engineermode"</item>
+ <item>"com.mediatek.avm"</item>
+ <item>"com.android.managedprovisioning"</item>
+ <item>"com.baidu.map.location"</item>
+ <item>"com.android.printspooler"</item>
+ <item>"com.chinatsp.update"</item>
+ <item>"com.android.se"</item>
+ <item>"com.android.keychain"</item>
+ <item>"android.car.usb.handler"</item>
+ <item>"com.android.onetimeinitializer"</item>
+ <item>"android.car.cluster.loggingrenderer"</item>
+ </string-array>
</resources>
diff --git a/frameworks/base/core/res/res/values/symbols.xml b/frameworks/base/core/res/res/values/symbols.xml
index b4b7818..6060ea7 100755
--- a/frameworks/base/core/res/res/values/symbols.xml
+++ b/frameworks/base/core/res/res/values/symbols.xml
@@ -3474,4 +3474,6 @@
<!-- For whitelist apk -->
<java-symbol type="array" name="apk_whitelist" />
+ <!--for disallow auto start-->
+ <java-symbol type="array" name="disallowlist" />
</resources>
diff --git a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java b/frameworks/base/services/core/jav
old mode 100644
new mode 100755
index 60315ab..7af349f
--- a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -731,7 +731,7 @@ public class ActivityManagerService extends IActivityManager.Stub
private boolean mUseFifoUiScheduling = false;
private static final String SYSUI_COMPONENT_NAME = "com.android.systemui/.SystemUIService";
-
+ private static HashSet<String> mDisallowList;
BroadcastQueue mFgBroadcastQueue;
BroadcastQueue mBgBroadcastQueue;
// Convenient for easy iteration over the queues. Foreground is first
@@ -837,6 +837,59 @@ public class ActivityManagerService extends IActivityManager.Stub
}
};
+ private final int getRunningProcessRecordIndex(String packageName) {
+ // Find the application record.
+ if(packageName == null){
+ return -1;
+ }
+ for (int i=mLruProcesses.size()-1; i>=0; i--) {
+ ProcessRecord rec = mLruProcesses.get(i);
+ if (rec.thread != null && packageName.equals(rec.processName)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ private String mCachePkg;
+ final boolean isProcessLocked(ApplicationInfo info, String hostingType,ComponentName hostingName) {
+ if(mDisallowList == null){
+ getDisallowList();
+ }
+ String launchPkg = info.packageName;
+ Slog.i(TAG, "~~~zjy~~~Package name ["+launchPkg+"] isSystemApp: " + info.isSystemApp());
+ boolean isRunningApp = getRunningProcessRecordIndex(launchPkg) != -1;
+ if(isRunningApp){
+ Slog.d(TAG, "~~~zjy Launch: " + launchPkg + " " + hostingType);
+ return false;
+ }
+ if(launchPkg.equals(mCachePkg)){
+ Slog.d(TAG, "~~~zjy Launch for cache: " + launchPkg + " " + hostingType);
+ return false;
+ }
+ if ("service".equals(hostingType) || "broadcast".equals(hostingType) || "content provider".equals(hostingType)) {
+
+ if (mDisallowList.contains(launchPkg)) {
+ Slog.d(TAG, "~~~zjy intercept: " + launchPkg + " " + hostingType + " " + info.processName);
+ return true;
+ } else {
+ Slog.d(TAG, "~~~zjy allowed: " + launchPkg + " " + hostingType + " " + info.processName);
+ return false;
+ }
+
+ }
+ mCachePkg = launchPkg;
+ return false;
+ }
+
+ private void getDisallowList() {
+ String[] disallowList = mContext.getResources().getSystem().getStringArray(com.android.internal.R.array.disallowlist);
+ mDisallowList = new HashSet<>(Arrays.asList(disallowList));
+ Iterator iter = mDisallowList.iterator();
+ while(iter.hasNext()){
+ Slog.d(TAG, "~~~zjy getDisallowList: item:"+(String)iter.next());
+ }
+ }
public boolean canShowErrorDialogs() {
return mShowDialogs && !mSleeping && !mShuttingDown
&& !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
@@ -4086,6 +4139,11 @@ public class ActivityManagerService extends IActivityManager.Stub
ApplicationInfo info, boolean knownToBeDead, int intentFlags,
String hostingType, ComponentName hostingName, boolean allowWhileBooting,
boolean isolated, boolean keepIfLarge) {
+ if (isProcessLocked(info, hostingType,hostingName)) {
+ String launchPkg = info.packageName;
+ Slog.i(TAG, "~~~zjy~~~isProcessLocked name ["+launchPkg+"] isSystemApp: " + info.isSystemApp());
+ return null;
+ }
return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType,
hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
(END)