ClassCastException при выполнении моего приложения с minifyEnabled true - PullRequest
0 голосов
/ 21 января 2020

У меня есть системное приложение android, в котором есть манифест BroadCastReceiver (должен запускаться на устройстве Android M): Мой манифест:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.system"
    package="mypackagename">

   ....

    <!-- custom permissions -->
    <uses-permission android:name="mypackagename.ASK_DISPLAY_INFO"
        android:protectionLevel="signatureOrSystem"/>

    <permission android:name="mypackagename.ASK_DISPLAY_INFO" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        ....

        <!-- custom receiver -->
        <receiver android:name=".CustomReceiver"
            android:permission="mypackagename.ASK_DISPLAY_INFO">
            <intent-filter>
                <action android:name="GET_HDMI_SUPPORTED_MODES"/>
                <action android:name="CHANGE_HDMI_RESOLUTION"/>
            </intent-filter>
        </receiver>



    </application>

</manifest>

И я включил в Gradle Обфускация Proguard:

        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        }

У меня есть другое тестовое приложение, которое отправляет трансляции в это приложение. Дело в том, что с mignifyEnabled false работает, но с mignifyEnabled true при получении широковещательного намерения выдает ошибку:

java .lang.RuntimeException: Невозможно создать экземпляр получателя mypackagename.CustomReceiver : java .lang.ClassCastException: mypackagename.CustomReceiver нельзя преобразовать в android .content.BroadcastReceiver

Добавление следующего правила в proguard-rules.pro:

-класс класса android .content.BroadcastReceiver {*; }

При получении намерения выдает ошибку:

java .lang.AbstractMethodError: абстрактный метод "void android .content.BroadcastReceiver.onReceive (android .content.Context, android .content.Intent) "

Вот мое определение приемника:


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;


public class CustomReceiver extends BroadcastReceiver {
    ...

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null) {
            Log.i(TAG, "CustomReceiver received action: "+intent.getAction());

            if (intent.getAction().equals(GET_HDMI_SUPPORTED_MODES)) {
                new GetHDMIModesTask(context).execute();
            }  else if (intent.getAction().equals(CHANGE_HDMI_RESOLUTION) && intent.getExtras() != null && intent.hasExtra(EXTRA_HDMI_MODE) ) {
                new ChangeHDMIModeTask(context, intent.getStringExtra(EXTRA_HDMI_MODE)).execute();
            }
        }

    }

}

Поскольку я очень новичок в Правила Proguard и мне нужно это запутать, я был бы признателен, если бы кто-то мог сказать мне, какие правила я могу указать для решения этой проблемы

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Я сделал обходной путь, удалил CustomerReceiver из манифеста, добавил пользовательский класс приложения и определил там BroadcastReceiver. Добавлены правила proguard:

 -keep class android.app.Application {
        public <fields>;
        private <fields>;
       public <methods>;
    }

    -keep public class * extends android.app.Application

Проблема исчезла

0 голосов
/ 22 января 2020

Добавьте -keep public class * extends android.content.BroadcastReceiver к вашим правилам защиты вместо -keep class android.content.BroadcastReceiver { *; }. Это предотвратит запутывание вашего пользовательского вещательного приемника.

...