GS3更新到4.2.1后,安装自编应用均出现错误INSTALL_FAILED_INTERNAL_ERROR:
解决办法:
1.Setting -> Security -> Verify Apps去掉选择框的选择。
2.Setting -> Security -> Unknown sources去掉选择框的选择。
当安装源代码编译的apk后再次安装Eclipse编译出的apk出现以下错误:
E:\send_file>adb install -r \Development.apk
1255 KB/s (71986 bytes in 0.056s)
pkg: /data/local/tmp/Development.apk
Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]解决办法:
先卸载apk,再次安装新的apk。
源代码分析:
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
public PackageManagerService(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
...
// Find base frameworks (resource packages without code).
mFrameworkInstallObserver = new AppDirObserver(
mFrameworkDir.getPath(), OBSERVER_EVENTS, true);
mFrameworkInstallObserver.startWatching();
scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR,
scanMode | SCAN_NO_DEX, 0);
// Collect all system packages.
mSystemAppDir = new File(Environment.getRootDirectory(), "app");
mSystemInstallObserver = new AppDirObserver(
mSystemAppDir.getPath(), OBSERVER_EVENTS, true);
mSystemInstallObserver.startWatching();
scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);
// Collect all vendor packages.
mVendorAppDir = new File("/vendor/app");
mVendorInstallObserver = new AppDirObserver(
mVendorAppDir.getPath(), OBSERVER_EVENTS, true);
mVendorInstallObserver.startWatching();
scanDirLI(mVendorAppDir, PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);
...
if (!mOnlyCore) {
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
SystemClock.uptimeMillis());
mAppInstallObserver = new AppDirObserver(
mAppInstallDir.getPath(), OBSERVER_EVENTS, false);
mAppInstallObserver.startWatching();
scanDirLI(mAppInstallDir, 0, scanMode, 0);
mDrmAppInstallObserver = new AppDirObserver(
mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
mDrmAppInstallObserver.startWatching();
scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,
scanMode, 0);
以上代码可看出系统会监视五个目录:/system/app /data/app ...
一旦目录中文件出现变动,onEvent将会被调用:
private final class AppDirObserver extends FileObserver {
...
public void onEvent(int event, String path) {...
synchronized (mInstallLock) {
if ((event&ADD_EVENTS) != 0) {
if (p == null) {
p = scanPackageLI(fullPath,
(mIsRom ? PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR: 0) |
PackageParser.PARSE_CHATTY |
PackageParser.PARSE_MUST_BE_APK,
SCAN_MONITOR | SCAN_NO_PATHS | SCAN_UPDATE_TIME,
System.currentTimeMillis(), UserHandle.ALL);
if (p != null) {
/*
* TODO this seems dangerous as the package may have
* changed since we last acquired the mPackages
* lock.
*/
// writer
synchronized (mPackages) {
updatePermissionsLPw(p.packageName, p,
p.permissions.size() > 0 ? UPDATE_PERMISSIONS_ALL : 0);
}
addedPackage = p.applicationInfo.packageName;
addedAppId = UserHandle.getAppId(p.applicationInfo.uid);
}
}
}
// reader
synchronized (mPackages) {
mSettings.writeLPr();
}
}
...
if (addedPackage != null) {
Bundle extras = new Bundle(1);
extras.putInt(Intent.EXTRA_UID, addedAppId);
sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, addedPackage,
extras, null, null, addedUsers);
}
GS3 4.2.1 安装apk错误解决方案
GS3在升级到4.2.1后,安装自编译应用时遇到INSTALL_FAILED_INTERNAL_ERROR。解决方法包括:取消设置中的Verify Apps和Unknown sources选项。如果安装源代码编译的apk后再安装Eclipse编译的apk出错,需先卸载再安装。问题根源在于PackageManagerService.java中文件变动触发的onEvent方法。
38

被折叠的 条评论
为什么被折叠?



