7

私はオープンソースアプリケーション(droidwall fork)に取り組んでいますが、システムの再起動時にiptablesルールが正しく適用されなかったという問題の1つで立ち往生しています。ほとんどのAndroidバージョンで完全に機能します。しかし、いくつかの特定のROM(CM 10.1)では、次のログキャットが表示されます

12-26 08:39:27.116 I/ActivityManager(582): 
No longer want dev.ukanth.ufirewall (pid 2297): empty #17

私のコードは以下のように機能します、

private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void onReceive(final Context context, final Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        if (Api.isEnabled(context.getApplicationContext())) {
            final Handler toaster = new Handler() {
                public void handleMessage(Message msg) {
                    if (msg.arg1 != 0) Toast.makeText(context, msg.arg1, Toast.LENGTH_SHORT).show();
                }
            };

            mHandler.post(  
            // Start a new thread to enable the firewall - this prevents ANR
            new Runnable() {
                @Override
                public void run() {
                    if (!Api.applySavedIptablesRules(context.getApplicationContext(), false)) {
                        // Error enabling firewall on boot
                        final Message msg = new Message();
                        msg.arg1 = R.string.toast_error_enabling;
                        toaster.sendMessage(msg);
                        Api.setEnabled(context.getApplicationContext(), false, false);
                    }
                }
            });
            // Start a new thread to enable the firewall - this prevents ANR
        }
        /*Intent i = new Intent(context, StartupService.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startService(i);*/
    }

私のApi.javaクラスはここにあります

4

3 に答える 3

8

12-26 08:39:27.116 I / ActivityManager(582):dev.ukanth.ufirewall(pid 2297)が不要になりました:空#17

このログは、許可されている空のプロセスの最大数に達したことを意味します。(あなたの場合は16が最大です)

android docからの空のプロセスの詳細:

アクティブなアプリケーションコンポーネントを保持していないプロセス。この種のプロセスを存続させる唯一の理由は、キャッシュの目的で、次にコンポーネントを実行する必要があるときの起動時間を改善するためです。システムは、プロセスキャッシュと基盤となるカーネルキャッシュの間でシステムリソース全体のバランスを取るために、これらのプロセスを強制終了することがよくあります。

したがって、あなたが持っているログがiptablesルールの問題に直接関連しているのかどうかはわかりません。

于 2012-12-26T17:10:51.790 に答える
6

メソッドonReceived()が終了すると、システムは、が終了したBroadcastReceiverと見なし、ホストされているプロセスを最低の優先度として設定します。また、トースターハンドラーのhandleMessage()メソッドは、メソッドの終了後に呼び出される非同期で呼び出されることがわかってonReceived()います。また、コールバックメソッドを実行するためにプロセスがまだ存在するという保証はありません。

ほとんどのAndroidバージョンでは、システムの起動時に実行されるプロセスの数- upはそれほど多くなく、プロセス(優先度が最も低い)はコールバックメソッドまで存続する機会がありますhandleMessaged()と呼ばれますが、ROMS(CM 10.1)では、実行中のプロセスが非常に多いため、システムは優先度の低いプロセスを強制終了してリソースを解放し、優先度の高いプロセスを適切に実行できるようにする必要があります。殺された。

これらの非同期タスクを実行するサービスを開始することをお勧めします。これにより、プロセスの優先度が高くなります(デフォルトでは、サービスプロセスの優先度、またはstartForeground()メソッドを使用してフォアグラウンドプロセスの優先度を取得できます)。

于 2013-01-29T10:06:26.583 に答える
0

たぶん、20秒のようにケースをテストするために少し遅れてmHandler.postを使用できますか?

于 2013-01-29T11:46:07.243 に答える