У меня есть системное приложение 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 и мне нужно это запутать, я был бы признателен, если бы кто-то мог сказать мне, какие правила я могу указать для решения этой проблемы