2

我正在尝试创建一个在系统服务器之外运行的 java 服务,它将从引导开始,它基于配置可以监视 Android 设备并监听广播。我一直无法找到有关如何编写作为非 zygote 启动的进程运行的长时间运行的 java 服务的文档。我正在尝试修改平台,并且此服务将添加到通过重建 Android 源代码生成的自定义 system.img 中。

该服务的启动类似于用于从 adb 运行 am 的脚本。

base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"

我发现尝试添加守护程序的唯一示例是实现在设备上运行的完全本机服务。

嵌入式Android 描述了 Android 用户空间和在那里运行的一些本机守护进程,以及如何创建服务并将它们添加到 init 以在设备启动时至少在 Zygote 和系统服务器等之前启动。

public class Monitor{
    public static void main(String [] args){
        new Monitor.run();
    }
    public void run(){
         Application app = new Application();
         Context con = app.getApplicationContext();
         BroadcastReceiver receiver = new BroadcastReceiver(){
             public void onReceive(Context context, Intent intent){
                 Log.i(TAG, "Received intent:"+ intent.getAction());
             }   
         }
         IntentFilter filter = new IntentFilter("android.intent.action.TIME_TICK")
    }
}

我还根据 ActivityManagerService 中的一段代码尝试了这个。公共类监视器{私有上下文mContext;

    Monitor(){
        Looper.prepare()
        ActivityThread at = ActivityThread.systemMain();
        mContext = at.getSystemContext();
    }
    public static void main(String [] args){
        new Monitor.run();
    }
    public void run(){
         BroadcastReceiver receiver = new BroadcastReceiver(){
             public void onReceive(Context context, Intent intent){
                 Log.i(TAG, "Received intent:"+ intent.getAction());
             }   
         }
         IntentFilter  filter = new IntentFiler("android.intent.action.AIRPLANE_MODE");
         mContext.registerReceiver(receiver,filter);
    }
}

我可以使用 adb 和 am 从命令行生成意图/广播,但无论如何都可以接收广播。任何意见或建议表示赞赏。

4

1 回答 1

0

Activity 管理器具有防止 non_Apps/Zygote 进程在 Android 中接收广播的代码。最终使用不同的方法来满足我自己的需求。

public Intent registerReceiver(IApplicationThread caller, String 
callerPackage, 
        IIntentReceiver receiver, IntentFilter filter, String 
permission, int userId) { 
    enforceNotIsolatedCaller("registerReceiver"); 
... 
} 
于 2013-01-23T19:57:51.363 回答