adb push系统apk后,找不到新加的Service

push系统apk后,找不到新加的Service,手动调用start service后,一直提示找不到对应的service

Intent intent2 = new Intent();
ComponentName componentName2 = new ComponentName(SERVICE_PACKAGE_NAME, CAST_SERVICE_CLASS_NAME);
intent2.setComponent(componentName2);
Log.d(TAG, "start "+CAST_SERVICE_CLASS_NAME);
mContext.startService(intent2);
adb push xxx.apk /system/app/xxx

重启设备后,系统如下提示

2024-01-01 08:00:15.341 950-2206 ActivityManager system_server W Unable to start service Intent { cmp=com.xxx.xxx/.cast.xxx} U=0: not found

然后将apk pull出来,反编译检查在AndroidManifest中是否有新加的service声明,发现都是正常的,并且新修改的代码都是生效的,但是就是新加的service就是找不到,无论是apk内部调用还是外部启动。

怀疑跟缓存没有清理有关,找到了几处缓存,都没有用

adb shell "rm -rf /data/dalvik-cache/arm64/system@app@xxx@xxx.apk@classes.dex"
adb shell "rm -rf /data/dalvik-cache/arm64/system@app@xxx@xxx.apk@classes.vdex"

最终发现,问题原因是在push apk跟install apk的流程区别

adb push

  • 安装逻辑:纯粹文件拷贝,把 APK 放到指定目录,比如 /system/app/YourApp/YourApp.apk/system/priv-app/YourApp/YourApp.apk

  • 生效条件

    • 需要重启或者至少 pm install -r <apk路径> / pm scan 触发 PackageManager 重新扫描 system 分区,才能识别出这个APK。

    • 或者直接删掉 /data/system/package_cache,再重启。

  • 常见问题

    • 如果直接 push 覆盖旧的 system APK,不重启是不会立刻生效的。

    • 如果 push 进去了,但是 pm 扫描时签名和原来不一致,会导致 INSTALL_FAILED_UPDATE_INCOMPATIBLE 或直接不加载。

    • 系统分区一般只读,需要 adb remount 才能写。

手动删除/data/system/package_cache缓存,重启,Service正常启动了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值