[英]Proguard android can't find referenced class
在我的活动中,我有一些内联AsyncTask在android 11+上无法正常运行,因此我决定将所有内联代码更改为内部类。 将所有内联AsyncTask更改为内部类后,我在proguard中收到此警告,并且无法编译项目。 在调试模式下,一切正常。
这是我的保护者阻止的警告:
[proguard] Warning: com.test.MyActivity: can't find referenced class com.test.MyActivity$1
[proguard] Warning: com.test.MyActivity$MyBroadcastReceiver: can't find referenced class com.test.MyActivity$1
[proguard] Warning: com.test.MyActivity$MyBroadcastReceiver: can't find referenced class com.test.MyActivity$1
[proguard] Warning: com.test.MyActivity$MyBroadcastReceiver: can't find referenced class com.test.MyActivity$1
[proguard] Warning: com.test.MyActivity$LoadingTask: can't find referenced class com.test.MyActivity$1
[proguard] Warning: com.test.MyActivity$LoadingTask: can't find referenced class com.test.MyActivity$1
[proguard] Warning: com.test.MyActivity$LoadingTask: can't find referenced class com.test.MyActivity$1
这是我的实际活动代码:
public class MyActivity extends FragmentActivity {
private final WakefulBroadcastReceiver messageReceiver = new MyBroadcastReceiver();
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final LoadingTask task = new LoadingTask();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
task.execute();
}
}
private final class MyBroadcastReceiver extends WakefulBroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (context == getContext()) {
GcmBroadcastReceiver.completeWakefulIntent(intent);
setResultCode(Activity.RESULT_OK);
} else {
setResultCode(Activity.RESULT_CANCELED);
}
}
}
private final class LoadingTask extends AsyncTask<Void, Long, Boolean> {
private static final int MAX_SHOW_TIME = 120000;
private long startTime;
private LoadingDialog loadingDialog;
protected void onPreExecute() {
startTime = SystemClock.elapsedRealtime();
loadingDialog = new LoadingDialog(getContext());
loadingDialog.show();
}
protected Boolean doInBackground(Void... params) {
synchronized (this) {
long actualTime = SystemClock.elapsedRealtime();
while (!initialize) {
publishProgress((actualTime - startTime) / 1000);
try {
this.wait(250);
} catch (InterruptedException e) { }
actualTime = SystemClock.elapsedRealtime();
if (actualTime - startTime > MAX_SHOW_TIME) {
return false;
}
}
}
return true;
}
protected void onProgressUpdate(Long... values) {
loadingDialog.setProgressValue(values[0]);
}
protected void onPostExecute(Boolean result) {
loadingDialog.dismiss();
}
}
}
编辑:
默认的proguard配置:$ {sdk.dir} /tools/proguard/proguard-android.txt
定制的Proguard配置(proguard.txt)
-keepattributes Signature
-keep class android.** { *; }
-keep class com.facebook.** { *; }
-keepclassmembers interface * extends com.facebook.model.GraphObject { *; }
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
# Keep SafeParcelable value, needed for reflection. This is required to support backwards
# compatibility of some classes.
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
public static final *** NULL;
}
# Keep the names of classes/members we need for client functionality.
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
@com.google.android.gms.common.annotation.KeepName *;
}
# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keep class com.google.** { *; }
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-keepnames class com.test.client.** implements java.io.Serializable
-keepclassmembernames class com.test.client.** implements java.io.Serializable {
private !static <fields>;
}
有人可以帮忙或建议我解决方案吗? 谢谢
我遇到了同样的问题,并且更改了AsyncTask
的范围。 您可以尝试使用protected
:
...
protected final class LoadingTask extends AsyncTask<Void, Long, Boolean> {
...
在您的proguard-project.txt
文件中,您可能需要添加以下行:
-keep public class * extends android.app.Activity
-keep public class * extends android.content.BroadcastReceiver
另外,如果扩展Application
或Service
,那么您还将需要以下指令:
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
在读取输入之后和任何处理之前,将打印这些警告,因此-keep选项仍然无关紧要。
警告说明,已编译的com / test / MyActivity.class引用了匿名内部类com / test / MyActivity $ 1.class,但是找不到匿名内部类。 这表明该代码没有正确地重新编译。 查看源代码,我不会立即看到一个匿名内部类,因此该活动类尚未重新编译,或者它的旧副本在某些目录中徘徊,最终被读取为输入。 您应该从一个干净的项目开始,没有任何旧的.class文件,然后重新构建。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.