Android--应用安装卸载失败问题分析
来源:互联网 发布:触摸屏幕软件 编辑:程序博客网 时间:2024/04/30 22:01
1、应用安装失败:does not include classes.dex
08-04 17:15:23.118W/dalvikvm( 5253): DexOptZ:zip archive '/data/app/***.cloneit-1.apk' does not include classes.dex
08-04 17:15:23.118W/installd( 266): DexInv:--- END '/data/app/***cloneit-1.apk' --- status=0xff00, process failed
08-04 17:15:23.118E/installd( 266): dexopt in='/data/app/***.cloneit-1.apk'out='/data/dalvik-cache/data@app@***.cloneit-1.apk@classes.dex'res=65280
。。。。。。
08-04 17:15:23.288D/CP_PackageInstaller( 5020): installed code msg.what = 1
08-04 17:15:23.288I/CP_PackageInstaller( 5020): installed codemsg.arg1 = -11
这个是因为安装的apk里面没有classes.dex文件,安装失败。
安装应用时,包含在apk文件里的dex文件会在运行时通过dexopt进行优化,优化后的文件将保存在缓存中(data/dalvik-cache)。因此,安装后生成的apk文件是不可以直接安装的,缺少了classes.dex文件。
2、卸载失败:PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER
这种卸载失败,最直接的获知方法是通过打印的日志:W/PackageManager( 5729): Not removing package *****: has active device admin
卸载应用时,会调用到PackageManagerService的deletePackageX方法,代码如下:
private int deletePackageX(String packageName, int userId, int flags) { final PackageRemovedInfo info = new PackageRemovedInfo(); final boolean res; final UserHandle removeForUser = (flags & PackageManager.DELETE_ALL_USERS) != 0 ? UserHandle.ALL : new UserHandle(userId); if (isPackageDeviceAdmin(packageName, removeForUser.getIdentifier())) { Slog.w(TAG, "Not removing package " + packageName + ": has active device admin"); return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER; }
private boolean isPackageDeviceAdmin(String packageName, int userId) { IDevicePolicyManager dpm = IDevicePolicyManager.Stub.asInterface( ServiceManager.getService(Context.DEVICE_POLICY_SERVICE)); try { if (dpm != null) { if (dpm.isDeviceOwner(packageName)) { return true; } int[] users; if (userId == UserHandle.USER_ALL) { users = sUserManager.getUserIds(); } else { users = new int[]{userId}; } for (int i = 0; i < users.length; ++i) { if (dpm.packageHasActiveAdmins(packageName, users[i])) { return true; } } } } catch (RemoteException e) { } return false; }卸载程序要调IDevicePolicyManager服务里(在DevicePolicyManagerService.java里实现)的packageHasActiveAdmins()函数检查是否具备admin权限,如果没有admin权限,则直接返回不卸载程序,有了admin才去卸载程序,删除程序数据,发送广播消息(Intent.ACTION_PACKAGE_REMOVE或Intent.ACTION_UID_REMOVE),修改packages.xml文件等。因此一些应用程序安装后运行时,需要激活设备管理权限,卸载时必须取消激活设备管理器才可卸载。
0 0
- Android--应用安装卸载失败问题分析
- Android卸载测试应用后再次安装应用失败
- android应用安装失败
- android 应用卸载流程分析
- Android 打包apk 安装失败 应用未安装的问题
- adb应用安装失败分析
- android应用的安装、卸载
- Android安装与卸载应用
- Android 安装,启动,卸载应用
- VS2008卸载安装失败
- Launcher2 断电重启主界面加载失败/安装第三方应用/卸载应用主界面加载失败
- Android 安装应用时显示 提示应用已安装请卸载问题
- Android中安装,启动和卸载应用
- android中安装,启动和卸载应用
- 利用batch批量安装卸载android应用
- Android中安装,启动和卸载应用
- android中安装,启动和卸载应用
- Android 监听应用的卸载与安装
- wait waitpid
- Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统
- bzoj1115: [POI2009]石子游戏Kam
- Android Dialog用法
- KVC / KVO
- Android--应用安装卸载失败问题分析
- mysql 复制表游标插入
- POJ 2112--Optimal Milking【二分找最大距离的最小值 && 最大流dinic】
- Android:Layout_weight的深刻理解
- Android之Service实例电话监听器
- 项目总结《中小餐饮预定系统前端》
- IOS7开发~Images.xcassets
- Android Broswer下载路径设置
- HTML标签onclick属性中调用JS时出现的问题