在国家码不同的情况下,预置的apk是不一样的,所以需要解决这个问题
alps/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
当写入过的国家码的时候,驱动会传上来一个ro值,ro值的内容是各个国家的缩写,然后再packagemanagerservice.java文件中的scanPackageInternalLI方法中返回null,
scanPackageInternalLI方法会扫描手机中的所有apk。
private PackageParser.Package scanPackageInternalLI(PackageParser.Package pkg, File scanFile,
int policyFlags, int scanFlags, long currentTime, @Nullable UserHandle user)
throws PackageManagerException {
.....
//Redmine149881 modified for youtube or youtubeGo muyuanyuan begin
String CountryCode = SystemProperties.get("ro.boot.name2");
if(TextUtils.isEmpty(CountryCode)&& pkg.packageName.equals("com.google.android.apps.youtube.mango")&& pkg.codePath.contains("system/app")){
android.util.Log.e("muyuanyuan","CountryCode is null !!!!");
return null;
}
if(pkg !=null && CountryCode != null ){
if("AE".equals(CountryCode)||"CZ".equals(CountryCode)||"ES".equals(CountryCode)||"FR".equals(CountryCode)||"GR".equals(CountryCode)||"IL".equals (CountryCode)||"IT".equals(CountryCode)||"PL".equals(CountryCode)||"PT".equals(CountryCode)||"RO".equals(CountryCode)||"RU".equals(CountryCode)||"SG".equals(CountryCode)||"UA".equals(CountryCode)||"DE".equals(CountryCode)){
if(pkg.packageName.equals("com.google.android.apps.youtube.mango")&& pkg.codePath.contains("system/app")){
android.util.Log.e("muyuanyuan","CountryCode---->"+CountryCode+"packageName == youtube mango!!!");
return null;
}
}else if("AR".equals(CountryCode)||"BD".equals(CountryCode)||"BR".equals(CountryCode)||"CL".equals(CountryCode)||"CO".equals(CountryCode)||"IR".equals(CountryCode)||"KZ".equals(CountryCode)||"MX".equals(CountryCode)||"MY".equals(CountryCode)||"PE".equals(CountryCode)||"TH".equals(CountryCode)||"TR".equals(CountryCode)||"UY".equals(CountryCode)||"VE".equals(CountryCode)||"VN".equals(CountryCode)||"ID".equals(CountryCode)||"PH".equals(CountryCode)) {
if(pkg.packageName.equals("com.google.android.youtube")&& pkg.codePath.contains("system/app")){
android.util.Log.e("muyuanyuan","CountryCode---->"+CountryCode+"packageName == youtube !!!");
return null;
}
}else if(pkg.packageName.equals("com.google.android.apps.youtube.mango")&& pkg.codePath.contains("system/app")){
android.util.Log.e("muyuanyuan","CountryCode do not have!!!!");
return null;
}
}
//Redmine149881 modified for youtube or youtubeGo muyuanyuan end
........
}
加上这段代码 && pkg.codePath.contains(“system/app”) 可以保证用户自己安装的YouTube可以保留。
当时就是因为没有判断apk的安装路径,所以客户反馈了下面的问题:
1.写入MY国家码,恢复出厂设置后默认显示YouTube Go版本
2.安装YouTube软件,手机重启
测试结果:重启后仅显示YouTube Go版本,YouTube被卸载
期望结果:用户自己安装的YouTube可以保留
分析apk的安装路径:通过在PmsExtImpl.java中打log,得知YouTubeGo和YouTube的安装路径。
alps/vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/pm/PmsExtImpl.java
public boolean isVendorOperatorDir(File dir) {
boolean ret = false;
Slog.d(TAG+"myy", "isVendorOperatorDir---------dir->"+dir);
try {
// dir.getCanonicalFile()->/system/app/YouTubeGo dir.getCanonicalFile().getAbsolutePath()--/system/app/YouTubeGo
Slog.d(TAG+"myy", "dir.getCanonicalFile()->"+dir.getCanonicalFile()+" dir.getCanonicalFile().getAbsolutePath()--"+dir.getCanonicalFile().getAbsolutePath()+" equalsequals==== "+dir.getCanonicalFile().getAbsolutePath().equals("/vendor/operator/app"));
ret = dir.getCanonicalFile().getAbsolutePath().contains("/system/app/");
Slog.d(TAG+"myy", "ret---------ret->"+ret);
} catch (IOException e) {
Slog.d(TAG+"myy", "IOException");
e.printStackTrace();
}
return ret;
}
@Override
public boolean needSkipScanning(PackageParser.Package pkg,
PackageSetting updatedPkg, PackageSetting ps, File scanFile) {
boolean bSkip =(isVendorOperatorDir(scanFile) && (ps == null && updatedPkg == null)&& (null != pkg));
Slog.d(TAG+"myy", "bSkip---------bSkip->"+bSkip);
if (bSkip){
return true;
}
......
}
注意点:客户安装的apk是在date分区下,所以通过安装不同路径来判断,就可以解决该问题。
pkg.codePath.contains(“system/app”)
恢复出厂设置仅仅就格式化/data 分区,不会格式化/system 分区