1. ホーム
  2. アンドロイド

android セキュリティ: フラグ FLAG_RECEIVER_REGISTERED_ONLY の意味

2022-02-26 09:13:34


原作者に関しては、以下の出典を引用してください。

http://blog.csdn.net/gemmem/article/details/8859493


<スパン        時計ウィジェットを行っている友人は、ACTION_TIME_TICKに精通している必要があります、我々はすべてのUIインターフェイス上の時間を更新するには、この放送を使用しますが、アンドロイドの新しいバージョンが、TIME_TICK放送制限、システムはもはやTIME_TICK放送を受信するAndroidManifest.xmlで受信機の静的な登録を許可しない、プログラマがTIME_TICK放送を聞くために動的登録を使用して強制的に行われます。このような状況に遭遇したとき、皆さんはどのように感じるでしょうか?

<スパン もしかしたら、googleにコードを変更させられて、動的登録はメモリ不足でプロセスが殺されるかもしれないので失敗しがちだと文句を言っていたのかもしれませんね。

<スパン これって、開発者にとっては迷惑な話じゃないですか?

<スパン なぜgoogleは突然TIME_TICKをxmlで登録できなくなったのでしょうか?


TIME_TICKブロードキャストは、alarmManagerServiceから送信されるので、ソースコードを見てみましょう。

 AlarmManagerService.java

    public AlarmManagerService(Context context) {
        mContext = context;
        mDescriptor = init();

        // We have to set current TimeZone info to kernel
        // because kernel doesn't keep this after reboot
        String tz = SystemProperties.get(TIMEZONE_PROPERTY);
        if (tz ! = null) {
            setTimeZone(tz);
        }

        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
        
        mTimeTickSender = PendingIntent.getBroadcast(context, 0,
                new Intent(Intent.ACTION_TIME_TICK).addFlags(
                        Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);
        Intent intent = new Intent(Intent.ACTION_DATE_CHANGED);


キーコードは以下の通りです。

        mTimeTickSender = PendingIntent.getBroadcast(context, 0,
                new Intent(Intent.ACTION_TIME_TICK).addFlags(
                        Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);


googleがFLAG_RECEIVER_REGISTERED_ONLYフラグをインテントに追加したため、xml登録でエラーが報告されることが判明したのです。


ACTION_SCREEN_ON/OFFの放送に戻ろう

void com.android.server.PowerManagerService.initInThread()

<スパン

void initInThread() {  
    ......  
    mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON). mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ON);  
    mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);  
    mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF). mScreenOffIntent.addFlags(Intent;  
    mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);  
    ......  
}  


もう一つのブロードキャスト、ACTION_BATTERY_CHANGEDを見てみましょう。

バッテリーの残量が変化したときに、このブロードキャストを送信します。

void com.android.server.BatteryService.sendIntent()

private final void sendIntent() {  
    // Pack up the values and broadcast them to everyone  
    Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);  
    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY  
            | Intent.FLAG_RECEIVER_REPLACE_PENDING);  
    ......  
}  


ほらね。どれもFLAG_RECEIVER_REGISTERED_ONLYというフラグが付加されていますね。

つまり、これらのシステムブロードキャストはすべて動的にしか登録できないのです。

<スパン <スパン googleはこんなことをやっています。

多くのウイルスプログラムは、終了しても再び実行できるように、いくつかのシステムブロードキャストをxmlに登録し、これらのシステム高頻度ブロードキャストを利用して自己起動を実現しようとしています。

<スパン 例えば、古いバージョンのアンドロイドでは、ウイルスプログラムはTIME_TICKをリッスンすることでバックグラウンドで動作する独自のサービスを起動してこっそり仕事をし、たとえ自分が殺されてもすぐに再起動することができる。

<スパン そして、これらのシステムブロードキャストにフラグが立てられると  FLAG_RECEIVER_REGISTERED_ONLYで、これらのウイルスプログラムは運が悪いと言えます。

<スパン <スパン Googleのこの変更により、アンドロイドのセキュリティは確実に向上しました。