android - 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>;
}
解决方案
这个问题似乎解决了与您相同的问题:R8将抽象类的“受保护”方法更改为“公共”
那里的答案归结为-allowaccessmodification
从您的 proguard 文件中删除。
最简单的方法是将生成的默认 proguard 文件(您无法控制)复制到模块的proguard.pro
文件(您可以)中。然后,您可以编辑后者并在您的模块中使用它,build.gradle
而无需任何默认文件。
推荐阅读
- c# - VS2017中的单元测试
- python - 如何将列表列表插入表中?[Python]
- google-apps-script - 找不到方法 createAllDayEvent(string,string,object)
- android - 2018 年的手势生成器?
- vba - 如何通过名称引用列(例如“someColumn”)?
- javascript - 使 for...of 跳过循环最后一个元素
- haskell - 为什么我的 ord 功能不起作用
- tfs - 调用执行程序“executor://xunit/VsTestRunner2/uap”时发生异常:无法加载文件或程序集“System.IO.FileSystem”
- c# - 用实体更新列表的正确方法是什么?
- c++ - 递归楼梯中的基本情况?