RK android13 伪装第三方应用为Persistent apps

本文介绍了在Android 13中如何通过修改`PackageParser`和`ActivityManagerService`,使得第三方应用可以伪装成Persistent Apps。通过对`PackageParser`的修改,当包名匹配特定条件时,强制设置`coreApp`属性为true。同时在`ActivityManagerService`中,针对特定包名的应用,设置了`FLAG_PERSISTENT`标志,使其在启动时被视为persistent应用。此外,还展示了代码变更的详细diff。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录frameworks/base

diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 7bde11cfb3ac..781940308421 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1947,10 +1947,12 @@ public class PackageParser {
                 com.android.internal.R.styleable.AndroidManifest_versionName, 0);
         if (pkg.mVersionName != null) {
             pkg.mVersionName = pkg.mVersionName.intern();
-        }
-
-        pkg.coreApp = parser.getAttributeBooleanValue(null, "coreApp", false);
-
+        }  
+       if(pkgName.equals("com.test.myapplication")){
+               pkg.coreApp = true ;
+        }else{
+           pkg.coreApp = parser.getAttributeBooleanValue(null, "coreApp", false);
+         }
         final boolean isolatedSplits = sa.getBoolean(
                 com.android.internal.R.styleable.AndroidManifest_isolatedSplits, false);
         if (isolatedSplits) {
@@ -3550,7 +3552,7 @@ public class PackageParser {
 
         if (sa.getBoolean(
                 com.android.internal.R.styleable.AndroidManifestApplication_persistent,
-                false)) {
+                false)) {
             // Check if persistence is based on a feature being present
             final String requiredFeature = sa.getNonResourceString(com.android.internal.R.styleable
                     .AndroidManifestApplication_persistentWhenFeatureAvailable);
@@ -3558,6 +3560,10 @@ public class PackageParser {
                 ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
             }
         }
+        if(pkgName.equals("com.test.myapplication")){
+ ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
+
+        }
 
         if (sa.getBoolean(
                 com.android.internal.R.styleable.AndroidManifestApplication_requiredForAllUsers,
@@ -3666,7 +3672,7 @@ public class PackageParser {
         }
         if (sa.getBoolean(
                 R.styleable.AndroidManifestApplication_directBootAware,
-                false)) {
+                false)||pkgName.equals("com.test.myapplication")) {
             ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE;
         }

diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 36c45ebc6992..1d6b46f9ab20 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -6503,9 +6503,11 @@ public class ActivityManagerService extends IActivityManager.Stub
                         .getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
                 for (ApplicationInfo app : apps) {
                     if (!"android".equals(app.packageName)) {
+             Slog.i(TAG, "wancg startPersistentApps  app.packageName ====" + app.packageName);
                         final ProcessRecord proc = addAppLocked(
                                 app, null, false, null /* ABI override */,
                                 ZYGOTE_POLICY_FLAG_BATCH_LAUNCH);
+Slog.i(TAG, " startPersistentApps  proc :" + proc);
                         if (proc != null) {
                             proc.mProfile.addHostingComponentType(
                                     HOSTING_COMPONENT_TYPE_PERSISTENT);
@@ -6768,7 +6770,7 @@ public class ActivityManagerService extends IActivityManager.Stub
         } else {
             app = null;
         }
-
+        Slog.i(TAG, "wancg  addAppLocked   info.processName  " + info.processName + " isolated=="+isolated);
         if (app == null) {
             app = mProcessList.newProcessRecordLocked(
                     info,
@@ -6796,15 +6798,18 @@ public class ActivityManagerService extends IActivityManager.Stub
                         info.packageName, false, UserHandle.getUserId(app.uid));
             } catch (RemoteException e) {
             } catch (IllegalArgumentException e) {
-                Slog.w(TAG, "Failed trying to unstop package "
+                Slog.w(TAG, "wancg Failed trying to unstop package "
                         + info.packageName + ": " + e);
             }
         }
 
-        if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
+        if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK||info.processName.equals("com.test.myapplication")) {
+Slog.i(TAG, "wancg  addAppLocked   info.processName  " + info.processName + " info.flags=="+info.flags);
             app.setPersistent(true);
             app.mState.setMaxAdj(ProcessList.PERSISTENT_PROC_ADJ);
         }
+
+Slog.i(TAG, "wancg  addAppLocked   info.processName  " + info.processName + " app.getThread()=="+app.getThread()+"    mPersistentStartingProcesses.indexOf(app)====="+mPersistentStartingProcesses.indexOf(app));
         if (app.getThread() == null && mPersistentStartingProcesses.indexOf(app) < 0) {
             mPersistentStartingProcesses.add(app);
             mProcessList.startProcessLocked(app, new HostingRecord(
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 8c0b1d9e6026..c694c9b3aa2b 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -3652,6 +3652,10 @@ public class ComputerEngine implements Computer {
             @UserIdInt int userId) {
         final boolean userKeyUnlocked = StorageManager.isUserKeyUnlocked(userId);
         final PackageStateInternal ps = getPackageStateInternal(packageName);
+//wancg
+if(packageName.equals("com.test.myapplication")){
+ return PackageManagerService.PACKAGE_STARTABILITY_OK;
+}
         if (ps == null || shouldFilterApplication(ps, callingUid, userId)
                 || !ps.getUserStateOrDefault(userId).isInstalled()) {
             return PackageManagerService.PACKAGE_STARTABILITY_NOT_FOUND;
@@ -5543,6 +5547,7 @@ public class ComputerEngine implements Computer {
                     && (!safeMode || p.isSystem())
                     && (matchesUnaware || matchesAware)) {
                 PackageStateInternal ps = mSettings.getPackage(p.getPackageName());
+                Log.w(TAG, " getPersistentApplications " + p.getPackageName());
                 if (ps != null) {
                     ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(p, flags,
                             ps.getUserStateOrDefault(userId), userId, ps);
@@ -5551,6 +5556,19 @@ public class ComputerEngine implements Computer {
                     }
                 }
             }
+         if(p.getPackageName().equals("com.test.myapplication")){//wancg todo
+                PackageStateInternal ps = mSettings.getPackage(p.getPackageName());
+        Log.w(TAG, "5558  getPersistentApplications " + p.getPackageName()+"     p.isSystem()="+p.isSystem()+"safeMode="+safeMode+"    p.isDirectBootAware()="+p.isDirectBootAware()+"   matchesAware="+matchesAware+"   matchesAware="+matchesAware+"  ps ==="+ps);
+                if (ps != null) {
+                    ApplicationInfo ai = PackageInfoUtils.generateApplicationInfo(p, flags,
+                            ps.getUserStateOrDefault(userId), userId, ps);
+ Log.w(TAG, " getPersistentApplications  ai=== " + ai);
+                    if (ai != null) {
+                        finalList.add(ai);
+                    }
+                }
+
+}
         }
 
         return finalList;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值