我正在开发一个开源应用程序(droidwall fork),我遇到的问题之一是当系统重新启动时iptables规则没有正确应用。它适用于大多数Android版本。但是在某些特定的ROMS(CM 10.1)上,它提供了以下logcat
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课程here。
答案 0 :(得分:8)
12-26 08:39:27.116我/ ActivityManager(582):不再需要dev.ukanth.ufirewall(pid 2297):空#17
此日志表示您已达到允许的最大空进程数。 (16是你的最大值)
更多关于来自android doc的empty processes:
不包含任何活动应用程序组件的进程。保持这种进程活着的唯一原因是缓存目的,以便在下次组件需要运行时改善启动时间。系统通常会杀死这些进程,以便在进程缓存和底层内核缓存之间平衡整个系统资源。
因此,不确定您的日志直接与您的iptables规则问题相关。
答案 1 :(得分:6)
方法onReceived()
完成后,系统会假定您已完成BroadcastReceiver
并将托管流程设置为最低优先级。我们知道,吐温机处理程序的handleMessage()
方法是异步调用的,在onReceived()
方法完成后调用,并且无法保证该进程仍然在那里执行回调方法
<登记/>
在大多数Android版本中,在系统启动时运行的进程数量不是很多,并且您的进程(具有最低优先级)有机会保持活动状态,直到调用回调方法handleMessaged()
,但使用ROMS( CM 10.1),可能有那么多进程正在运行,系统必须杀死较低优先级的进程以释放资源,以便更高优先级的进程可以正常运行,并且您的进程是一个被杀死的好候选者。
我建议您启动一项服务来执行这些异步任务,这会使您的进程具有更高的优先级(默认情况下服务进程优先级,或者您可以使用startForeground()
方法获取前台进程优先级)
答案 2 :(得分:0)
也许你可以使用mHandler.post一段时间来测试你的情况,比如20秒?