'2017/01'에 해당되는 글 9건

  1. 2017.01.29 Android WebRTC 샘플 app을 빌드해보자. 2
반응형

 몇년 전에 WebRTC 관련 프로젝트를 진행했었다. 다시 관련 프로젝트를 진행하게 되어, WebRTC 관련으로 다시 정리해 본다. 이전에 WebRTC Android Library를 빌드하는 부분을 포스팅 한적 있었는데, (webrtc android library 컴파일하기) 현재는 빌드 방법이 달라져서 다시 정리한다.

 또한 WebRTC android 기본 코드에는 AppRTCDemo라는 android app을 빌드할 수 있는데, 이 앱은 https://appr.tc 에서 브라우저-앱 간 영상 통화를 테스트 할 수 있다.


참고사이트: https://webrtc.org/native-code/android/



[Android Web RTC Library Build]


1. Chromium depot_tools 설치

 참고사이트 : http://dev.chromium.org/developers/how-tos/install-depot-tools

 - git 을 설치한다: sudo apt-get install git

 - depot_tools 을 Git에서 가져옴: 


git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git


- 경로 설정: export PATH=$PATH:[경로]/depot_tools 를 .bashrc 의 마지막 라인에 추가


2. 코드 가져오기

~$ mkdir webrtc_android

~$ cd ./webrtc_android

~/webrtc_android$fetch --nohooks webrtc_android (시간이 꽤 걸린다.)

~/webrtc_android$gclient sync

 

3. 프로젝트 생성

GN으로 프로젝트를 생성한다. 이때 pkg-config, build tool이 필요하다. 

(sudo apt-get install pkg-config build-essential로 설치)


gn gen out/arm--args='target_os="android" target_cpu="arm"'


4. 컴파일


ninja -C out/arm (시간이 꽤 걸린다)


 target_cpu 가 arm 인 경우에는 32bit arm, arm64인 경우 64bit arm, x86은 32bit intel, x64는 64bit intel 용 library를 빌드하게 된다. 각각에 대해서 빌드를 한다. (out/arm, out/arm64, out/x64, out/x86으로 각각 빌드)


[Android Sample App Build]

1. Sample App 코드/라이브러리 설정

android studio로 android WebRTC 샘플 App을 빌드하려면 webrtc_android 코드의 다음 폴더를 android studio에서 접근할 수 있는 디스크에 옮긴다.


[코드폴더]\src\webrtc\examples\androidapp


 android studio에서 [File] > [New] > [Import Project] 에서 상기 폴더를 선택하면 Gradle 기반 프로젝트로 변환시킬 수 있다. 이 코드는 위에서 빌드한 android webrtc library가 포함되어 있지 않아서 직접 추가해 주어야 한다. Gradle 기반 프로젝트로 변환한 소스의 폴더 구조는 다음과 같다.

app 폴더로 들어가서 libs 폴더를 생성한다. libs 폴더로 들어가서 다음과 같이 폴더를 생성하고 빌드한 라이브러리를 옮겨 놓는다.



arm64-v8a, armeabi-v7a, x86, x86_64 폴더에는 각각 target_cpu에 맞게 library 빌드한 .so 라이브러리를 넣어 둔다. (arm64-v8a는 out/arm64, armeabi-v7a는 out/arm, x86은 out/x86, x86_64는 out/x64) 이떄 넣어두어야 하는 library는 다음과 같다. 이 파일들은 out/arm, out/arm64, out/x86, out/x64 폴더에 들어 있다.


libboringssl.cr.so

libc++_shared.so

libjingle_peerconnection_so.so

libprotobuf_lite.cr.so

 

 libboringssl.cr.so 와 libc++_shared.so, libprotobuf_lite.cr.so 는 android app을 빌드할 때는 에러가 발생하지 않지만, libjingle_peerconnection_so.so에서 의존성을 가지고 있는 Native Library이어서 실행시 libjingle_peerconnection_so.so를 JNI로 로드할 때 해당 라이브러리들이 없으면 오류가 발생된다.



(2017.02.08 업데이트) gn gen out/arm --args='target_os="android" target_cpu="arm" is_debug=false dcheck_always_on=true symbol_level=1 is_component_build=false' 로 빌드하게 되면 이 라이브러리들이 합쳐져서 하나의 libjingle_peerconnection_so.so 만 생성된다. 위와 같이 개별적인 라이브러리를 이용할 경우, 실행시 . libboringssl_cr.so 및 기타 라이브러리를 찾지 못한다는 에러가 발생할 수 있다.


 각각의 jar 파일은 빌드한 LIbrary의 다음의 폴더에 들어 있다.


audio_device_java.jar > src/out/{target_cpu}/lib.java/webrtc/modules/audio_device/

autobanh.jar > src/out/{target_cpu}/lib.java/webrtc/examples/androidapp/third_party/autobanh

base_java.jar > src/out/{target_cpu}/lib.java/webrtc/base/

linjingle_peerconnection_java.jar > src/out/{target_cpu}/lib.java/webrtc/sdk/android/


 audio_device_java.jar는 샘플 앱의 PeerConnectionClient.java 에서 org.webrtc.voiceengine 를 Import 하는 부분이 있어서 library를 추가해 주어야 하며, autobanh.jar는 샘플 앱에서 사용하는 websocket 관련 라이브러리이다. base_java.jar는 org.webrtc.ThreadUtils 를 Import하는 부분들이 있어서 추가해 주어야 한다.


2. 빌드 환경 설정

build.gradle 를 다음과 같이 변경해 주어야 한다.



 Module:app 의 build.gradle를 클릭하고 다음과 같이 dependencies를 추가한다.


 그리고 jni 폴더를 다음과 같이 추가해 준다. (아래의 sourceSets.main 부분)

 이렇게 설정을 하게 되면 app 밑에 다음과 같이 jniLibs가 나타나게 된다.


3. 테스트

 크롬 브라우저로 https://appr.tc/ 에 접속하여 아무 번호의 Room 을 만든다. (Join Click) App을 실행시키고 동일한 Room 넘버를 입력하고 초록색 전화 icon을 클릭한다. 브라우저와 앱에서 각각의 영상/음성이 전송/출력 됨을 확인할 수 있다.



반응형
Posted by alias
,