FOTA/OTA之後启动第三方APP出現APP Crash
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
用FOTA下载OTA包,下载完毕更新;
更新完毕后点击多个三方APP无法进入,提示报错(这些APK都是正常安装,非预置)。
报错信息类似:
Caused by: java.io.IOException: Failed to remove obsolete file fROM /data/dalvikcache/
ARM/data@app@jp.naver.line.android-1@base.apk@classes.dex when searching for dex
file /data/app/jp.naver.line.android-1/base.apk: Permission denied
[SOLUTION]
1.如果apk之前有安装过,OTA升级后会检测到该apk的odex是旧的需要重新去提取,但是因为这个apk贵司长时间没有使用,L版本上默认PackageManagerService判断超过7天,则开机时不会做dexopt而报这种错误,此时一般重启之后这些apk会正常运行。
上述code中 mDexOptLRUThresholdInMills的值是7天,即若此apk上次使用时间(then=pkg.mLastPackageUsageTIMEInMills)+7天还小于当前时间(now),则此apk被判别为never不会被使用的apk,所以就不做dexopt了。那么异常时会出现上面的log。
2.发生异常时如果点击了这几个apk且发现其无法使用(无法使用的原因可能是boot.oat有更新,此时apk的odex档是旧的,需要重新提取才可正常运行),即此时mLastPackageUsageTimeInMills会更新。
所以重新开机后这个条件if (then + mDexOptLRUThresholdInMills < now)就不会满足,即这几个apk会做dexopt,此时能够正确提取odex,这时apk能够正常运行。
3. 这是Google在L版本上的机制,不建议修改,如果需要规避,可以将i.remove();这行给注释掉,即超7天时仍可以正常提取odex.
用FOTA下载OTA包,下载完毕更新;
更新完毕后点击多个三方APP无法进入,提示报错(这些APK都是正常安装,非预置)。
报错信息类似:
Caused by: java.io.IOException: Failed to remove obsolete file fROM /data/dalvikcache/
ARM/data@app@jp.naver.line.android-1@base.apk@classes.dex when searching for dex
file /data/app/jp.naver.line.android-1/base.apk: Permission denied
[SOLUTION]
1.如果apk之前有安装过,OTA升级后会检测到该apk的odex是旧的需要重新去提取,但是因为这个apk贵司长时间没有使用,L版本上默认PackageManagerService判断超过7天,则开机时不会做dexopt而报这种错误,此时一般重启之后这些apk会正常运行。
上述code中 mDexOptLRUThresholdInMills的值是7天,即若此apk上次使用时间(then=pkg.mLastPackageUsageTIMEInMills)+7天还小于当前时间(now),则此apk被判别为never不会被使用的apk,所以就不做dexopt了。那么异常时会出现上面的log。
2.发生异常时如果点击了这几个apk且发现其无法使用(无法使用的原因可能是boot.oat有更新,此时apk的odex档是旧的,需要重新提取才可正常运行),即此时mLastPackageUsageTimeInMills会更新。
所以重新开机后这个条件if (then + mDexOptLRUThresholdInMills < now)就不会满足,即这几个apk会做dexopt,此时能够正确提取odex,这时apk能够正常运行。
3. 这是Google在L版本上的机制,不建议修改,如果需要规避,可以将i.remove();这行给注释掉,即超7天时仍可以正常提取odex.