Merge branch 'fix-855--fs-corruption' into 'master'
Ignore errors that are likely due to filesystem corruption (rebase with added Toast) Closes #855 See merge request !581
This commit is contained in:
commit
445c275abe
@ -417,13 +417,29 @@ public final class Utils {
|
|||||||
|
|
||||||
byte[] mdbytes = md.digest();
|
byte[] mdbytes = md.digest();
|
||||||
return toHexString(mdbytes).toLowerCase(Locale.ENGLISH);
|
return toHexString(mdbytes).toLowerCase(Locale.ENGLISH);
|
||||||
} catch (IOException | NoSuchAlgorithmException e) {
|
} catch (IOException e) {
|
||||||
|
// The annoyance (potentially) caused by miscellaneous filesystem corruption results in
|
||||||
|
// F-Droid constantly popping up crash reports when F-Droid isn't even open. As such this
|
||||||
|
// exception-message-parsing-and-throwing-a-new-ignorable-exception-hackery is probably
|
||||||
|
// warranted. See https://www.gitlab.com/fdroid/fdroidclient/issues/855 for more detail.
|
||||||
|
if (e.getMessage().contains("read failed: EIO (I/O error)")) {
|
||||||
|
throw new PotentialFilesystemCorruptionException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
throw new IllegalArgumentException(e);
|
throw new IllegalArgumentException(e);
|
||||||
} finally {
|
} finally {
|
||||||
closeQuietly(fis);
|
closeQuietly(fis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class PotentialFilesystemCorruptionException extends IllegalArgumentException {
|
||||||
|
public PotentialFilesystemCorruptionException(IOException e) {
|
||||||
|
super(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Computes the base 16 representation of the byte array argument.
|
* Computes the base 16 representation of the byte array argument.
|
||||||
*
|
*
|
||||||
|
@ -11,12 +11,16 @@ import android.net.Uri;
|
|||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.widget.Toast;
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.fdroid.fdroid.AppUpdateStatusManager;
|
import org.fdroid.fdroid.AppUpdateStatusManager;
|
||||||
import org.fdroid.fdroid.Hasher;
|
import org.fdroid.fdroid.Hasher;
|
||||||
|
import org.fdroid.fdroid.R;
|
||||||
import org.fdroid.fdroid.Utils;
|
import org.fdroid.fdroid.Utils;
|
||||||
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
import org.fdroid.fdroid.data.Schema.InstalledAppTable;
|
||||||
|
import rx.functions.Action1;
|
||||||
|
import rx.schedulers.Schedulers;
|
||||||
|
import rx.subjects.PublishSubject;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
@ -25,10 +29,6 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import rx.functions.Action1;
|
|
||||||
import rx.schedulers.Schedulers;
|
|
||||||
import rx.subjects.PublishSubject;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles all updates to {@link InstalledAppProvider}, whether checking the contents
|
* Handles all updates to {@link InstalledAppProvider}, whether checking the contents
|
||||||
* versus what Android says is installed, or processing {@link Intent}s that come
|
* versus what Android says is installed, or processing {@link Intent}s that come
|
||||||
@ -249,6 +249,15 @@ public class InstalledAppProviderService extends IntentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
insertAppIntoDb(this, packageInfo, hashType, hash);
|
insertAppIntoDb(this, packageInfo, hashType, hash);
|
||||||
|
} catch (Utils.PotentialFilesystemCorruptionException e) {
|
||||||
|
String msg = getString(R.string.installed_app__file_corrupt, apk.getAbsolutePath());
|
||||||
|
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
|
||||||
|
Log.e(TAG, "Encountered potential filesystem corruption, or other unknown " +
|
||||||
|
"problem when calculating hash of " + apk.getAbsolutePath() + ". " +
|
||||||
|
"It is unlikely F-Droid can do anything about this, and this " +
|
||||||
|
"likely happened in the background. As such, we will continue without " +
|
||||||
|
"interrupting the user by asking them to send a crash report.");
|
||||||
|
return;
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
Utils.debugLog(TAG, e.getMessage());
|
Utils.debugLog(TAG, e.getMessage());
|
||||||
ACRA.getErrorReporter().handleException(e, false);
|
ACRA.getErrorReporter().handleException(e, false);
|
||||||
|
@ -93,6 +93,7 @@ This often occurs with apps installed via Google Play or other sources, if they
|
|||||||
<string name="installed_app__updates_ignored_for_suggested_version">Updates ignored for Version %1$s</string>
|
<string name="installed_app__updates_ignored_for_suggested_version">Updates ignored for Version %1$s</string>
|
||||||
<!-- The inline download button shown in the "Updates" screen only uses an icon and so requires
|
<!-- The inline download button shown in the "Updates" screen only uses an icon and so requires
|
||||||
some descriptive text for the TTS engine -->
|
some descriptive text for the TTS engine -->
|
||||||
|
<string name="installed_app__file_corrupt">F-Droid received EIO error: %s is probably corrupt!</string>
|
||||||
<string name="updates__tts__download_app">Download</string>
|
<string name="updates__tts__download_app">Download</string>
|
||||||
<string name="updates__tts__download_updates_for_all_apps">Download all updates</string>
|
<string name="updates__tts__download_updates_for_all_apps">Download all updates</string>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user