【问题标题】:Proguard android can't find referenced classProguard android找不到引用的类
【发布时间】: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


    【解决方案1】:

    我遇到了同样的问题,并且更改了 AsyncTask 的范围有效。你可以试试protected:

    ...
    protected final class LoadingTask extends AsyncTask<Void, Long, Boolean> {
    ...
    

    【讨论】:

      【解决方案2】:

      在您的 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
      

      【讨论】:

      • 我的 proguard-project.txt 已经包含了这一行,但它不起作用
      • 发布您的proguard-project.txt 的内容,以便我看到您在做什么。
      • 我发布了proguard配置
      • 您发布了默认的 proguard 文件,而不是我问的项目中的 proguard-project.txt。此外,应在项目的proguard-project.txt 中设置特定于您项目的-keep class com.facebook.** { *; } 指令等。保留默认的 proguard-android.txtproguard-android-optimize.txt
      • 我说我使用默认的proguard。但是我发布的代码是针对我的应用程序的。我尝试更好地解释:我有 4 个库,每个库都有他的 proguard 配置,我发布的配置是库配置的总和。贴出的代码不是默认配置(部分代码类似于google play服务配置)
      【解决方案3】:

      这些警告是在读取输入之后和任何处理之前打印的,因此 -keep 选项仍然无关紧要。

      警告说明编译后的 com/test/MyActivity.class 引用了匿名内部类 com/test/MyActivity$1.class,但找不到匿名内部类。这表明代码没有被正确地重新编译。查看源代码,我没有立即看到匿名内部类,因此活动类没有被重新编译,或者它的旧副本在某个目录中徘徊并最终被读取为输入。您应该从一个干净的项目开始,在任何地方都没有任何旧的 .class 文件,然后重新构建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 2011-10-21
        相关资源
        最近更新 更多