一、前言
这几天接到一个开发需求是禁止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
四、总结
真是一个奇葩的需求。。。