繁体   English   中英

Proguard android找不到引用的类

[英]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

另外,如果扩展ApplicationService ,那么您还将需要以下指令:

-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM