จะหาคำอธิบายของการโทร“ / system / bin / service” ทั้งหมดได้ที่ไหน?


12

ในคำตอบที่service call phone 2 s16 "$number"ผมได้รับคำแนะนำในการใช้งาน มันใช้งานได้ แต่ในservice listฉันเห็นสิ่งที่มีประโยชน์อื่น ๆ ฉันไม่รู้วิธีใช้และไม่สามารถค้นหาข้อมูลบนอินเทอร์เน็ตได้อย่างง่ายดาย

ฉันไม่เห็นวิปัสสนาใด ๆserviceนอกเหนือจากการservice listค้นหาตัวเอง ...

จะหาคำอธิบายที่สมบูรณ์เพิ่มเติมเกี่ยวกับการโทร "บริการ" และพารามิเตอร์ได้อย่างไร


1
คำถามที่ดี ...
Android Quesito

คำตอบ:


5

ในระยะสั้น

โค้ดที่เกี่ยวข้องกับคำสั่ง call service เป็นเพียงข้อโต้แย้งของฟังก์ชันและลำดับที่ฟังก์ชันเกิดขึ้นในไฟล์ aidl ของเซอร์วิสนั้นนี่คือไวยากรณ์

service call <your_service_name> <number at which the function appears in your_service_name.aidl> <type of the argument like i32 or i64> <argument>

ในรายละเอียด
ฉันประสบปัญหามากมายที่ต้องรู้เกี่ยวกับมันและด้วยเหตุนี้ฉันจะแบ่งปันวิธีแก้ปัญหาด้วยความช่วยเหลือของบริการคลิปบอร์ด
ก่อนอื่นคุณต้องรู้เกี่ยวกับบริการที่คุณสนใจ -
เพื่อที่คุณจะต้องมองหาบริการทั้งหมดที่มีสำหรับระบบ Android โดยเฉพาะโดยพิมพ์

adb shell service list

นี่คือสิ่งที่คุณจะได้รับ -

.
.
.
59  ethernet: [android.net.IEthernetManager]
60  wifip2p: [android.net.wifi.p2p.IWifiP2pManager]
61  rttmanager: [android.net.wifi.IRttManager]
62  wifiscanner: [android.net.wifi.IWifiScanner]
63  wifi: [android.net.wifi.IWifiManager]
64  overlay: [android.content.om.IOverlayManager]
65  netpolicy: [android.net.INetworkPolicyManager]
66  netstats: [android.net.INetworkStatsService]
67  network_score: [android.net.INetworkScoreService]
68  textservices: [com.android.internal.textservice.ITextServicesManager]
69  network_management: [android.os.INetworkManagementService]
70  clipboard: [android.content.IClipboard]
71  statusbar: [com.android.internal.statusbar.IStatusBarService]
.
.
.

เนื่องจากฉันสนใจบริการคลิปบอร์ดนี่คือลักษณะที่ปรากฏ

70  clipboard: [android.content.IClipboard]

ดังนั้นจากที่นี่เราสามารถสรุปได้ว่าชื่อบริการคือบริการคลิปบอร์ดและเส้นทางของแพ็คเกจคือ android.content.IClipboard

จากนั้นคุณจำเป็นต้องรู้เส้นทางที่สมบูรณ์ที่ IClipboard.aidl อยู่
หากต้องการทราบว่าคุณต้องค้นหาใน Google สำหรับ IClipboard.aidl
คุณต้องมองหาบางอย่างจากเว็บไซต์ android.googlesource.com ในผลลัพธ์เช่นในกรณีของฉัน -

https://android.googlesource.com/platform/frameworks/base.git/+/android-4.2.2_r1/core/java/android/content/IClipboard.aidl

ดังนั้นหลังจาก + / android-4.2.2_r1 เป็นที่ที่พา ธ ของคุณอยู่ให้พา ธ นั้นเป็น path_of_clipboard.aidl =

/core/java/android/content/IClipboard.aidl

เนื่องจากรหัสการโทรบริการเหล่านี้ขึ้นอยู่กับระบบ Android ดังนั้นคุณต้องทราบชื่อระบบปฏิบัติการ android ของคุณ - ในกรณีของฉันคือ 8.1.0
ดังนั้นฉันจะไปที่เว็บไซต์ต่อไปนี้ที่ google ใส่รหัสและเลือกรุ่นระบบปฏิบัติการของฉันจาก ด้านซ้ายของหน้า -

https://android.googlesource.com/platform/frameworks/base/

ในกรณีของฉันมันเป็น android-8.1.0_r50 ฉันจะคลิกมันหลังจากนั้น URL ของฉันจะมีหน้าตาแบบนี้

https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51

และหลังจากเพิ่ม path_of_clipboard.aidl แล้ว URL ที่สมบูรณ์ของฉันจะมีลักษณะดังนี้

https://android.googlesource.com/platform/frameworks/base/+/android-8.1.0_r51/core/java/android/content/IClipboard.aidl

ที่นี่จะมีวิธีการมากมายในส่วนต่อประสานเหมือนในกรณีของฉัน

    void setPrimaryClip(in ClipData clip, String callingPackage);
    ClipData getPrimaryClip(String pkg);
    ClipDescription getPrimaryClipDescription(String callingPackage);
    boolean hasPrimaryClip(String callingPackage);
    void addPrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener,
            String callingPackage);
    void removePrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener);
    /**
     * Returns true if the clipboard contains text; false otherwise.
     */
    boolean hasClipboardText(String callingPackage);

ดังนั้นรหัสสำหรับวิธีแรกเช่น setPrimaryClip จะเป็น 1 ตามที่เกิดขึ้นในตอนแรกและสำหรับวิธีสุดท้ายคือ hasClipboardText จะเป็น 7 ตามที่เกิดขึ้นที่อันดับที่เจ็ดในไฟล์ aidl ในทำนองเดียวกันสำหรับวิธีอื่น ๆ
ดังนั้นถ้าฉันต้องการเรียกวิธีที่เจ็ดฉันจะพิมพ์

adb shell service call clipboard 7 

อย่างที่คุณอาจเห็นว่าฉันไม่ได้ใส่ชื่อแพคเกจการโทรเพราะมันไม่จำเป็น

หากวิธีการนั้นต้องการอาร์กิวเมนต์คุณสามารถผ่านมันเหมือนดังที่แสดงในตัวอย่างนี้
ให้เราสมมติวิธีการที่มีรหัส 8 ในคลิปบอร์ดและที่มีลักษณะเช่นนี้ -

getDemo(String arg1, int arg2, boolean arg3)

ดังนั้นฉันจะเรียกมันว่าอย่างนี้

adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1

นี่คือ i32 หมายถึงจำนวนเต็ม 32 บิตและ s16 สำหรับสตริง เราสามารถทำได้แม้ผ่านค่าบูลีนเป็นจำนวนเต็มตามที่แสดงในตัวอย่าง
ในจำนวนเต็มบูลีน 1 หมายถึงจริงและ 0 เป็นเท็จ

เคล็ดลับเปิด logcat (เช่นใน android studio) เพื่อตรวจสอบข้อผิดพลาดที่เกิดขึ้นขณะเรียกใช้คำสั่ง adb
แหล่ง


6

ปัญหาที่แท้จริงservice callคือรหัสธุรกรรมไม่เพียง แต่ไม่มีเอกสารเท่านั้น แต่ยังไม่รับประกันว่าจะมีเสถียรภาพ - รหัสเหล่านั้นสามารถเปลี่ยนแปลงได้อย่างเงียบ ๆ ระหว่างรุ่น Android ด้วยเหตุนี้service callจึงไม่ควรใช้คำสั่งยกเว้นการดีบักส่วนตัวเมื่อคุณทราบว่าใช้ Android เวอร์ชันใด

ตัวอย่าง:

(ที่นี่FIRST_CALL_TRANSACTION = 1 ดังนั้นรหัสธุรกรรมจริงที่ควรใช้ในservice call phoneคำสั่งคือจำนวนที่เห็นในแหล่งที่มาบวก 1)

โปรดทราบว่าในเวอร์ชั่นใหม่TRANSACTION_supplyPukจะถูกแทรกตรงกลางและตอนนี้รหัสทั้งหมดต่อไปนี้จะถูกเลื่อนโดย 1 สิ่งใด ๆ ที่เคยservice call phoneทำธุรกรรมเหล่านั้นจะพังอย่างน่ากลัวเมื่อใช้กับ Android 4.2.2 - รหัสเดียวกันจะส่งผลให้วิธีการโทรแตกต่างกันโดยสิ้นเชิง อาจมีผลร้าย


มีบางสิ่งที่มีระดับสูงกว่าอีกเล็กน้อยservice callแต่ก็ยังมีหลายสิ่งที่ต้องทำจาก superuser console หรือไม่?
Vi0

4

ไม่มีเอกสารประกอบ แต่คุณสามารถค้นหาข้อมูลทั้งหมดที่คุณต้องการได้ในซอร์สโค้ด Android service listให้ชื่อแพคเกจ ดังนั้นสำหรับบริการมันเป็นphone com.android.internal.telephony.ITelephonyคุณจะพบพารามิเตอร์ที่เป็นไปได้ทั้งหมดสำหรับservice call phoneรายการในcom/android/internal/telephony/ITelephony.javaเวอร์ชัน Android ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.