重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
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:
創(chuàng)新互聯(lián)建站是一家以網(wǎng)站設(shè)計建設(shè),微信小程序開發(fā)、網(wǎng)站開發(fā)設(shè)計,網(wǎng)絡(luò)軟件產(chǎn)品開發(fā),企業(yè)互聯(lián)網(wǎng)推廣服務(wù)為主的民營科技公司。主要業(yè)務(wù)涵蓋:為客戶提供網(wǎng)站策劃、網(wǎng)站設(shè)計、網(wǎng)站開發(fā)、域名申請、網(wǎng)站優(yōu)化排名、賣友情鏈接等服務(wù)領(lǐng)域。憑借建站老客戶口碑做市場,建設(shè)網(wǎng)站時,根據(jù)市場搜索規(guī)律和搜索引擎的排名收錄規(guī)律編程,全力為建站客戶設(shè)計制作排名好的網(wǎng)站,深受老客戶認(rèn)可和贊譽。
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
~如果你認(rèn)可我的回答,請及時點擊【采納為滿意回答】按鈕
~~手機(jī)提問的朋友在客戶端右上角評價點【滿意】即可。
~你的采納是我前進(jìn)的動力
~~O(∩_∩)O,記得好評和采納,互相幫助,謝謝。
試想一下,一個沒有一句注釋的程序源碼,怎么讀,一個程序要上萬條代碼不可能全部記得住哪一塊是什么用,而且一個項目也不會是一個人獨自完成,那樣效率太低,多人合作就要給別人說明,每一塊是什么用,方便他人使用,方便自己更正,而這些說明文字就是注釋,注釋不會被執(zhí)行,不影響運行結(jié)果。
Java中代碼的注釋有三種:
// 注釋一行?
/* ...... */ 注釋若干行?
/** ...... */ 注釋若干行,并寫入 javadoc 文檔
前兩種比較容易理解,至于第三種,你學(xué)習(xí)Java看的api文檔就是javadoc程序根據(jù)第三種的注釋生成的。
擴(kuò)展資料
注釋就是對代碼的解釋和說明,其目的是讓人們能夠更加輕松地了解代碼。注釋是編寫程序時,寫程序的人給一個語句、程序段、函數(shù)等的解釋或提示,能提高程序代碼的可讀性。
java代碼注釋快捷鍵:ctrl+shift+/
首先熟悉一下html、css、js的注釋的寫法:
1、HTML注釋語法:
!--注釋的內(nèi)容--
2、css注釋語法
/* 注釋內(nèi)容 */
/* ----------文字樣式開始---------- */
3、javaScript注釋
//注釋內(nèi)容
/*注釋內(nèi)容*/
接下來是對注釋在這幾種代碼中使用的位置,如何寫注釋進(jìn)行總結(jié)一下。(根據(jù)個人的習(xí)慣可能不一樣)
注釋是為了方便自己或代碼維護(hù)方更容易地讀懂代碼的用處。
一、背景?
1、當(dāng)我們第一次接觸某段代碼,但又被要求在極短的時間內(nèi)有效地分析這段代碼,我們需要什么樣的注釋信息??
2、怎么樣避免我們的注釋冗長而且凌亂不堪呢??
3、在多人協(xié)同開發(fā)、維護(hù)的今天,我們需要怎么樣的注釋來保證高質(zhì)、高交的進(jìn)行開發(fā)和維護(hù)工作呢??
二、意義?
程序中的注釋是程序設(shè)計者與程序閱讀者之間通信的重要手段。應(yīng)用注釋規(guī)范對于軟件本身和軟件開發(fā)人員而言尤為重要。并且在流行的敏捷開發(fā)思想中已經(jīng)提出了將注釋轉(zhuǎn)為代碼的概念。好的注釋規(guī)范可以盡可能的減少一個軟件的維護(hù)成本?,?并且?guī)缀鯖]有任何一個軟件,在其整個生命周期中,均由最初的開發(fā)人員來維護(hù)。好的注釋規(guī)范可以改善軟件的可讀性,可以讓開發(fā)人員盡快而徹底地理解新的代碼。好的注釋規(guī)范可以最大限度的提高團(tuán)隊開發(fā)的合作效率。長期的規(guī)范性編碼還可以讓開發(fā)人員養(yǎng)成良好的編碼習(xí)慣,甚至鍛煉出更加嚴(yán)謹(jǐn)?shù)乃季S能力。?
三、注釋的原則?
1、 注釋形式統(tǒng)一?
在整個應(yīng)用程序中,使用具有一致的標(biāo)點和結(jié)構(gòu)的樣式來構(gòu)造注釋。如果在其他項目組發(fā)現(xiàn)他們的注釋規(guī)范與這份文檔不同,按照他們的規(guī)范寫代碼,不要試圖在既成的規(guī)范系統(tǒng)中引入新的規(guī)范。?
2、 注釋的簡潔?
內(nèi)容要簡單、明了、含義準(zhǔn)確,防止注釋的多義性,錯誤的注釋不但無益反而有害。?
3、 注釋的一致性?
在寫代碼之前或者邊寫代碼邊寫注釋,因為以后很可能沒有時間來這樣做。另外,如果有機(jī)會復(fù)查已編寫的代碼,在今天看來很明顯的東西六周以后或許就不明顯了。通常描述性注釋先于代碼創(chuàng)建,解釋性注釋在開發(fā)過程中創(chuàng)建,提示性注釋在代碼完成之后創(chuàng)建。修改代碼的同時修改相應(yīng)的注釋,以保證代碼與注釋的同步。?
4、 注釋的位置?
保證注釋與其描述的代碼相鄰,即注釋的就近原則。對代碼的注釋應(yīng)放在其上方相鄰或右方的位置,不可放在下方。避免在代碼行的末尾添加注釋;行尾注釋使代碼更難閱讀。不過在批注變量聲明時,行尾注釋是合適的;在這種情況下,將所有行尾注釋要對齊。?
5、 注釋的數(shù)量?
注釋必不可少,但也不應(yīng)過多,在實際的代碼規(guī)范中,要求注釋占程序代碼的比例達(dá)到20%左右。注釋是對代碼的“提示”,而不是文檔,程序中的注釋不可喧賓奪主,注釋太多了會讓人眼花繚亂,注釋的花樣要少。不要被動的為寫注釋而寫注釋。?
6、刪除無用注釋?
在代碼交付或部署發(fā)布之前,必須刪掉臨時的或無關(guān)的注釋,以避免在日后的維護(hù)工作中產(chǎn)生混亂。?
7、 復(fù)雜的注釋?
如果需要用注釋來解釋復(fù)雜的代碼,請檢查此代碼以確定是否應(yīng)該重寫它。盡一切可能不注釋難以理解的代碼,而應(yīng)該重寫它。盡管一般不應(yīng)該為了使代碼更簡單便于使用而犧牲性能,但必須保持性能和可維護(hù)性之間的平衡。?
8、 多余的注釋?
描述程序功能和程序各組成部分相互關(guān)系的高級注釋是最有用的,而逐行解釋程序如何工作的低級注釋則不利于讀、寫和修改,是不必要的,也是難以維護(hù)的。避免每行代碼都使用注釋。如果代碼本來就是清楚、一目了然的則不加注釋,避免多余的或不適當(dāng)?shù)淖⑨尦霈F(xiàn)。?
9、必加的注釋?
典型算法必須有注釋。在代碼不明晰或不可移植處必須有注釋。在代碼修改處加上修改標(biāo)識的注釋。在循環(huán)和邏輯分支組成的代碼中添加注釋。為了防止問題反復(fù)出現(xiàn),對錯誤修復(fù)和解決方法的代碼使用注釋,尤其是在團(tuán)隊環(huán)境中。?
10、注釋在編譯代碼時會被忽略,不編譯到最后的可執(zhí)行文件中,所以注釋不?
會增加可執(zhí)行文件的大小。?
四、JAVA注釋技巧?
1、空行和空白字符也是一種特殊注釋。利用縮進(jìn)和空行,使代碼與注釋容易區(qū)?
別,并協(xié)調(diào)美觀。?
2、當(dāng)代碼比較長,特別是有多重嵌套時,為了使層次清晰,應(yīng)當(dāng)在一些段落的?
結(jié)束處加注釋(在閉合的右花括號后注釋該閉合所對應(yīng)的起點),注釋不能?
寫得很長,只要能表示是哪個控制語句控制范圍的結(jié)束即可,這樣便于閱讀。?
3、將注釋與注釋分隔符用一個空格分開,在沒有顏色提示的情況下查看注釋時,?
這樣做會使注釋很明顯且容易被找到。?
4、不允許給塊注釋的周圍加上外框。這樣看起來可能很漂亮,但是難于維護(hù)。?
5、每行注釋(連同代碼)不要超過120個字(1024×768),最好不要超過80?
字(800×600)?。?
6、Java編輯器(IDE)注釋快捷方式。Ctrl+/?注釋當(dāng)前行,再按則取消注釋。?
7、對于多行代碼的注釋,盡量不采用“/*......*/”,而采用多行“//”注釋,?
這樣雖然麻煩,但是在做屏蔽調(diào)試時不用查找配對的“/*......*/”。?
8、注釋作為代碼切換開關(guān),用于臨時測試屏蔽某些代碼。