[全志Android11平台]禁止某一个app的更新

一、前言

这几天接到一个开发需求是禁止YouTube在谷歌商城更新后替换内置进去的YouTube版本,因为内置进去的YouTube版本可以播放4k视频源,更新后的YouTube搜不到4k视频源,所以采用更新后禁止版本替换的修改方法

二、代码路径

frameworks/base/core/res/res/values/config.xml
frameworks/base/core/res/res/values/symbols.xml
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

三、修改方法

在frameworks/base/core/res/res/values/config.xml里做如下修改

 <!-- Sharesheet: define a max number of targets per application for new shortcuts-based direct share introduced in Q -->
     <integer name="config_maxShortcutTargetsPerApp">3</integer>
 
+    <string-array name="app_install_black_list">
+        <item>"com.google.android.youtube.tv"</item>
+    </string-array>
+
     <!-- The package name for the vendor implementation of ACTION_FACTORY_RESET. For some vendors,
     the default implementation of ACTION_FACTORY_RESET does not work, so it is needed to re-route
     this intent to this package. This is being used in MasterClearReceiver.java. -->

在frameworks/base/core/res/res/values/symbols.xml里做如下修改

 <java-symbol type="array" name="config_batteryPackageTypeSystem" />
   <java-symbol type="array" name="config_batteryPackageTypeService" />
+  <java-symbol type="array" name="app_install_black_list" />
 
   <java-symbol type="string" name="popup_window_default_title" />
   <java-symbol type="bool" name="config_showAreaUpdateInfoSettings" />

在frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java里做如下修改

.....
import static android.content.pm.PackageManager.INSTALL_FAILED_PROCESS_NOT_DEFINED;
 import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
 import static android.content.pm.PackageManager.INSTALL_FAILED_TEST_ONLY;
+import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
 import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
 import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE;
 import static android.content.pm.PackageManager.INSTALL_INTERNAL;
.....
//在这个类里
public class PackageManagerService extends IPackageManager.Stub...
...
     public final static String STUB_SUFFIX = "-Stub";
 
     private static final int[] EMPTY_INT_ARRAY = new int[0];
-
+    private ArrayList<String> mAppBlackList = new ArrayList<>();//声明一个ArrayList去接包名
     private static final int TYPE_UNKNOWN = 0;
     private static final int TYPE_ACTIVITY = 1;
     private static final int TYPE_RECEIVER = 2;
......
//在这个类里
public class PackageManagerService extends IPackageManager.Stub
......
         // holding the mPackages lock, but we're mostly interested in yelling
         // once we have a booted system.
         mInstaller.setWarnIfHeld(mLock);
-
+        //获取config.xml里声明要禁止的包名
+        String lists[] = mContext.getResources().getStringArray(R.array.app_install_black_list);
+        if(lists != null && lists.length > 0){
+            for(String pkgName : lists){
+                Slog.d(TAG, "allowed install app name:" + pkgName);
+                //添加到ArrayList里
+                mAppBlackList.add(pkgName);
+            }
+        }
+        
+        
         PackageParser.readConfigUseRoundIcon(mContext.getResources());
 
         mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L);
....
//还是在这个类里
public class PackageManagerService extends IPackageManager.Stub
...
                         "Packages declaring static-shared libs cannot be updated");
             }
         }
-
+        Slog.d(TAG, "installPackageLI: package name=" + parsedPackage.getPackageName());
+        //如果系统中存在要替换的包,则禁止下载
+        if(mAppBlackList.contains(parsedPackage.getPackageName())){
+            Slog.i(TAG, "This app does not allow be installed!!!");
+            throw new PrepareFailure(INSTALL_PARSE_FAILED_NO_CERTIFICATES, "This app does not allow be installed!!!");
+        }
+        
         String pkgName = res.name = parsedPackage.getPackageName();
         if (parsedPackage.isTestOnly()) {
             if ((installFlags & PackageManager.INSTALL_ALLOW_TEST) == 0) {
.....

如果后面还需要进行这种操作,就在frameworks/base/core/res/res/values/config.xml里这样加

 <string-array name="app_install_black_list">
        <item>"com.google.android.youtube.tv"</item>
        <item>"在这里添加要禁止的包名"</item>
    </string-array>

查看包名的方法,打开一个app,然后输入下面命令

adb shell dumpsys window | grep mCurrentFocus

四、总结

真是一个奇葩的需求。。。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值