답변:
한마디로
서비스 호출 명령과 관련된 코드는 함수의 인수 및 해당 서비스의 보조 파일에서 함수가 발생하는 순서입니다.
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>
자세히
나는 그것에 대해 알아야 할 많은 문제에 직면 해 있었으므로 클립 보드 서비스의 도움으로 솔루션을 공유 할 것입니다.
먼저 관심있는 서비스에 대해 알아야합니다-
입력하여 특정 안드로이드 시스템에있는 모든 서비스를 찾아야합니다.
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이있는 전체 경로를 알아야합니다.
IClipboard.aidl을 Google에서 검색해야한다는 것을 알고 있습니다.
내 경우와 같이 결과에서 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
이 서비스 호출 코드는 안드로이드 시스템에 따라 다르므로 안드로이드 OS 이름을 알아야합니다. 내 경우에는 8.1.0
이므로 Google이 코드를 넣고 다음 OS에서 내 OS 버전을 선택하는 다음 웹 사이트로 이동합니다. 페이지의 왼쪽-
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는 aidl 파일의 7 위에있을 때 7이됩니다. 다른 방법도 비슷합니다.
그래서 일곱 번째 방법을 호출하려면
adb shell service call clipboard 7
아시다시피, callingPackage 이름은 필요하지 않으므로 입력하지 않았습니다.
메소드에 인수가 필요한 경우이 예제와 같이 전달할 수 있습니다.
클립 보드에서 코드가 8 인 메소드를 가정 해 보겠습니다.
getDemo(String arg1, int arg2, boolean arg3)
그래서 이렇게 부르겠습니다
adb shell call clipboard 8 s16 "first_argument" i32 12 i32 1
여기서 i32는 32 비트 정수를 나타내고 s16은 문자열을 나타냅니다. 예제에 표시된 것처럼 부울 값을 정수로 전달할 수도 있습니다.
부울 정수 1은 true를, 0은 false를 나타냅니다.
팁 adb 명령을 실행하는 동안 발생한 오류를 확인하려면 logcat을 열어 두십시오 (android studio에서와 같이).
출처
실제 문제 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
이지만 여전히 수퍼 유저 콘솔에서 많은 작업을 수행 할 수있는 것이 있습니까?
문서가 없습니다. 그러나 Android 소스 코드에서 찾고있는 모든 정보를 찾을 수 있습니다. service list
패키지 이름을 제공합니다. 따라서 phone
서비스는 com.android.internal.telephony.ITelephony
입니다. Android 버전 service call phone
에 com/android/internal/telephony/ITelephony.java
대해 가능한 모든 매개 변수가 나열되어 있습니다.