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
~如果你认可我的回答,请及时点击【采纳为满意回答】按钮
~~手机提问的朋友在客户端右上角评价点【满意】即可。
~你的采纳是我前进的动力
~~O(∩_∩)O,记得好评和采纳,互相帮助,谢谢。
试想一下,一个没有一句注释的程序源码,怎么读,一个程序要上万条代码不可能全部记得住哪一块是什么用,而且一个项目也不会是一个人独自完成,那样效率太低,多人合作就要给别人说明,每一块是什么用,方便他人使用,方便自己更正,而这些说明文字就是注释,注释不会被执行,不影响运行结果。
Java中代码的注释有三种:
// 注释一行
/* ...... */ 注释若干行
/** ...... */ 注释若干行,并写入 javadoc 文档
前两种比较容易理解,至于第三种,你学习Java看的api文档就是javadoc程序根据第三种的注释生成的。
扩展资料
注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。
java代码注释快捷键:ctrl+shift+/
首先熟悉一下html、css、js的注释的写法:
1、HTML注释语法:
!--注释的内容--
2、css注释语法
/* 注释内容 */
/* ----------文字样式开始---------- */
3、javaScript注释
//注释内容
/*注释内容*/
接下来是对注释在这几种代码中使用的位置,如何写注释进行总结一下。(根据个人的习惯可能不一样)
注释是为了方便自己或代码维护方更容易地读懂代码的用处。
一、背景
1、当我们第一次接触某段代码,但又被要求在极短的时间内有效地分析这段代码,我们需要什么样的注释信息?
2、怎么样避免我们的注释冗长而且凌乱不堪呢?
3、在多人协同开发、维护的今天,我们需要怎么样的注释来保证高质、高交的进行开发和维护工作呢?
二、意义
程序中的注释是程序设计者与程序阅读者之间通信的重要手段。应用注释规范对于软件本身和软件开发人员而言尤为重要。并且在流行的敏捷开发思想中已经提出了将注释转为代码的概念。好的注释规范可以尽可能的减少一个软件的维护成本 , 并且几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护。好的注释规范可以改善软件的可读性,可以让开发人员尽快而彻底地理解新的代码。好的注释规范可以最大限度的提高团队开发的合作效率。长期的规范性编码还可以让开发人员养成良好的编码习惯,甚至锻炼出更加严谨的思维能力。
三、注释的原则
1、 注释形式统一
在整个应用程序中,使用具有一致的标点和结构的样式来构造注释。如果在其他项目组发现他们的注释规范与这份文档不同,按照他们的规范写代码,不要试图在既成的规范系统中引入新的规范。
2、 注释的简洁
内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害。
3、 注释的一致性
在写代码之前或者边写代码边写注释,因为以后很可能没有时间来这样做。另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。通常描述性注释先于代码创建,解释性注释在开发过程中创建,提示性注释在代码完成之后创建。修改代码的同时修改相应的注释,以保证代码与注释的同步。
4、 注释的位置
保证注释与其描述的代码相邻,即注释的就近原则。对代码的注释应放在其上方相邻或右方的位置,不可放在下方。避免在代码行的末尾添加注释;行尾注释使代码更难阅读。不过在批注变量声明时,行尾注释是合适的;在这种情况下,将所有行尾注释要对齐。
5、 注释的数量
注释必不可少,但也不应过多,在实际的代码规范中,要求注释占程序代码的比例达到20%左右。注释是对代码的“提示”,而不是文档,程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱,注释的花样要少。不要被动的为写注释而写注释。
6、删除无用注释
在代码交付或部署发布之前,必须删掉临时的或无关的注释,以避免在日后的维护工作中产生混乱。
7、 复杂的注释
如果需要用注释来解释复杂的代码,请检查此代码以确定是否应该重写它。尽一切可能不注释难以理解的代码,而应该重写它。尽管一般不应该为了使代码更简单便于使用而牺牲性能,但必须保持性能和可维护性之间的平衡。
8、 多余的注释
描述程序功能和程序各组成部分相互关系的高级注释是最有用的,而逐行解释程序如何工作的低级注释则不利于读、写和修改,是不必要的,也是难以维护的。避免每行代码都使用注释。如果代码本来就是清楚、一目了然的则不加注释,避免多余的或不适当的注释出现。
9、必加的注释
典型算法必须有注释。在代码不明晰或不可移植处必须有注释。在代码修改处加上修改标识的注释。在循环和逻辑分支组成的代码中添加注释。为了防止问题反复出现,对错误修复和解决方法的代码使用注释,尤其是在团队环境中。
10、注释在编译代码时会被忽略,不编译到最后的可执行文件中,所以注释不
会增加可执行文件的大小。
四、JAVA注释技巧
1、空行和空白字符也是一种特殊注释。利用缩进和空行,使代码与注释容易区
别,并协调美观。
2、当代码比较长,特别是有多重嵌套时,为了使层次清晰,应当在一些段落的
结束处加注释(在闭合的右花括号后注释该闭合所对应的起点),注释不能
写得很长,只要能表示是哪个控制语句控制范围的结束即可,这样便于阅读。
3、将注释与注释分隔符用一个空格分开,在没有颜色提示的情况下查看注释时,
这样做会使注释很明显且容易被找到。
4、不允许给块注释的周围加上外框。这样看起来可能很漂亮,但是难于维护。
5、每行注释(连同代码)不要超过120个字(1024×768),最好不要超过80
字(800×600) 。
6、Java编辑器(IDE)注释快捷方式。Ctrl+/ 注释当前行,再按则取消注释。
7、对于多行代码的注释,尽量不采用“/*......*/”,而采用多行“//”注释,
这样虽然麻烦,但是在做屏蔽调试时不用查找配对的“/*......*/”。
8、注释作为代码切换开关,用于临时测试屏蔽某些代码。