1.特殊需求,預置在data/app下面的apk不可以通過用戶界面來卸載
方法:
1.修改frameworks/base/core/java/android/app/ApplicationPackageManager.java
1) 添加如下代碼
//can't uninstall apk that is located at /data/app/
public boolean canUninstall(String pkg, IPackageDeleteObserver observer){
String apps = SystemProperties.get("persist.sys.sysapp", null);
if(apps == null){
return true;
}
Log.v(TAG, "the app list can't be uninstalled ==>:"+apps);
for(String pkgname:apps.split(",")){
if(pkgname != null && pkgname.trim().equals(pkg)){
try {
observer.packageDeleted(pkgname, PackageManager.DELETE_FAILED_INTERNAL_ERROR);
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
}
return true;
}
通過讀取系統屬性中設置的apk的packagename來限制卸載apk。例如setprop persist.sys.sysapp "package1, package2" 則package1和package2包名的apk不可被卸載掉
2)修改原生如下接口:
@Override
public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) {
try {
if(!canUninstall(packageName, observer)){
return;
}
mPM.deletePackage(packageName, observer, flags);
} catch (RemoteException e) {
// Should never happen!
}
}