2015-09-11 12 views
12

消費アプリケーションのマニフェストにエントリが必要な@AARがあります。私のライブラリーのブートストラップ中に、私はAndroidManifest.xmlを必要な受信機について検査し、見つからなければ、RuntimeExceptionを私のライブラリーが正しく機能しないので投げます。これは99%のインストールで機能しますが、受信者がはっきりと存在する場合はRuntimeExceptionを投げるインストールが少数あります。マニフェストで定義されたレシーバが見つからない〜1%の時間

Android v4.4 - v5.1.1はすべてクラッシュレポートに含まれています。 Samsung、Lenovo、Nexus 4、Nexus 5などはすべて影響を受けるデバイスです。

最も興味深いのは、クラッシュの75%がルートデバイスにあることです。これは、カスタムROMまたは受信機の検出を妨害する他のアプリケーションの結果であると推測されています。

私はrooted Nexus 5 w/4.4.4でテストしても問題ありません。私は在庫Nexus 5 w/5.1.1でテストしました。うまくいきます。 CyanogenMod 12.1(最新リリース)を実行しているNexus 5でテストしたところ、正常に動作しています。私は利用可能なすべてのプライバシーガードのオプションを適用し、それでも正常に動作します。

本当に紛失して、影響を受けるユーザーを放棄したくありません。

のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 

    <permission 
     android:name="${applicationId}.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

    <application> 
     <receiver 
      android:name="com.example.MyBroadcastReceiver" 
      android:exported="true" 
      android:permission="com.google.android.c2dm.permission.SEND"> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

       <category android:name="${applicationId}" /> 
      </intent-filter> 
     </receiver> 
     <!-- Activities, etc. removed for brevity --> 
    </application> 
</manifest> 

クラス

public class CheckSetup { 

     // Other methods removed for brevity 

    public void checkManifest() { 
     List<ResolveInfo> receiversInfo; 

     Intent checkIntent = new Intent(applicationContext, MyBroadcastReceiver.class); 
     receiversInfo = packageManager.queryBroadcastReceivers(checkIntent, 0); 

     boolean receiverFound = false; 

     if (receiversInfo != null) { 
      for (ResolveInfo resolveInfo : receiversInfo) { 
       if (resolveInfo.activityInfo != null && resolveInfo.activityInfo.name.equals(MyBroadcastReceiver.class.getName()) && resolveInfo.activityInfo.packageName.equals(packageName)) { 
        receiverFound = true; 
       } 
      } 
     } 

     if (!receiverFound) { 
      throw new RuntimeException(String.format("%s definition not found in AndroidManifest.xml", MyBroadcastReceiver.class.getName())); 
     } 
    } 
} 

答えて

0

この動作を再現できる唯一の方法は、ServicesReceiversを選択的に無効にするサードパーティのアプリケーションをインストールすることです。なぜ誰がこれをやりたいのか分からず、いったん無効にすると、AARからそれらを再び有効にする方法はありません。

最善のケースは、開発中に例外をスローし、生産されたリリース用のLogCatに出力することです。

、このようなアプリの例としては、ここで見つけることができます:

https://play.google.com/store/apps/details?id=cn.wq.myandroidtools

-1

あなたが削除できアンドロイド:= "true" をエクスポートして、確認してください?理想的なアンドロイド:エクスポートされたfalseにする必要があります。

+0

理想的には?このドキュメントでは、他にはhttp://developer.android.com/guide/topics/manifest/receiver-element.htmlと記載していますが、上記のように、このコードが実行されるデバイスの99.9%で動作します。 –

関連する問題