Flutter와 네이티브 간의 통신: 플랫폼 채널

송민경's avatar
Apr 21, 2024
Flutter와 네이티브 간의 통신: 플랫폼 채널

플러터에서 카메라를 제어하려면 자바의 네이티브 코드를 사용해야 함
세상을 그림을 그리려면 3가지가 필요함
x,y,color / 1차원배열
카메라가 0.025초마다 2차원 배열을 카메라에 던져야 함
카메라는 받아서 램이 있으면 램에 저장하고 아니면 레지스터에 저장해야함
저장된 데이터를 가지고 연산을 함
lcd같은 화면으로 외부에있는 데이터를 컴퓨터가 이해할 수 있는 숫자같은걸로 변환하고
lcd가 화면에 던져서 표현하는 것
일꾼의 입장에서
카메라는 입력장치
lcd는 출력장치
하드가 있으면 갑자기 카메라가 꺼져도 데이터가 영구히 저장됨
일꾼이 카메라를 건드릴때 카메라도 입력포트와 출력포트가 있음
그걸 건드리기 위해 기계어를 써야 함
일꾼도 건드리려면 기계어를 써야 함
그러기 너무 어려움 그래서 직접 건드리는 것이 아니라 os가 필요함
그래서 os가 무조건 들어가는 것
직접 건드리는 것은 내가 관리하는 방의 갯수가 10억개 있음
예약들어오면 일일히 관리하기 어려움
어느방이 나갔는지 확인하기 위해 풀스캔해야함
외부에서 누가 들어올때마다 비어있는 방을 스캔해서 찾아야하는데 찾기 힘듦
os가 어느방이 남아있는지 다 찾아줌
입력을 일꾼이 받고 출력만 하면 되는데 다이렉트로 건드리는게 임베디듣 개발자들임
그때도 방의 갯수가 무조건 작아야 함
3비트는 방이 8개니까 관리할 수 있음
8비트도 방이 256개니까 관리 가능함
32비트는 방이 42억9천개라 관리하기 힘듦
16비트도 6만5천개라 관리하기 힘듦
비트가 높을 수록 os없이는 방이 너무 많아서 관리하기가 불가능함
 
자바에서 안드로이드를 사용할때의 HW는 64비트임
내가 직접 건드릴 수 없어서 안드로이드라는 OS가 있는 것
하드웨어에는 LCD와 카메라, GPS, 마이크, 스피커, 자이로센서 등이 많이 붙어있음
자이로센서, 카메라, 마이크, GPS는 입력
LCD, 스피커 출력
 
우리는 자바언어로 안드로이드 OS에 요청
안드로이드는 중개인의 역할을 함
안드로이드를 구글에서 만들었음
구글에서는 자바언어로 안드로이드에 요청하기 위해 안드로이드에 라이브러리로 다 만들어 놓음
원래 마이크 하나도 회사가 다 다르고 회사마다 하드웨어를 건드리는 방법이 다 다름
그래서 우리에게 라이브러리를 제공해줌
예를 들어 SDK 내부에
자바언어로 어떤 클래스에 어떤 메서드를 때리면 카메라 데이터를 받아줄께
 
메서드에 필요한 매개변수와 결과 값, 계속 되는지, 한번만 되는지 확인이 필요함
사진은 리턴 한번만 하면 됨
사진을 계속 주려면 리턴이 계속되어야 함
레일드? : 버퍼가 종료될때까지 계속 리턴해주는 것도 있음
 
HTTP로 통신할때
메세지를 계속 보내면 계속 받음 와일을 돌리면서 계속 리턴해줌

플러터로 하면 구조가 달라짐!
 
플러터에 호출 → 자바 : 클래스의 메서드를 때림 → OS를 때림 → HW를 때림
플러터도 구글이 만들었음
카메라가 업데이트되면 구글에서 라이브러리를 개발해놓음
그 기능을 클래스라고 한다면 자바가 카메라 클래스를 가지고 있고 많은 메서드들이 들어있음
플러터에서도 클래스의 메서드를 때리는게 필요함
하지만 같은 회사에서 만들어지기 때문에 새로운 기능에 대한 라이브러리를 안드로이드와 플러터 둘다 만들어줌 같이 만들어줘서 사용할 수 있음
우리는 플러터 클래스의 어떤 메서드를 때림 → 자바 클래스의 어떤 메서드를 때림 → OS 때림 → HW의 카메라를 때림 → 역순으로 리턴해줌
 
플러터와 자바간의 프로세스 통신이 일어남 = 플러터에서 메소드 채널을 제공해줌
통신 방법 : HTTP 통신, 소켓 통신, 프로세스간 통신
→ 다른 프로세스의 메서드를 OS를 통해서 때림
 
만약 카메라가 들고있는 메서드가 1개밖에 없고 사진을 찍어서 한장만 리턴해줌
연사를 하게 하고 싶을 때 우리는 만들 수 없음
하드웨어를 건드려야하기 때문에 클래스를 만들어야되고 이건 삼성이나 안드로이드 회사, 구글에서 제공해줘야 함
인터페이스로 제공해주는 메서드가 아니면 못때림
우리가 만든 기계가 아니기때문에 인터페이스로 만들어져있기에 걔네가 만들어줄때까지 기다려야함
자바에는 있는데 플러터가 없다면? 하나의 클래스를 임의로 만들어서 메서드로 때리면 됨
펍뎃가서 라이브러리를 찾아야함

Method Channel → Platform Channels

  • 일반적으로 네이티브 코드와 플러터 코드 간의 통신을 위한 메커니즘
  • 플러터와 네이티브 코드(C, Java, Kotlin 등) 간의 통합을 가능
플러터의 특정 메소드를 호출, 반대로 플러터 코드에서 네이티브 메소드를 호출 가능
 
  • 플러터와 네이티브 코드 간의 통신이 이루어짐
  • 플러터 앱은 네이티브 코드에 요청
  • 네이티브 코드는 해당 요청을 처리하고 결과를 다시 플러터로 반환
 
  • Platform Channels를 설정 단계
    • 네이티브 코드를 작성
    • 플러터 메소드를 호출하거나 플러터에서 네이티브 메소드를 호출
    • 메시지 채널을 사용하여 플러터와 네이티브 코드 간의 통신을 설정
    • 플러터 : MethodChannel을 사용
      네이티브 : 플러터 코드의 요청을 처리하고 결과를 반환하는 코드를 작성
    • 플러터 앱과 네이티브 모듈 간의 통신을 테스트하고 필요한 경우 디버깅
 
 
 
Share article
RSSPowered by inblog