如何通过Apktool修改代码,让贴纸APP仅向com.gbwhatsapp添加贴纸?
解决方案:指定Intent目标包名以跳过选择弹窗
当然可以!要让你的贴纸Intent直接发送到com.gbwhatsapp而不弹出应用选择器,你需要给Intent设置Component,明确指定目标应用的包名和处理该贴纸Action的组件类。这样系统会直接把Intent路由到指定应用,不会出现选择弹窗。
具体的Smali代码修改
在你现有的代码后面,添加以下Smali代码来指定目标Component:
# 创建ComponentName实例,传入GBWhatsApp的包名和贴纸处理组件类名 new-instance v1, Landroid/content/ComponentName; const-string v2, "com.gbwhatsapp" const-string v3, "com.whatsapp.stickers.StickerPackDetailsActivity" invoke-direct {v1, v2, v3}, Landroid/content/ComponentName-><init>(Ljava/lang/String;Ljava/lang/String;)V # 给Intent绑定这个Component invoke-virtual {v0, v1}, Landroid/content/Intent->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;
完整代码片段
把新增代码整合后,最终的Smali代码应该是这样的:
new-instance v0, Landroid/content/Intent; invoke-direct {v0}, Landroid/content/Intent-><init>()V const-string v1, "com.whatsapp.intent.action.ENABLE_STICKER_PACK" invoke-virtual {v0, v1}, Landroid/content/Intent->setAction(Ljava/lang/String;)Landroid/content/Intent; # 新增:指定目标应用的Component new-instance v1, Landroid/content/ComponentName; const-string v2, "com.gbwhatsapp" const-string v3, "com.whatsapp.stickers.StickerPackDetailsActivity" invoke-direct {v1, v2, v3}, Landroid/content/ComponentName-><init>(Ljava/lang/String;Ljava/lang/String;)V invoke-virtual {v0, v1}, Landroid/content/Intent->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;
关于之前崩溃的原因分析
你之前修改Action后出现崩溃,大概率是因为Intent没有找到有效的目标组件:要么是Action名称写错,要么是没有指定具体应用,导致系统无法匹配到能处理该Intent的应用,最终抛出ActivityNotFoundException。现在通过明确指定Component,就能确保Intent被正确发送到GBWhatsApp的贴纸处理页面。
额外注意事项
- 如果GBWhatsApp的贴纸处理组件类名不是
com.whatsapp.stickers.StickerPackDetailsActivity,你可以反编译GBWhatsApp的APK,查找注册了com.whatsapp.intent.action.ENABLE_STICKER_PACK的Activity来确认正确类名。 - 确保你的贴纸应用配置了必要的基础权限(比如本地贴纸通常无需额外权限,若涉及在线贴纸则可能需要
android.permission.INTERNET)。
内容的提问来源于stack exchange,提问作者Amer D
相关产品推荐
相关产品推荐

