From 06b9abcee3068aeb2395f69e815e633cf25b2412 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Mar 2019 14:26:18 +0100 Subject: [PATCH 1/6] gitlab-ci: stick with built-in emulator on ARM The newest emulator releases always segfault when booting the trusty ARM android-22 image. --- .gitlab-ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e5631f5e7..e1ad78c54 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -66,8 +66,13 @@ errorprone: - export AVD_PACKAGE="system-images;android-${AVD_SDK};${AVD_TAG};${AVD_ARCH}" - echo $AVD_PACKAGE - emulator -accel-check || true + + - if [[ "$AVD_ARCH" != arm* ]]; then + set -x; echo y | sdkmanager "emulator" > /dev/null; set +x; + fi + - alias sdkmanager - - echo y | sdkmanager "emulator" "platforms;android-$AVD_SDK" > /dev/null + - echo y | sdkmanager "platforms;android-$AVD_SDK" > /dev/null - if ! avdmanager list avd | grep "Name. avd$AVD_SDK$"; then set -x; rm -rf ~/.android/avd $ANDROID_HOME/system-images; @@ -81,6 +86,7 @@ errorprone: fi - adb start-server - ls -l ~/.android + - emulator -version - emulator -avd avd$AVD_SDK -no-audio -no-jni @@ -98,9 +104,9 @@ errorprone: - ./gradlew connectedFullDebugAndroidTest $FLAG || (adb -e logcat -d > logcat.txt; exit 1) connected 22 default armeabi-v7a: + retry: 1 <<: *test-template <<: *connected-template - allow_failure: true .kvm-template: &kvm-template tags: From 66e909d606cb69245c05013d0cf3973afb24edf8 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 29 Mar 2019 16:37:18 +0100 Subject: [PATCH 2/6] standardize all Downloaders on 8k block sizes This is needed since this affects the onProgress broadcasts, and sending too many can peg the device's CPU. 1k was just too small. ANd 8k works fine for Bluetooth. fdroid/fdroidclient#1590 --- .../main/java/org/fdroid/fdroid/net/BluetoothDownloader.java | 2 +- app/src/main/java/org/fdroid/fdroid/net/Downloader.java | 4 ++-- app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java | 2 +- .../main/java/org/fdroid/fdroid/net/LocalFileDownloader.java | 2 +- .../main/java/org/fdroid/fdroid/net/TreeUriDownloader.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/net/BluetoothDownloader.java b/app/src/main/java/org/fdroid/fdroid/net/BluetoothDownloader.java index 225be7434..46912bcee 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/BluetoothDownloader.java +++ b/app/src/main/java/org/fdroid/fdroid/net/BluetoothDownloader.java @@ -92,7 +92,7 @@ public class BluetoothDownloader extends Downloader { @Override public void download() throws IOException, InterruptedException { - downloadFromStream(1024, false); + downloadFromStream(false); connection.closeQuietly(); } diff --git a/app/src/main/java/org/fdroid/fdroid/net/Downloader.java b/app/src/main/java/org/fdroid/fdroid/net/Downloader.java index 7acde08c6..ee806b4fe 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/Downloader.java +++ b/app/src/main/java/org/fdroid/fdroid/net/Downloader.java @@ -116,7 +116,7 @@ public abstract class Downloader { return notFound; } - void downloadFromStream(int bufferSize, boolean resumable) throws IOException, InterruptedException { + void downloadFromStream(boolean resumable) throws IOException, InterruptedException { Utils.debugLog(TAG, "Downloading from stream"); InputStream input = null; OutputStream outputStream = new FileOutputStream(outputFile, resumable); @@ -127,7 +127,7 @@ public abstract class Downloader { // we were interrupted before proceeding to the download. throwExceptionIfInterrupted(); - copyInputToOutputStream(input, bufferSize, outputStream); + copyInputToOutputStream(input, 8192, outputStream); } finally { Utils.closeQuietly(outputStream); Utils.closeQuietly(input); diff --git a/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java b/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java index ef86f696a..231484639 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java +++ b/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java @@ -175,7 +175,7 @@ public class HttpDownloader extends Downloader { } setupConnection(resumable); Utils.debugLog(TAG, "downloading " + urlString + " (is resumable: " + resumable + ")"); - downloadFromStream(8192, resumable); + downloadFromStream(resumable); cacheTag = connection.getHeaderField(HEADER_FIELD_ETAG); } diff --git a/app/src/main/java/org/fdroid/fdroid/net/LocalFileDownloader.java b/app/src/main/java/org/fdroid/fdroid/net/LocalFileDownloader.java index 9701eae39..0cd4d943a 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/LocalFileDownloader.java +++ b/app/src/main/java/org/fdroid/fdroid/net/LocalFileDownloader.java @@ -81,6 +81,6 @@ public class LocalFileDownloader extends Downloader { } else if (fileLength > 0) { resumable = true; } - downloadFromStream(8192, resumable); + downloadFromStream(resumable); } } diff --git a/app/src/main/java/org/fdroid/fdroid/net/TreeUriDownloader.java b/app/src/main/java/org/fdroid/fdroid/net/TreeUriDownloader.java index 93ab66f6c..0c27ad261 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/TreeUriDownloader.java +++ b/app/src/main/java/org/fdroid/fdroid/net/TreeUriDownloader.java @@ -96,7 +96,7 @@ public class TreeUriDownloader extends Downloader { @Override public void download() throws IOException, InterruptedException { - downloadFromStream(8192, false); + downloadFromStream(false); } @Override From 593ce5284c6bd483972383389bb0b879b1e42442 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Apr 2019 14:10:50 +0200 Subject: [PATCH 3/6] fix insane NPE java.lang.NullPointerException: println needs a message at android.util.Log.println_native(Native Method) at android.util.Log.e(Log.java:232) at org.fdroid.fdroid.net.DownloaderService.handleIntent(DownloaderService.java:232) at org.fdroid.fdroid.net.DownloaderService.access$000(DownloaderService.java:88) at org.fdroid.fdroid.net.DownloaderService$ServiceHandler.handleMessage(DownloaderService.java:108) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.os.HandlerThread.run(HandlerThread.java:61) --- .../full/java/org/fdroid/fdroid/net/WifiStateChangeService.java | 2 +- app/src/main/java/org/fdroid/fdroid/AddRepoIntentService.java | 2 +- app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/full/java/org/fdroid/fdroid/net/WifiStateChangeService.java b/app/src/full/java/org/fdroid/fdroid/net/WifiStateChangeService.java index baf3a68a1..db068494e 100644 --- a/app/src/full/java/org/fdroid/fdroid/net/WifiStateChangeService.java +++ b/app/src/full/java/org/fdroid/fdroid/net/WifiStateChangeService.java @@ -276,7 +276,7 @@ public class WifiStateChangeService extends IntentService { if (BuildConfig.DEBUG) { e.printStackTrace(); } else { - Log.i(TAG, e.getLocalizedMessage()); + Log.i(TAG, "Getting subnet failed: " + e.getLocalizedMessage()); } } } diff --git a/app/src/main/java/org/fdroid/fdroid/AddRepoIntentService.java b/app/src/main/java/org/fdroid/fdroid/AddRepoIntentService.java index 9530429b3..f28fb0e00 100644 --- a/app/src/main/java/org/fdroid/fdroid/AddRepoIntentService.java +++ b/app/src/main/java/org/fdroid/fdroid/AddRepoIntentService.java @@ -69,7 +69,7 @@ public class AddRepoIntentService extends IntentService { try { urlString = normalizeUrl(uri); } catch (URISyntaxException e) { - Log.i(TAG, e.getLocalizedMessage()); + Log.i(TAG, "Bad URI: " + e.getLocalizedMessage()); return; } diff --git a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java index cca7e76ee..f96e90607 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java +++ b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java @@ -248,7 +248,7 @@ public class DownloaderService extends Service { | SSLHandshakeException | SSLKeyException | SSLPeerUnverifiedException | SSLProtocolException | ProtocolException | UnknownHostException e) { // if the above list of exceptions changes, also change it in IndexV1Updater.update() - Log.e(TAG, e.getLocalizedMessage()); + Log.e(TAG, "CONNECTION_FAILED: " + e.getLocalizedMessage()); sendBroadcast(uri, Downloader.ACTION_CONNECTION_FAILED, localFile, repoId, canonicalUrl); } catch (IOException e) { e.printStackTrace(); From 272a0e3f27fa5b18ad72fb3c3dc348f4952cc32c Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Apr 2019 14:37:04 +0200 Subject: [PATCH 4/6] fix crash when there is no cache when DeleteCacheService runs java.lang.NoSuchMethodError: No virtual method toPath()Ljava/nio/file/Path; in class Ljava/io/File; or its super classes (declaration of 'java.io.File' appears in /system/framework/core-oj.jar) at org.apache.commons.io.FileUtils.isSymlink(FileUtils.java:3107) at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:1616) at org.fdroid.fdroid.DeleteCacheService.onHandleWork(DeleteCacheService.java:30) at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:391) at android.support.v4.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:382) at android.os.AsyncTask$2.call(AsyncTask.java:304) at java.util.concurrent.FutureTask.run(FutureTask.java:237) --- app/src/main/java/org/fdroid/fdroid/DeleteCacheService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/DeleteCacheService.java b/app/src/main/java/org/fdroid/fdroid/DeleteCacheService.java index b526cc2ed..9e05f5d89 100644 --- a/app/src/main/java/org/fdroid/fdroid/DeleteCacheService.java +++ b/app/src/main/java/org/fdroid/fdroid/DeleteCacheService.java @@ -27,7 +27,10 @@ public class DeleteCacheService extends JobIntentService { Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); Log.w(TAG, "Deleting all cached contents!"); try { - FileUtils.deleteDirectory(getCacheDir()); + File cacheDir = getCacheDir(); + if (cacheDir != null) { + FileUtils.deleteDirectory(cacheDir); + } for (File dir : ContextCompat.getExternalCacheDirs(this)) { FileUtils.deleteDirectory(dir); } From d2fea72ed9322af0b7454c9747d837f1643e4037 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Apr 2019 23:08:39 +0200 Subject: [PATCH 5/6] always update itself last When auto-updates are enabled, the app should update itself last, to ensure that all of the other apps are completely updated before this app is killed as part of the update process. closes #1556 --- .../java/org/fdroid/fdroid/UpdateService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java index e4627e4e7..980dc8dc8 100644 --- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java +++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java @@ -544,12 +544,27 @@ public class UpdateService extends JobIntentService { } } + /** + * Queues all apps needing update. If this app itself (e.g. F-Droid) needs + * to be updated, it is queued last. + */ public static void autoDownloadUpdates(Context context) { List canUpdate = AppProvider.Helper.findCanUpdate(context, Schema.AppMetadataTable.Cols.ALL); + String packageName = context.getPackageName(); + App updateLastApp = null; + Apk updateLastApk = null; for (App app : canUpdate) { + if (TextUtils.equals(packageName, app.packageName)) { + updateLastApp = app; + updateLastApk = ApkProvider.Helper.findSuggestedApk(context, app); + continue; + } Apk apk = ApkProvider.Helper.findSuggestedApk(context, app); InstallManagerService.queue(context, app, apk); } + if (updateLastApp != null && updateLastApk != null) { + InstallManagerService.queue(context, updateLastApp, updateLastApk); + } } private void showAppUpdatesNotification(List canUpdate) { From 4f771c4add4aac021584025e2e285c666fb8472a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 9 Apr 2019 23:17:00 +0200 Subject: [PATCH 6/6] gitlab-ci: update emulator in Q job to version that works with Q --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e1ad78c54..d9b823fd9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -69,6 +69,8 @@ errorprone: - if [[ "$AVD_ARCH" != arm* ]]; then set -x; echo y | sdkmanager "emulator" > /dev/null; set +x; + elif [[ "$AVD_SDK" == Q ]]; then + set -x; echo y | sdkmanager --channel=2 "emulator" > /dev/null; set +x; fi - alias sdkmanager