微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

APK安装过程中的服务注册

如何解决APK安装过程中的服务注册

最近我一直在忙于 Android 内部结构。为了更好地理解 APK 的安装方式,我决定制作一个测试 APK 并在 root ADB shell 的帮助下手动安装它:

  • 我创建了一个应用程序目录 /data/app/com.example.myapp-y6zjC4JYhJKOph-sl-G5QA== 并将 APK 复制到那里(如 base.apk)。目录后缀是从另一台设备上的“正确”安装复制的,尽管我认为它可能是任何东西,因为它是 base64 编码的 random string
  • 我创建目录 /data/data/com.example.myapp 及其子目录 cachecode_cache
  • 修改packages.xmlpackages.list,并在其中添加一个关于我的应用程序的条目(同样,从另一个“正确的”安装中复制)。

在我重新启动设备后,我可以使用 adb shell pm list packages | grep myapp 验证应用程序是否已安装,它会找到我的软件包。我可以使用 adb shell am start -n com.example.myapp/.MainActivity 成功运行该应用程序。

但是,当我想在我的应用程序中实现一个服务(从 MainActivity.onStart 自动启动)时,该服务没有启动并在日志中打印一条错误消息:

ActivityManager: Unable to start service Intent { cmp=com.example.myapp/.MyService } U=0: not found

该服务也未显示dumpsys 中:

# adb shell dumpsys activity service com.example.myapp
No services match: com.example.myapp

调用 startService 的方式如下:

Log.e("MYAPP","About to start the service"); // This is printed to the log
Intent intent = new Intent(getApplicationContext(),MyService.class);
startService(intent);

我曾尝试将 getApplicationContext() 参数中的 this 更改为 Intent,但没有帮助。该服务已在 AndroidManifest.xml 中正确注册

<application ... >
 ...
    <activity android:name="com.example.myapp.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name="com.example.myapp.MyService" android:enabled="true"></service>
</application>

再一次,我尝试更改清单中的一些内容:将 com.example.myapp.MyService 更改为 .MyService,移除 enabled 标志并使用一行标记(以 /> 结尾) ) 而不是 <service>...</service>。这些都没有帮助。

我的问题是:

  • 为什么系统看不到我的服务?
  • 在 APK 安装过程中,有没有办法“注册”这些服务?我需要修改其他一些配置文件吗?

解决方法

没关系,我在问这个问题一天后发现了一个解决方案。

如果您遇到过这样的问题,出于某种原因,您需要像这样启动服务:

Intent intent = new Intent(getApplicationContext(),MyService.class);
intent.setClassName("com.example.myapp","com.example.myapp.MyService"); // add this line
startService(intent);

我不知道为什么会发生这种情况,意图似乎相同。当我在调用 intent.toString() 之前和之后将 intent.setClassName 打印到日志时,两行都如下所示:

Intent { cmp=com.example.myapp/.MyService }

如果有人知道这种行为的原因,请与我分享,因为我不知道为什么会这样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。