首页 > 解决方案 > Android ProGuard androidx 保持受保护的方法,但发布是公开的

问题描述

Android ProGuard with androidx lib,Activity protected 方法改为 public。

我有一个基本活动扩展了“androidx.appcompat.app.AppCompatActivity”。我已经将受保护的 onCreate() 方法覆盖为受保护的类型。但是我使用下面这样的 ProGuard 规则,受保护的 onCreate() 已更改为 public onCreate()。为什么?可以修复吗?

-optimizationpasses 5
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.support.multidex.MultiDexApplication
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}
-keep class androidx.** {*;}
-keep public class * extends androidx.appcompat.app.AppCompatActivity

-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * {
    void *(**On*Event);
    void *(**On*Listener);
}
-keepclassmembers class * extends android.app.Activity {
     public void *(android.view.View);
}
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
-keep class **.R$* {
    *;
}
-keepclassmembers class * {
    void *(*Event);
}
-keepclasseswithmembers public class * {
    protected <methods>;
    public <methods>;
} 
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
-keepclasseswithmembernames class * {
    native <methods>;
}

标签: androidandroid-activityproguardandroidx

解决方案


这个问题似乎解决了与您相同的问题:R8将抽象类的“受保护”方法更改为“公共”

那里的答案归结为-allowaccessmodification从您的 proguard 文件中删除。

最简单的方法是将生成的默认 proguard 文件(您无法控制)复制到模块的proguard.pro文件(您可以)中。然后,您可以编辑后者并在您的模块中使用它,build.gradle而无需任何默认文件。


推荐阅读