【问题标题】:Proguard config to use retrofit RetrofitProguard 配置使用改造改造
【发布时间】:2022-03-30 20:05:09
【问题描述】:

我的应用在调试中运行正常,但是在创建要发布的 apk 时,我收到以下错误。

Process: neocom.dealerbook, PID: 9044
    java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
            at java.util.ArrayList.get(ArrayList.java:308)
            at neocom.dealerbook.controller.k.a(MapActivity.java:103)
            at neocom.dealerbook.controller.k.success(MapActivity.java:98)
            at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

这里是 MapActivity.java:103

Callback<ClienteConfiguracao> callback = new Callback<ClienteConfiguracao>() {
                int failCount = 0;
            @Override
            public void success(ClienteConfiguracao clienteConfiguracao, Response response) {
                currentClient = clienteConfiguracao.getDealerships().get(0); /* Line 103 */
                setupToggles(currentClient);

                List<String> mAuthorization = clienteConfiguracao.getAuthorization();
                toAllowPermissions = new HashMap<>();
                Set<String> allImplementedKeys = PermissionManager.ALL_PERMISSIONS.keySet();
                for (String key : mAuthorization) {
                    if (allImplementedKeys.contains(key)) {
                        List value = PermissionManager.ALL_PERMISSIONS.get(key);
                        toAllowPermissions.put(key, value);
                    }
                }

这是我构建的 proguard 文件,用于搜索我得到的错误、改造站点和其他。

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
-dontwarn retrofit.**
-dontwarn com.squareup.okhttp.**
-dontwarn okio.**
-dontwarn retrofit.appengine.UrlFetchClient
-keep class retrofit.** { *; }
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepattributes *Annotation*
-keepattributes SourceFile
-keepattributes LineNumberTable


-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}

有什么建议吗?

【问题讨论】:

  • 您在哪一行得到错误?
  • 第103行,第二个代码sn -p的行尾有注释。

标签: java android proguard retrofit android-proguard


【解决方案1】:

当使用带有 gson 的改造时,将 Progard 规则添加到 序列化反序列化 的类中很重要。

例如:

-keep class com.example.model.** { *; }

PS:另一个建议是使用rules snippets from this repositoryaltlink。许多不同的库都有规则。

【讨论】:

  • 你是救生员
【解决方案2】:

问题来了

currentClient = clienteConfiguracao.getDealerships().get(0);

clienteConfiguracao.getDealerships() 为空。你需要检查它是否有一些元素与

if (clienteConfiguracao.getDealerships().size() > 0) {
    clienteConfiguracao.getDealerships().get(0);
} else {
    //handle empty ArrayList
}

【讨论】:

  • 如果它变空了,那就是 GSON 或 Proguard 中的 Retrofit。因为我确信如果改造成功返回会有一个价值。当不生成签名/保护 APK 时,永远不会发生此错误。
【解决方案3】:

只需添加-keep class com.google.gson.** { *; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2017-04-29
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多