Android 터미널에서 개발 PC로 포트 전송

9067 단어 Android
본 보도는 샘자프 Advent Calendar 2019 #2의 12/13 보도입니다.
어제는 @kazuhiro1128선생님의 Next.js+FirebaseAuth로 로그인 시도입니다.
오늘은 안드로이드 단말기의 실제 디버깅에 유용한 명령과 사용례를 소개하고 싶습니다.

adb reverse 명령

adb reverse 명령은 터미널에서 PC로 포트를 전송하는 명령입니다.
반면 PC에서 터미널 포트로 전송adb forward 명령
Unity의 Profiler를 연결하기 위해 사용하기 때문에 유명하죠.
나는 이 명령을
  • PC에 Proxy 서버를 구축하고 통신 내용을 확인하거나 디버깅을 수정
  • PC에서 웹 페이지를 호스팅하고 터미널의 동작을 확인하면서 내용을 편집한다
  • 활용.

    사용 예


    서버 준비


    우선 컴퓨터에서 실행될 서버 응용 프로그램을 준비하세요.
    언어는 무엇이든지 가능하지만 간단하게 기술할 수 있기 때문에 고를 선택했다.
    API 및 파일 배포 기능이 있는 간단한 서버 응용 프로그램으로 로컬 호스트의 포트 8080 번호를 기다리고 고정 문자열을 반환할 수 있습니다.
    설명을 간소화하기 위해 오류 처리를 생략했다.
    package main
    
    import "net/http"
    
    func main() {
        http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
            w.Write([]byte("ok"))
        })
        http.Handle("/resource/", http.StripPrefix("/resource/", http.FileServer(http.Dir("./resource/"))))
    
        http.ListenAndServe("127.0.0.1:8080", nil)
    }
    
    디렉터리 설정은 다음과 같습니다. 스크립트 이외에 클라이언트에게 전달할 이미지 파일도 설정되어 있습니다.
    .
    ├── main.go
    └── resource
        └── red.png
    

    클라이언트 준비


    클라이언트는 Unity를 사용하고, 우리도 동작에 필요한 최소한의 코드를 준비했다.  
    두 개의 버튼과 텍스트, 원본 이미지로 구성된 간단한 구성으로 통신 결과를 볼 수 있습니다.
    접속 주소는 127.0.0.1, 포트는 8080 번호로 지정됩니다.
    using System.Collections;
    using UnityEngine;
    using UnityEngine.Networking;
    using UnityEngine.UI;
    
    public class MainBehaviour : MonoBehaviour
    {
        [SerializeField] private Button _callApiButton;
        [SerializeField] private Button _getResourceButton;
        [SerializeField] private Text _text;
        [SerializeField] private RawImage _image;
    
        private void Awake() {
            _callApiButton.onClick.AddListener(() => StartCoroutine(CallApi()));
            _getResourceButton.onClick.AddListener(() => StartCoroutine(GetResource()));
        }
    
        public IEnumerator CallApi() {
            using (var request = UnityWebRequest.Get("http://127.0.0.1:8080/api/")) {
                yield return request.SendWebRequest();
                _text.text = request.downloadHandler.text;
            }
        }
    
        public IEnumerator GetResource() {
            using (var request = UnityWebRequestTexture.GetTexture("http://127.0.0.1:8080/resource/red.png")) {
                yield return request.SendWebRequest();
                _image.texture = DownloadHandlerTexture.GetContent(request);
            }
        }
    }
    

    연결 준비


    터미널용 USB 케이블을 PC에 연결하고 개발자 옵션과 USB 디버깅을 ON으로 설정합니다.adb devices 명령으로 터미널이 부착된 것을 확인한 후 adb reverse 명령을 실행해 보십시오.
    로컬 및 원격 모두 tcp, 포트 지정 8080 입니다.
    $ adb reverse tcp:8080 tcp:8080
    
    명령의 --list 옵션을 통해 전송 설정이 유효한지 확인합니다.
    $ adb reverse --list
    (reverse) tcp:8080 tcp:8080
    
    여기까지 확인한 후 컴퓨터에서 서버를 시작하고 단말기에 구축된 클라이언트를 이동합니다.

    결과


    이것은 실제 기계에서 동작하는 것을 포착한 것이다.
    각 버튼을 누르면 통신이 실행되고 결과는 Text 및 RawImage에 반영됩니다.

    총결산


    다음은 adb reverse 명령에 대한 설명입니다.
    비록 용도는 유한하지만 로컬 컴퓨터와 단말기 사이에서 통신을 완성할 수 있다는 점은 매우 편리하다.
    내일은 @kojima_akira 씨의 보도입니다.

    좋은 웹페이지 즐겨찾기