diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index 82d7518633..0b1e3391ca 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -17,12 +17,13 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; +import androidx.webkit.WebViewCompat; import com.android.apksig.ApkVerifier; import com.android.apksig.internal.apk.ApkSigningBlockUtilsLite; import com.g00fy2.versioncompare.Version; import com.gh.common.xapk.XapkInstaller; -import com.gh.download.DownloadManager; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.utils.ExtensionsKt; @@ -34,7 +35,6 @@ import com.gh.gamecenter.manager.PackagesManager; import com.gh.vspace.VHelper; import com.gh.vspace.db.VGameEntity; import com.halo.assistant.HaloApp; -import com.lightgame.download.DownloadEntity; import com.lightgame.utils.Utils; import net.dongliu.apk.parser.ApkFile; @@ -47,6 +47,8 @@ import org.json.JSONObject; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -60,6 +62,7 @@ import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; public class PackageUtils { @@ -902,4 +905,42 @@ public class PackageUtils { return result; } + public static String getWebviewPath(Context context) { + final PackageInfo webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(context); + return webViewPackageInfo != null ? webViewPackageInfo.applicationInfo.sourceDir : null; + } + + @WorkerThread + public static List getApkAbiList(String path) { + File file = new File(path); + List abiList = new ArrayList<>(); + if (!file.exists()) return abiList; + InputStream inputStream; + try { + inputStream = new FileInputStream(file); + ZipInputStream zipInputStream = new ZipInputStream(inputStream); + ZipEntry zipEntry; + while ((zipEntry = zipInputStream.getNextEntry()) != null) { + final String name = zipEntry.getName(); + if (name.startsWith("lib/armeabi-v7a") + || name.startsWith("lib/arm64-v8a") + || name.startsWith("lib/x86") + || name.startsWith("lib/armeabi") + || name.startsWith("lib/x86_64")) { + String abiName = name.substring(4, name.lastIndexOf("/")); + if (!abiList.contains(abiName)) { + abiList.add(abiName); + } + } + } + zipInputStream.close(); + inputStream.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return abiList; + } + } diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index 9ef89f9f38..86288b1969 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -4,6 +4,7 @@ import android.app.Application; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageInfo; import android.net.ConnectivityManager; import android.net.Uri; import android.os.Build; @@ -15,6 +16,7 @@ import androidx.annotation.NonNull; import androidx.collection.ArrayMap; import androidx.lifecycle.ProcessLifecycleOwner; import androidx.multidex.MultiDexApplication; +import androidx.webkit.WebViewCompat; import androidx.work.Configuration; import com.alibaba.android.arouter.launcher.ARouter; @@ -26,7 +28,6 @@ import com.facebook.imagepipeline.core.MemoryChunkType; import com.facebook.imagepipeline.decoder.ImageDecoderConfig; import com.gh.base.GlobalActivityLifecycleObserver; import com.gh.common.FixedRateJobHelper; -import com.gh.common.exposure.ExposureManager; import com.gh.common.filter.RegionSettingHelper; import com.gh.common.util.DataUtils; import com.gh.common.util.DownloadNotificationHelper; @@ -36,12 +37,10 @@ import com.gh.common.util.PackageHelper; import com.gh.common.util.PackageUtils; import com.gh.common.videolog.VideoRecordUtils; import com.gh.gamecenter.BuildConfig; -import com.gh.gamecenter.provider.ChannelProviderImp; import com.gh.gamecenter.Injection; import com.gh.gamecenter.common.constant.Config; import com.gh.gamecenter.common.constant.Constants; import com.gh.gamecenter.common.image.EmptyDecoder; -import com.gh.gamecenter.common.loghub.LoghubUtils; import com.gh.gamecenter.common.tracker.Tracker; import com.gh.gamecenter.common.utils.DeviceUtils; import com.gh.gamecenter.common.utils.EmulatorUtil; @@ -52,11 +51,13 @@ import com.gh.gamecenter.common.utils.PackageFlavorHelper; import com.gh.gamecenter.common.utils.TimestampUtils; import com.gh.gamecenter.core.AppExecutor; import com.gh.gamecenter.core.iinterface.IApplication; +import com.gh.gamecenter.core.utils.GsonUtils; import com.gh.gamecenter.core.utils.SPUtils; import com.gh.gamecenter.entity.SubjectRecommendEntity; import com.gh.gamecenter.fragment.MainWrapperRepository; import com.gh.gamecenter.packagehelper.PackageRepository; import com.gh.gamecenter.provider.ChannelProvider; +import com.gh.gamecenter.provider.ChannelProviderImp; import com.gh.gamecenter.receiver.ActivitySkipReceiver; import com.gh.gamecenter.receiver.DownloadReceiver; import com.gh.gamecenter.receiver.InstallAndUninstallReceiver; @@ -72,8 +73,8 @@ import com.shuyu.gsyvideoplayer.cache.CacheFactory; import com.shuyu.gsyvideoplayer.player.PlayerFactory; import java.lang.reflect.Method; +import java.util.List; import java.util.ServiceLoader; -import java.util.concurrent.ExecutorService; import io.reactivex.plugins.RxJavaPlugins; import tv.danmaku.ijk.media.exo2.Exo2PlayerManager; @@ -101,6 +102,7 @@ public class HaloApp extends MultiDexApplication implements Configuration.Provid public boolean isRunningForeground = false; // 标记当前 APP 是否处于前台运行中 private ChannelProvider mChannelProvider = new ChannelProviderImp(); private final ServiceLoader mApplicationList = ServiceLoader.load(IApplication.class, this.getClass().getClassLoader()); + public List webViewAbiList; public static void put(String key, Object object) { sObjectMap.put(key, object); @@ -274,7 +276,7 @@ public class HaloApp extends MultiDexApplication implements Configuration.Provid FixedRateJobHelper.begin(); RegionSettingHelper.getRegionSetting(); - + ExtensionsKt.doOnMainProcessOnly(this, () -> { retrieveVGameInfoIfNeeded(); PackageRepository.initData(); @@ -288,6 +290,8 @@ public class HaloApp extends MultiDexApplication implements Configuration.Provid initTimeConsumingAction(); + getWebviewAbiList(); + // 注册回调以用于做各种统计 ProcessLifecycleOwner.get().getLifecycle().addObserver(new ProcessorLifeCycleOwner()); @@ -310,6 +314,26 @@ public class HaloApp extends MultiDexApplication implements Configuration.Provid ARouter.init(this); // 尽可能早,推荐在Application中初始化 } + private void getWebviewAbiList() { + int versionCode = SPUtils.getInt(Constants.SP_WEBVIEW_VERSION_CODE); + final PackageInfo webviewPackageInfo = WebViewCompat.getCurrentWebViewPackage(this); + if (webviewPackageInfo == null) return; + int webviewVersionCode = webviewPackageInfo.versionCode; + String json = SPUtils.getString(Constants.SP_WEBVIEW_ABI_LIST); + if (versionCode == webviewVersionCode && !json.isEmpty()) { + webViewAbiList = GsonUtils.fromJsonList(json); + return; + } + AppExecutor.getIoExecutor().execute(() -> { + final String webviewPath = PackageUtils.getWebviewPath(this); + if (webviewPath == null) return; + final List abiList = PackageUtils.getApkAbiList(webviewPath); + webViewAbiList = abiList; + SPUtils.setString(Constants.SP_WEBVIEW_ABI_LIST, GsonUtils.toJson(abiList)); + SPUtils.setInt(Constants.SP_WEBVIEW_VERSION_CODE, webviewVersionCode); + }); + } + private void initThirdPartySdk() { DataUtils.init(this, mChannel); } diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt b/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt index 3158e03941..78c1d5339d 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt @@ -52,6 +52,7 @@ import com.gh.gamecenter.message.MessageDetailFragment import com.gh.gamecenter.personal.PersonalFragment import com.gh.gamecenter.common.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp import com.lightgame.utils.Utils import com.zhihu.matisse.Matisse import com.zhihu.matisse.MimeType @@ -674,11 +675,16 @@ class WebFragment : LazyFragment(), IScrollable { Constants.LOGOUT_ADDRESS_DEV == mBinding?.newsWebview?.url || Constants.LOGOUT_ADDRESS == mBinding?.newsWebview?.url private fun updateIsWebViewInstalled() { + val webViewAbiList = HaloApp.getInstance().webViewAbiList mIsWebViewInstalled = - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - true + if (webViewAbiList != null) { + Build.CPU_ABI == "arm64-v8a" && webViewAbiList.contains(Build.CPU_ABI) } else { - WebViewCompat.getCurrentWebViewPackage(requireContext()) != null + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + true + } else { + WebViewCompat.getCurrentWebViewPackage(requireContext()) != null + } } } diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java index 6e298fbf37..6392c07fe4 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java @@ -259,6 +259,10 @@ public class Constants { public static final String SP_GAME_NAVIGATION = "game_navigation"; // V游戏空间是否被使用过 public static final String SP_IS_VSPACE_USED = "is_vspace_used"; + //webview version code + public static final String SP_WEBVIEW_VERSION_CODE = "webview_version_code"; + //webview abi + public static final String SP_WEBVIEW_ABI_LIST = "webview_abi_list"; //手机号码匹配规则 public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";