将代码转换为 (G+H) 后应用程序崩溃。 GMS 和 HMS 支持

Posted

技术标签:

【中文标题】将代码转换为 (G+H) 后应用程序崩溃。 GMS 和 HMS 支持【英文标题】:Application crashes after converting code to (G+H). GMS and HMS support 【发布时间】:2021-04-05 21:27:33 【问题描述】:

我已经在 HMS 工具包的帮助下转换了代码以支持 GMS 和 HMS。但转换后,它崩溃并抛出异常。

进程:com.example.android.wander.huawei,PID:10649 java.lang.VerifyError: Verifier denied class com.example.android.wander.huawei.MapsActivity: void com.example.android.wander.huawei.MapsActivity.onCreate(android.os.Bundle) 验证失败: void com.example .android.wander.huawei.MapsActivity.onCreate(android.os.Bundle): [0x11] 'this' 参数'Reference: androidx.fragment.app.FragmentManager' 不是'Reference: androidx.fragment.app.FragmentManager' 的实例('com.example.android.wander.huawei.MapsActivity'的声明出现在/data/app/~~M8blTtc1ehsAE-ySiPYUtQ==/com.example.android.wander.huawei-0H3LEYclNRMAw9Pq-MrWww==/base.apk ) 在 java.lang.Class.newInstance(本机方法) 在 android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) 在 androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) 在 android.app.Instrumentation.newActivity(Instrumentation.java:1253) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

在我从应用程序类中删除该行之后。

XLoader.init(this);

这个异常消失了,然后

SupportMapFragment.newInstance()

抛出运行时异常“存根”

【问题讨论】:

【参考方案1】:

请参考Map Kit Manual Conversion Guide 并按照指南一步步操作。 Add HMS API转换完成后,可以配置ClassLoader(简单,只需要资源导入和配置文件修改)或手动编写代码(复杂,人工转换工作量大)实现Google API与HMS的兼容活动显示在片段中。

目前ClassLoader解决方案不支持项目中的插件或热修复框架,也不支持ClassLoader自定义。如果您的应用有这样的要求,请手动编写代码。


Configuring the ClassLoader

使用Add HMS API策略时,提供XClassLoader解决方案,解决部分API无法以组合方式转换的问题。该方案用于减少手动修改资源的工作量。在这种模式下,该工具会在 xmsadapter 模块中生成一个内置的 xmsaux 模块。 xmsaux 模块包含 xg、xh 和 xapi 模块以及 XClassLoader 代码。

    修改项目相关配置文件。

一个。如果选择了Generate code for creating application only based on GMS SDK并启用了单个xmsg风味变体,请在项目级设置中修改参考配置。 gradle 文件如下:

include ':xmsadapter:xmsaux', 'xmsadapter:xmsaux:xg', 'xmsadapter:xmsaux:xapi'

如果选择生成仅依赖HMS SDK的应用的代码,并启用单一xmsh风味变体,则在项目级修改参考配置settings.gradle 文件如下:

include ':xmsadapter:xmsaux', 'xmsadapter:xmsaux:xh', 'xmsadapter:xmsaux:xapi'

如果选择了上述任何一种模式并启用了单个 xmsgh 风格变体,请修改项目级 settings.gradle 文件中的参考配置,如下所示:

include ':xmsadapter:xmsaux', 'xmsadapter:xmsaux:xg', 'xmsadapter:xmsaux:xh', 'xmsadapter:xmsaux:xapi'

b.在项目级 build.gradle 文件的 dependencies 部分中,将 Gradle 插件版本设置为 3.5.0 或更高版本。

buildscript 
    dependencies 
        classpath 'com.android.tools.build:gradle:3.5.0'
    

c。在项目级 gradle/wrapper/gradle-wrapper.properties 文件中,将 Gradle 版本设置为 5.4.1 或更高版本。

distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

d。对于多模块项目,在项目级目录下的gradle.properties文件中添加如下配置:

android.enableD8=false
android.enableD8.desugaring=false
    在程序入口处调用init方法来初始化程序。 一种。实现一个程序入口类,继承应用中的android.app.Application,并覆盖类中的onCreate方法。
public class MyApp extends Application 
    @Override
    public void onCreate() 
        super.onCreate();
        GlobalEnvSetting.init(this,null);
        XLoader.init(this);
    

b.修改应用级 src/main/AndroidManifest.xml 文件中的 application name 属性,并在第一个条目中添加新的 application 子类。

<application
    android:name=".MyApp"
</application>
    处理异常。

Manually Writing Code

    修改布局资源文件。在 Add HMS API 场景中,Google API 和 HMS 需要使用独立的布局资源文件。资源文件中的 class 路径不同。每个布局资源文件必须一式两份,一份用于 HMS,另一份用于 Google API。这些文件与代码一起用于兼容重定向。

    修改代码。 如果使用Fragment,可以在activityonCreate()方法中使用if-else与 HMS 和 Google API 兼容的代码副本。

【讨论】:

遵循了给定的说明,但没有消除错误。 @Tahaalam 您能否提供 build.gradlesetting.gradleBuild Variants 的屏幕截图?

以上是关于将代码转换为 (G+H) 后应用程序崩溃。 GMS 和 HMS 支持的主要内容,如果未能解决你的问题,请参考以下文章

更新后 - 崩溃 com.google.android.gms:play-services:5.2.8

无法将类型“Android.Support.V4.App.Fragment”转换为“Android.Gms.Maps.MapFragment”

尝试构建我的项目时,将 gms/firebase 升级到版本 15.0.0 会导致 gradle 崩溃? [复制]

MapsActivity 无法转换为 com.google.android.gms.location.LocationListener

谷歌出的新aab格式三星产品到时候会修改格式嘛?

将 com.google.gms:google-services:4.3.10 添加为项目 build.gradle 文件的类路径后下载时出现问题