당신은 기억하십니까? 그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

머리말

모두 안녕하세요! 오늘은 암웨이 오픈 소스 프로젝트의 상대적으로 무거운 플러터 생각합니다.

떨림 제품 정의가 고성능 모바일 UI 프레임 워크 크로스 플랫폼, 코드의 세트로 구성 할 수 있습니다 안드로이드 / 아이폰 OS / 웹 / 맥 OS 응용 프로그램을하는 동안. A와 UI 프레임 워크 , 그것은 자연 또는 기본을 다루는 피할 수없는, 시스템의 인터페이스의 일부를 가지고 있지 않습니다. 그 이후,이 떨림과 기본 유연한 데이터 교환을 위해 뭔가라는 플랫폼 채널을 제공한다. 설명의 편의를 위해, 네이티브 안드로이드 세대를 의미합니다.

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

거위, 거위 연료, 연료 거 레코딩 , 단지 예를 들어 BOOL / INT / 경도 / 바이트 / 기본 데이터 타입 및 데이터 구조의 일부의 송신을 지원 문자 / 문자열 / 바이트 [] / 목록 / 약도 등.

복잡한 데이터 포인트를 전송하려는 경우 따라서, 당신은이 같은지도 패키지 수 :

await _channel.invokeMethod('initUser',
    {'name': 'Oscar', 'age': 16, 'gender': 'MALE', 'country': 'China'});

그리고 안드로이드 계층 하드 코드는 키에 대응하는 다른 데이터를 분석. 당신이 순수 fluter 프로젝트에가는 경우, 나중에 어떤 거래 및 네이티브가 없습니다, 아니면 그냥이 방법을 이해할 수 있다는 간단한 상호 작용이 필요합니다. 그리고 당신의 프로젝트는 네이티브 코드의 큰 부분이었다, 또는 LIB 라이브러리의 떨림을 지원하지 않는 제 3자를 사용해야하는 경우에, 당신이 위의 템플릿으로 많은 코드를 작성해야 의미합니다. 가시 비효율적 및 유지 보수. 이 시점에서, 당신은 같은 전송 객체로 할 수 있도록하려는 것입니다!

그리고 당신은 전송 객체로 할 때 :

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

죄송합니다, 방법은 오직 예의 미소없는 당신에게 당황 위기를 줄 수 있습니다. 물론,도 아니다, 우리는 위 주 객체 JSON, JSON으로 순서를 타겟팅 할 수 있습니다 다음 플러터 플러터에서 개체 층으로 전환, 같은 효율성이 떨어집니다.

FIDL 무엇입니까

안드로이드는, AIDL (안드로이드 인터페이스의 해상력 언어)를 알아야한다, 즉 안드로이드 인터페이스 정의 언어를 배웠다. 안드로이드가 프로세스 간 통신 --Binder 높은 수준이지만, 메커니즘 및 API 바인더의 일부를 이해하는 바인더의 필요성을 사용하려면, 당신은 상용구 코드를 많이 작성해야합니다. 안드로이드이 문제를 해결하기 위해, 그것을 할 수있는 흰색 바인더 방법을 사용하려고합니다. 그래서 정의 AIDL, 당신은 내 요구 사항에 따라 쓰기에 대한 인터페이스를 제출해야합니다, 개발자에게, 당신은 전송 프로세스를 Parcelable 인터페이스를 구현해야 객체를 통과해야합니다. 그런 다음, 안드로이드는, 직렬화 할 일을 준 몰래 객체 직렬화 뒤에하는 Service.Stub 클래스를 생성 할 수 있습니다. 이 클래스를 사용하는 개발자는 쉽게 시작 스텁 바인더에 이러한 높은 수준의 프로세스 간 통신 방법 할 수 있습니다. (I 이봐, 만든)

플러터, 임무 및 AIDL이 매우 유사, 조용히 객체 직렬화, 역 직렬화, 자동 코드 생성 등 "더러운 일이"할 수있다 FIDL (떨림 인터페이스의 해상력 언어) 인터페이스 정의 언어. 개발자는 자동으로 다트와 네이티브 코드 클래스의 동일한면을 생성, @FIDL 주석 태그로, 네이티브 코드 클래스에서 볼. FIDL 거울, 각각의 기본 인터넷에 매핑 다트 클래스에서 네이티브 플랫폼 다트에 매핑 다양한 클래스입니다.

이하, 일에 모습을 장황한

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

첫 번째는 자바 클래스입니다 :

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

안드로이드 사이드

도 1에서, 인터페이스 정의 FIDL

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

2, 실행 ./gradlew assembleDebug, IUserServiceStub 생성 클래스 파일 및 fidl.json

3 채널을 열고,이 방법은 개시된 플러터

FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), new IUserServiceStub() {
  @Override
  void initUser(User user){
    System.out.println(user.name + " is " + user.age + "years old!");
  }
}

플러터면

1, 파일이 fidl.json fidl 디렉토리를 복사, 실행 플러터 패키지 술집 실행 fidl_model, 인터페이스 클래스는 다트 생성

2, 안드로이드 결합 측 유로 IUserServiceStub

await Fidl.bindChannel(IUserService.CHANNEL_NAME, _channelConnection);

3, 대중 메소드를 호출

await IUserService.initUser(User());

컴파일 및 실행, 당신은 오스카는 18 세 로그 캣에서 볼 수있을 것이다!.

FIDL의 용도는 설명

이 부분은 조금보기 추가 설명의 어떤 부분에서, 장황한이다, 할아버지를 소유 할 수 있습니다 청중 건너 뜁니다.

지도의 위의 예에서, 일반적으로 클래스에 자바 대응에있을 것입니다 :

public class User {
  String name;
  int age;
  String country;
  Gender gender;
}
enum Gender {
  MALE, FEMALE
}

당신이 플러터 수동으로 쓰기 사용자 클래스에 플러터 층이없는이 객체의 전송 및 쓰기 fromJson / toJson 방법을 원한다면, 당신은이 작업을 수행 할 수 있습니다 :

안드로이드 사이드

도 1은, 인터페이스를 정의 @FIDL 주석을 추가한다. 이 주석은 annotationProcessor 인터페이스를 알리고 설명 파일의 어떤 종류를 생성합니다.

@FIDL
public interface IUserService {
  void initUser(User user);
}

제한 인터페이스 방법은 다음과 같다 :

  • 다트 메소드 오버로딩을 지원하지 않기 때문에, 동일한 이름의 인터페이스 방법에 나타나지 않을 수 있도록
  • 매개 변수는 콜백을 지원하지 않는, 엔티티 클래스를 지원
  • JSON 디코딩의 제한으로 인해, 자바는 인수 없음의 생성자가 필요합니다

2, 안드로이드 스튜디오 클릭 동기화, 또는 실행 :

./gradlew assembleDebug

다음과 같이 그 다음은 JSON 파일의 무리를해야합니다 :

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

이 JSON 파일은 설명 파일 FIDL와 클래스입니다. 예, 그것은 또한 참조 성별 클래스 프로파일 사용자를 생성합니다 .

동시에, 또한 IUserService 구현 IUserServiceStub를 생성합니다. 즉 :

  • com.infiniteloop.fidl_example.IUserService.fidl.json
  • com.infiniteloop.fidl_example.User.json
  • com.infiniteloop.fidl_example.Gender.json
  • com.infiniteloop.fidl_example.IUserServiceStub.java

제한 : 인터페이스 프로필 대응 발생하지 않고, FIDL 강한 참조하지 않은 경우에만 상기 기준 FIDL 파일 사이의 밀접한 관계, 참조 서브 FIDL 강한 클래스 인터페이스를 생성한다.

3 채널은 정확한 위치에 개방되어, 상기 방법은 플러터 개시

IUserServiceStub userService = new IUserServiceStub() {
  @Override
  void initUser(User user){
    System.out.println(user.name + " is " + user.age + "years old!");
  }
FidlChannel.openChannel(getFlutterEngine().getDartExecutor(), userService);

도 4는, 필요하다면, 채널은 적절한 폐쇄 될 수있는

FidlChannel.closeChannel(userService);

알림 메시지 떨림 측 부근에 있습니다.

플러터면

1, 프로젝트에 플러터는 lib 디렉토리 디렉토리에 fidl 디렉토리를 만들고이 디렉토리 및 실행에 위의 JSON 파일을 복사합니다 :

flutter packages pub run fidl_model

그 다음 다트 fidl 디렉토리에 따라 자동으로 생성 할 수 있습니다 :

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

즉 :

  • User.dart
  • Gender.dart
  • IUserService.dart

2, 안드로이드 결합 측 유로 IUserServiceStub

bool connected = await Fidl.bindChannel(IUserService.CHANNEL_NAME, _channelConnection);

_channelConnection 연결 상태 추적 IUserService 채널, 상기 채널의 연결이 성공되면,이 방법은 콜백 것이다 onConnected 상기 채널이 해제 될 때, 그것은 onDisconnected 콜백 방법 것이다.

3, 호출 채널의 방법이 개시되어있다

if (_channelConnection.connected) {
  await IUserService.initUser(User());
}

</>

4. 당신이 더 이상 필요하지 않은이 채널을 사용하는 경우 바인딩을 해제 할 수 있습니다

await Fidl.unbindChannel(IUserService.CHANNEL_NAME, _channelConnection);

개보다 물론, FIDL 기능

1 인터페이스의 복수의 파라미터 FIDL

void init(String name, Integer age, Gender gender, Conversation conversation);

제 2 인터페이스의 리턴 값 FIDL

UserInfo getUserInfo();

3 일반 클래스의 생성을 지원

public class User<T> {
  T country;
}
public class AUser<String>{}

FIDL 인터페이스 :

void initUser(AUser user);

사용자 생성 할 수 있으며 AUSER 측면 다트 클래스는 상속을 유지 관리 할 수 ​​있습니다.

4 열거 전송

void initEnum0(EmptyEnum e);
String initEnum1(MessageStatus status);

5, 컬렉션을 통과,지도

void initList0(List<String> ids);
void initList1(Collection<String> ids);
void initList7(Stack<String> ids);
void initList10(BlockingQueue ids);

(6)는 복잡한 객체를 전달. 상속, 다스 A와 추상, 제네릭, 열거, 혼합 클래스.

이제 FIDL은 다트 측의 안드로이드 측면에서 메서드 호출을 실현하는 유일한 전망이다. 다음을 수행 할 일이있다 :

  • 안드로이드 사이드 측 방법은 다트를 호출
  • 서로 다른 플랫폼과 떨림 메소드를 호출
  • EventChannel는 EventChannel은 본질적으로 MethodChannel, 문제없이 달성 할 수

객체 전송을 가져, 이러한 문제는 작은 경우 친구입니다.

객체의 직렬화 및 역 직렬화를 들어

나는 자바 측에 있고 떨림 측 인터페이스 클래스의 직렬화 / 역 직렬화를 정의하는 사용자 정의 요구 사항의 거물을 충족하기 위해.

Java:
public interface ObjectCodec {
    List<byte[]> encode(Object... objects);
    <T> T decode(byte[] input, TypeLiteral<T> type);
}
Dart:
abstract class ObjectCodec {
  dynamic decode(Uint8List input);
  List<Uint8List> encode(List objects);
}

현재 JSON은 인코딩 및 디코딩을 통해 JsonObjectCodec를 사용하여, 성능이 다소 적을 것이다. 후면 작은 파트너들은보다 효율적인 코덱을 달성하기 위해 함께 일하고자합니다.

프로젝트 일정

전술 한 기능은, 한 방법은 관련 측 조동 자바 측에서 호출 될 때, 대부분이 달성되었다.

나는 데모를 만든 IM (인스턴트 메시징) SDK의 시뮬레이션 안드로이드 사이드에 의존, 메시지, 현장의 메시지를 얻을 떨림 측 요구를 채팅 할 수 있습니다. 다음은 데모 스크린 샷입니다 :

1, 홈 페이지, 버튼을 클릭 안드로이드 사이드 메소드를 호출, 채팅 서비스를 엽니 다

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

2, 채팅 페이지

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

3, 메시지 및 획득과 루시 루시 채팅을 보내

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

(4) 송신 측 전화 안드로이드 N 윌슨 채팅 메시지를 취득하는 방법

당신은 기억하십니까?  그 몇 년 동안 우리가 잡았 (FIDL : 떨림 커뮤니티 AIDL)

이 기사를 좋아하면 문서는 쉽지 않다, 또는 당신은, 우리가 도움을 희망의 여지가 엄지 손가락을 앞으로 우려  오. 기사는 지속적으로 업데이트됩니다. 물론 건조! ! !

추천

출처blog.51cto.com/14775360/2485685