私は、コードのこの部分を注射しinvoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V
逆コンパイルアプリで。
このような:
.line 70
move-object/from16 v0, p0
iget-object v0, v0, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->sharedPreferencesNotificationsHelper:Lcom/bee7/sdk/common/util/SharedPreferencesNotificationsHelper;
move-object/from16 v21, v0
sget v22, Lcom/bee7/gamewall/BannerNotification;->NUMBER_OF_REWARD_BANNER_NOTIFICATIONS_LAYOUTS:I
invoke-virtual/range {v21 .. v22}, Lcom/bee7/sdk/common/util/SharedPreferencesNotificationsHelper;->getNextRewardNotificationLayout(I)I
.line 76
sget v21, Lcom/bee7/gamewall/R$layout;->gamewall_banner_notification_reward_0:I
move-object/from16 v0, p0
move/from16 v1, v21
invoke-virtual {v0, v1}, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->setContentView(I)V
invoke-static {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V
.line 77
const/16 v21, 0x1
move/from16 v0, v21
move-object/from16 v1, p0
iput v0, v1, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->numberOfOffersInBannerNotification:I
しかし、私は次のメッセージrechieve apktoolでそれを構築しようとしたとき:
com.outfit7.talkingtomcandyrun\smali\com\bee7\gamewall\dialogs\BannerNotificationDialog.smali[179,106] Invalid register: v25. Must be between v0 and v15, inclusive.
この行を参照:invoke-virtual {v0, v1}, Lcom/bee7/gamewall/dialogs/BannerNotificationDialog;->setContentView(I)V
。
なぜ私はこのエラーを取得していますか?私もレジスタが表示されていないv25
コードで。
編集:
私はいくつかの他のアプリでそれを試してみましたが、エラーは常に最高のレジスタに1を加えることに気づきました。方法で最高のレジスタがあるのであればv17
、それは言うだろうInvalid register: v18
。
あなたはのドキュメントを見ればinvoke-static
オペコード、あなたはそれが唯一の参照レジスタ0-15にそれを可能にする各パラメータレジスタを、エンコードするために4ビットを使用していることがわかります。
p0
パラメータレジスタであり、パラメータレジスタは、メソッドの「割り当て」レジスタ範囲の端にあります。
この方法は、(、30個のレジスタを言っているのであれば、.registers 30
)、そしてそれは5(非ロング/非二重)の引数があり、その後、メソッドの引数は、V25-V29ように渡されます。pNN
レジスタは、最後のレジスタのこの範囲に単なるエイリアスです。したがって、この場合には、p0
別名ですv25
。p1
別名であるv26
など、
引数の数をカウントアップする際にも、暗黙的に含めることを忘れないでくださいthis
、常に最初渡される引数である非静的メソッドの引数を、。すなわちp0
この場合は、あなたの最善の策が呼び出す静的使用することです/レジスタの連続した範囲を受け入れる代わりに、範囲、および直接これらのより高いのレジスタを参照することができます。
たとえば、
invoke-static/range {p0}, Lcom/outfit7/talkingtomcandyrun/Toast;->show(Landroid/content/Context;)V`
別のオプションは使用することですmove-object
の値を交換するためにp0
一時的に下位レジスタと、その後、後で戻ってそれを交換します。あなたは見つけるか、もちろん、スワップを行うために、未使用のレジスタを作成する必要があります。