【发布时间】:2014-04-10 14:19:48
【问题描述】:
在我的活动中,我有一些在 android 11+ 上运行不佳的内联 AsyncTask,因此我决定将所有内联代码更改为内部类。 将所有内联 AsyncTask 更改为内部类后,我在 proguard 中收到此警告,我无法编译项目。在调试模式下一切正常。
这是我的 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>;
}
任何人都可以帮助或建议我解决方案吗? 谢谢
【问题讨论】:
标签: java android android-asynctask proguard inner-classes