gpt4 book ai didi

android - 带有 appbundle 和 PROGUARD 的动态功能不起作用

转载 作者:行者123 更新时间:2023-12-02 04:20:31 26 4
gpt4 key购买 nike

概述:
由于proguard,我在从基本模块访问按需动态功能模块的 Activity 时遇到了问题。 (很可能我猜)

描述:
我已经实现了 按需 带有应用程序包并上传到 Play 商店的动态功能模块。
用它实现了带有自定义规则的proguard。
从 Play 商店下载应用程序并在运行时访问该模块后,该模块将被下载。刚下载完之后,我就要求从我的基本模块访问一个 Activity 到那个动态模块。
我收到如下错误

...
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{xxx.yyyyyy.zzzzzz.stage/xxx.yyyyyy.zzzzzz.apphub.appview.view.AppHubActivity}:
java.lang.ClassNotFoundException: Didn't find class "xxx.yyyyyy.zzzzzz.apphub.appview.view.AppHubActivity"
on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file
...
...

仅供引用:
xxx.yyyyyy.zzzzzz 是我为保护隐私而更改的包名。

讽刺:
整个代码在调试中完美运行,同时从本地应用程序包访问它 没有保护 .

我已经尝试了下面的所有链接来克服这个问题,但不能。
1) https://issuetracker.google.com/issues/120517460
2) https://github.com/android/plaid/issues/764
3) java.lang.NoClassDefFoundError:failed resolution of :Lorg/apache/http/ProtocolVersion
4) https://issuetracker.google.com/issues/79478779
5) https://github.com/android/app-bundle-samples/issues/17

我也尝试过我们可以使用的所有类型的 proguard 文件,但仍然无能为力。
还将这两个类都保留在proguard中:基础和动态模块 Activity 类,但没有成功。
希望在这里寻找解决方案。

更新:
不能在 android OS 8,9 中工作,但在 android 10 中工作文件。

最佳答案

这个月我开始在我的应用程序中实现动态功能模块,proguard 给了我一些问题。我也不想在不混淆代码的情况下将我的应用程序推送到 Playstore。所以这就是我在启用 proguard 的情况下解决这个问题的方法。

  • Android proguard 优化器已经保留了所有扩展 android.view.View 的类。这意味着任何扩展 View 类的类都不会被 proguard 混淆。

  • 所以我在我的特色模块中创建了一个类并扩展了 View 并仅覆盖了第一个方法,因为它不适用于我的 View 层次结构中的 View
    public class YourCalssName extends View {
    public YourClassName(Context context) {
    super(context);
    }

    public static void launchActivity(Activity activity){
    activity.startActivity(new Intent(activity,YourMainActivityInYourFeatureModule.class));
    }
    }
    但 Android proguard 优化器不保留方法名称。只保留 setter 和 getter。
    所以我在我的主应用程序中添加了一个 proguard 保留规则,以不混淆静态方法到扩展 android.view.View 的类
    -keepclassmembers public class * extends android.view.View {
    public static <methods>;
    }
    然后我使用反射调用静态方法来启动我的特色模块主要 Activity
    Class myClass = Class.forName("your_fully_qualified_name");//Without .class
    Method method = myClass.getDeclaredMethod("launchActivity",Activity.class);
    method.invoke(null, this) ;
    这将保留您的类名和启动特色模块 Activity 的方法及其静态方法。
    还要确保将此代码添加到特色模块中的所有 Activity 中
    @Override
    protected void attachBaseContext(Context base) {
    super.attachBaseContext(base)
    SplitCompat.installActivity(this);
    }

    关于android - 带有 appbundle 和 PROGUARD 的动态功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205208/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com