如何解决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
及其子目录cache
和code_cache
- 我修改了
packages.xml
和packages.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>
。这些都没有帮助。
我的问题是:
解决方法
没关系,我在问这个问题一天后发现了一个解决方案。
如果您遇到过这样的问题,出于某种原因,您需要像这样启动服务:
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 举报,一经查实,本站将立刻删除。