瀏覽代碼

Use custom threshold for what's consider a low RAM device

arkon 1 年之前
父節點
當前提交
8857b7e0c1

+ 2 - 3
app/src/main/java/eu/kanade/tachiyomi/App.kt

@@ -1,7 +1,6 @@
 package eu.kanade.tachiyomi
 
 import android.annotation.SuppressLint
-import android.app.ActivityManager
 import android.app.Application
 import android.app.PendingIntent
 import android.content.BroadcastReceiver
@@ -12,7 +11,6 @@ import android.os.Build
 import android.os.Looper
 import android.webkit.WebView
 import androidx.core.content.ContextCompat
-import androidx.core.content.getSystemService
 import androidx.lifecycle.DefaultLifecycleObserver
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ProcessLifecycleOwner
@@ -39,6 +37,7 @@ import eu.kanade.tachiyomi.di.PreferenceModule
 import eu.kanade.tachiyomi.network.NetworkHelper
 import eu.kanade.tachiyomi.network.NetworkPreferences
 import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate
+import eu.kanade.tachiyomi.util.system.DeviceUtil
 import eu.kanade.tachiyomi.util.system.WebViewUtil
 import eu.kanade.tachiyomi.util.system.animatorDurationScale
 import eu.kanade.tachiyomi.util.system.cancelNotification
@@ -157,7 +156,7 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory {
             callFactory(callFactoryInit)
             diskCache(diskCacheInit)
             crossfade((300 * [email protected]).toInt())
-            allowRgb565(getSystemService<ActivityManager>()!!.isLowRamDevice)
+            allowRgb565(DeviceUtil.isLowRamDevice(this@App))
             if (networkPreferences.verboseLogging().get()) logger(DebugLogger())
 
             // Coil spawns a new thread for every image load by default

+ 17 - 0
core/src/main/java/eu/kanade/tachiyomi/util/system/DeviceUtil.kt

@@ -1,7 +1,10 @@
 package eu.kanade.tachiyomi.util.system
 
 import android.annotation.SuppressLint
+import android.app.ActivityManager
+import android.content.Context
 import android.os.Build
+import androidx.core.content.getSystemService
 import logcat.LogPriority
 import tachiyomi.core.util.system.logcat
 
@@ -65,6 +68,20 @@ object DeviceUtil {
         "com.zui.resolver",
     )
 
+    /**
+     * ActivityManager#isLowRamDevice is based on a system property, which isn't
+     * necessarily trustworthy. 1GB is supposedly the regular threshold.
+     *
+     * Instead, we consider anything with less than 3GB of RAM as low memory
+     * considering how heavy image processing can be.
+     */
+    fun isLowRamDevice(context: Context): Boolean {
+        val memInfo = ActivityManager.MemoryInfo()
+        context.getSystemService<ActivityManager>()!!.getMemoryInfo(memInfo)
+        val totalMemBytes = memInfo.totalMem
+        return totalMemBytes < 3L * 1024 * 1024 * 1024
+    }
+
     @SuppressLint("PrivateApi")
     private fun getSystemProperty(key: String?): String? {
         return try {