怎么在smali中修改才能注释java代码中的一行

ZaiJianAnDa 2014-08-26 05:45:44
hi,
i want to delete the 580th and 581th line in the java code below. this file is in system/framework/services.jar in android devices, so the steps i did are:
1. decompile jar to smali
2. change the smali file
3. recompile the smali file to dex file
4. pack it into services.jar.
5. push services.jar into android mobile phone
The question is on step2, how to change the smali file, i try to delete :line580 and the code below it, but it doesn't work, when compiling, a nullPointerExecption thrown...and i can see /*error*/ in jd-gui tool
Somebody please give me some advices, i'm totally new to smali, thanks in advance.
100分相送,望大神指点,谢谢

The java code is:

568 public void registerUiTestAutomationService(IBinder owner,
569 IAccessibilityServiceClient serviceClient,
570 AccessibilityServiceInfo accessibilityServiceInfo) {
571 mSecurityPolicy.enforceCallingPermission(Manifest.permission.RETRIEVE_WINDOW_CONTENT,
572 FUNCTION_REGISTER_UI_TEST_AUTOMATION_SERVICE);
573
574 accessibilityServiceInfo.setComponentName(sFakeAccessibilityServiceComponentName);
575
576 synchronized (mLock) {
577 UserState userState = getCurrentUserStateLocked();
578
579 if (userState.mUiAutomationService != null) {
580 throw new IllegalStateException("UiAutomationService " + serviceClient
581 + "already registered!");
582 }
583
584 try {
585 owner.linkToDeath(userState.mUiAutomationSerivceOnwerDeathRecipient, 0);
586 } catch (RemoteException re) {
587 Slog.e(LOG_TAG, "Couldn't register for the death of a"
588 + " UiTestAutomationService!", re);
589 return;
590 }
591
592 userState.mUiAutomationServiceOwner = owner;
593 userState.mUiAutomationServiceClient = serviceClient;
594
595 // Set the temporary state.
596 userState.mIsAccessibilityEnabled = true;
597 userState.mIsTouchExplorationEnabled = false;
598 userState.mIsEnhancedWebAccessibilityEnabled = false;
599 userState.mIsDisplayMagnificationEnabled = false;
600 userState.mInstalledServices.add(accessibilityServiceInfo);
601 userState.mEnabledServices.clear();
602 userState.mEnabledServices.add(sFakeAccessibilityServiceComponentName);
603 userState.mTouchExplorationGrantedServices.add(sFakeAccessibilityServiceComponentName);
604
605 // Use the new state instead of settings.
606 onUserStateChangedLocked(userState);
607 }
608 }

The smali code after decompiling:

.line 579
.local v1, "userState":Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
# getter for: Lcom/android/server/accessibility/AccessibilityManagerService$UserState;->mUiAutomationService:Lcom/android/server/accessibility/AccessibilityManagerService$Service;
invoke-static {v1}, Lcom/android/server/accessibility/AccessibilityManagerService$UserState;->access$300(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Lcom/android/server/accessibility/AccessibilityManagerService$Service;

move-result-object v2

if-eqz v2, :cond_3d

.line 580
new-instance v2, Ljava/lang/IllegalStateException;

new-instance v4, Ljava/lang/StringBuilder;

invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V

const-string v5, "UiAutomationService "

invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

move-result-object v4

invoke-virtual {v4, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;

move-result-object v4

const-string v5, "already registered!"

invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

move-result-object v4

invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

move-result-object v4

invoke-direct {v2, v4}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V

throw v2

.line 607
.end local v1 # "userState":Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
:catchall_3a
move-exception v2

monitor-exit v3
:try_end_3c
.catchall {:try_start_11 .. :try_end_3c} :catchall_3a

throw v2

.line 585
.restart local v1 # "userState":Lcom/android/server/accessibility/AccessibilityManagerService$UserState;
:cond_3d
:try_start_3d
# getter for: Lcom/android/server/accessibility/AccessibilityManagerService$UserState;->mUiAutomationSerivceOnwerDeathRecipient:Landroid/os/IBinder$DeathRecipient;
invoke-static {v1}, Lcom/android/server/accessibility/AccessibilityManagerService$UserState;->access$1200(Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Landroid/os/IBinder$DeathRecipient;

move-result-object v2

const/4 v4, 0x0

invoke-interface {p1, v2, v4}, Landroid/os/IBinder;->linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V
:try_end_45
.catch Landroid/os/RemoteException; {:try_start_3d .. :try_end_45} :catch_74
.catchall {:try_start_3d .. :try_end_45} :catchall_3a

...全文
495 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_27888471 2015-08-07
  • 打赏
  • 举报
回复
注意:if-eqz v2, :cond_3d 造一个无意义的cond_## 置换cond_3d !
s278777851 2014-08-27
  • 打赏
  • 举报
回复
if-eqz v2, :cond_3d .line 580 new-instance v2, Ljava/lang/IllegalStateException; new-instance v4, Ljava/lang/StringBuilder; invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V const-string v5, "UiAutomationService " invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object v4 const-string v5, "already registered!" invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-direct {v2, v4}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V throw v2 直接删掉这部分不行么
ZaiJianAnDa 2014-08-27
  • 打赏
  • 举报
回复
试了不行,修改smali后编译,用jd-gui查看jar,会发现有错误,如下,帮忙看下哈 /* Error */ public void registerUiTestAutomationService(IBinder paramIBinder, IAccessibilityServiceClient paramIAccessibilityServiceClient, AccessibilityServiceInfo paramAccessibilityServiceInfo) { // Byte code: // 0: aload_0 // 1: getfield 195 com/android/server/accessibility/AccessibilityManagerService:mSecurityPolicy Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy; // 4: ldc_w 1235 // 7: ldc 17 // 9: invokestatic 1043 com/android/server/accessibility/AccessibilityManagerService$SecurityPolicy:access$1100 (Lcom/android/server/accessibility/AccessibilityManagerService$SecurityPolicy;Ljava/lang/String;Ljava/lang/String;)V // 12: aload_3 // 13: getstatic 96 com/android/server/accessibility/AccessibilityManagerService:sFakeAccessibilityServiceComponentName Landroid/content/ComponentName; // 16: invokevirtual 1239 android/accessibilityservice/AccessibilityServiceInfo:setComponentName (Landroid/content/ComponentName;)V // 19: aload_0 // 20: getfield 114 com/android/server/accessibility/AccessibilityManagerService:mLock Ljava/lang/Object; // 23: astore 4 // 25: aload 4 // 27: monitorenter // 28: aload_0 // 29: invokespecial 258 com/android/server/accessibility/AccessibilityManagerService:getCurrentUserStateLocked ()Lcom/android/server/accessibility/AccessibilityManagerService$UserState; // 32: invokestatic 965 com/android/server/accessibility/AccessibilityManagerService$UserState:access$300 (Lcom/android/server/accessibility/AccessibilityManagerService$UserState;)Lcom/android/server/accessibility/AccessibilityManagerService$Service; // 35: pop // 36: goto +4 -> 40 // 39: pop // 40: astore 6 // 42: aload 4 // 44: monitorexit // 45: aload 6 // 47: athrow // Local variable table: // start length slot name signature // 0 48 0 this AccessibilityManagerService // 0 48 1 paramIBinder IBinder // 0 48 2 paramIAccessibilityServiceClient IAccessibilityServiceClient // 0 48 3 paramAccessibilityServiceInfo AccessibilityServiceInfo // 23 3 4 localObject Object // Exception table: // from to target type // 28 36 39 finally // 39 40 39 finally // 42 45 39 finally } /////////////////////////////////////////////
引用 2 楼 s278777851 的回复:
if-eqz v2, :cond_3d .line 580 new-instance v2, Ljava/lang/IllegalStateException; new-instance v4, Ljava/lang/StringBuilder; invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V const-string v5, "UiAutomationService " invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4, p2}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object v4 const-string v5, "already registered!" invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v4 invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object v4 invoke-direct {v2, v4}, Ljava/lang/IllegalStateException;-><init>(Ljava/lang/String;)V throw v2 直接删掉这部分不行么
ZaiJianAnDa 2014-08-26
  • 打赏
  • 举报
回复
试过如下方法,但是编译后都会报错 1. 把.line580行删除 2. 改为 .line580 nop 有其他方法没

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧