Foldables, App Bundles & more from Android Dev Summit ‘18!

TIMOTHY JORDAN : 안녕하세요, 저는 Timothy Jordan입니다 "개발자 쇼"

오늘 우리는 Android Dev Summit에 있습니다 캘리포니아 주 마운틴 뷰의 컴퓨터 역사 박물관 (Computer History Museum) 안드로이드가 어디서 왔는지 바로 아래로 10 년 전에 시작되었고 오늘도 여전히 발전하고 있습니다 정상 회담과 마찬가지로 모든 세션 온라인으로 기록되고 이용 가능하며, 그러나 원하는 경우 콘텐츠의 톤이야 그냥 하이라이트를 얻을 수 있습니다 여기는 Android Dev Summit Top 5입니다

번호 0, 우린 엔지니어 야 우리는 그렇게 할 수 있습니다 그러나 진지하게 이것은 약간의 메타 하이라이트 다 기조 연설에 대해 가장 인상 깊었던 점 무대에있는 모든 사람이 개발자 피드백을 얼마나 자주 언급했는지 연사 1 : 귀하의 의견

연설자 2 : 피드백 연사 3 : 피드백 발표자 4 : 피드백 연설자 5 : 피드백 발표자 6 : 피드백

연설자 7 : 피드백 TIMOTHY JORDAN :이 팀은 피드백을 많이 듣고 있습니다 그것을 플랫폼 로드맵에 넣습니다 그의 소개에서 Dave Burke even 안드로이드 플랫폼을 강력한 SDK라고 부름 개발자가 가장 먼저 생각합니다 그리고 나는 우리가 그 모든 것을 보았다고 생각합니다

발표 어쨌든 1 번 앱 번들 이제 Google Play에서 안정적으로 사용할 수 있습니다 평균적으로 앱은 35 %의 크기 절감 효과를보고 있습니다 범용 APK에 비해 또한 인스턴트 앱도 지원됩니다

앱 번들의 일부로 이제는 즉시 및 설치된 앱 모두에 대해 하나의 번들을 업로드하십시오 이제 동적 형상 모듈을 테스트 할 수 있습니다 필요에 따라 모듈을로드 할 수 있습니다 핵심 APK를 더욱 작게 만듭니다 2 번, Google Play 인앱 업데이트 API

앱 내에서 업데이트를 실행할 수 있습니다 사용자가 예상되는 차단 흐름이있는 경우 업데이트를 즉시 적용하거나 유연한 업데이트를 적용하려면, 여기서 즉시 업데이트 할 필요는 없습니다 이제 우리 중 일부는 우리 자신의 비슷한 흐름을 만들었습니다 전에는 표준 구현이지만, 사용하기 쉽습니다 이제 번호 3, Kotlin 1

3 코 틀린은 작년에 안드로이드를위한 일류 언어가되었습니다 Android 용으로 개발하는 멋진 방법입니다 이 최신 버전에는 새로운 기능이 포함되어 있습니다 인라인 클래스, 부호없는 숫자, 그리고 아마도 가장 중요한 것은 코 루틴 지원 이제 안정적입니다

아직 Kotlin을 파헤칠 기회가 없다면, 그들이 그것을 위해 발표 한 것이 한 가지 더 있습니다 너에게 관심이있는 정상 회담에서, 안드로이드에 대한 새로운 Udacity 과정의 미리보기 Jetpack을 사용한 Kotlin의 앱 개발 및 다른 인기있는 타사 라이브러리 네 번째 목록에는 Android Jetpack에 대한 업데이트가 나와 있습니다 나는 그것이 아주 멋지다 고 생각한다 공개 된 상태로 개발되고있다

AOSP는 이제 우리 모두가 기능과 버그를 볼 수 있음을 의미합니다 개발자가 개발하고 제공하는 수정 라이브러리 중 하나에 또한 Architecture Components 라이브러리 Jetpack으로 I / O에서 발표 된 이달 말에 베타 버전으로 제공 될 예정입니다 작업 관리자는 백그라운드 작업, 내비게이션은 스튜디오에서 통합 툴링을 사용합니다 인앱 탐색을 단순화합니다

우리 마지막 번호, 5 번 접을 수있는 장치가 있어야한다는 것을 알고 있습니다 이들은 매우 시원하며 완전히 이해할 수 있습니다 Android 플랫폼에서 다양한 화면 크기를 지원합니다 밀도를 오랫동안 유지합니다

여기서 킬러 기능은 화면 연속성이며, 접힌 상태에서 시작하는 것을 의미합니다 더 작은 스크린, 그리고 전개 할 때, 더 큰 화면으로 원활하게 전송됩니다 팀에서 크기를 조정할 수있는 깃발을 추가하고 있습니다 따라서 앱은 접기 및 펼치기에 응답 할 수 있습니다 그게 당신의 Android Dev Summit Top 5입니다

더 많은 발표와 업데이트를 원하시면, 아래 설명에있는 링크를 클릭하십시오 그리고 거기가는 길에 잠시 쉬어 라 좋아하는 버튼, 구독 버튼, 이 비디오를 친구들과 공유하십시오 감사합니다 감사합니다

더 많은 일을함으로써 저는 The Developer Show의 Timothy Jordan입니다 다음 정상 회담에서 보자

Connect multiple video devices on Android via USB Camera app

외부 전원 공급 장치가있는 USB 30 허브 OTG 케이블 4 채널 EasyCap (STK1160 칩셋) 이제 아날로그 비디오를 볼 수 있습니다

HD 프로 웹캠 C920 MS LifeCam HD-3000 웹캠 C110 이제 장치 대화 상자에서 각 장치를 신속하게 전환 할 수 있습니다! EasyCap 장치 옵션을 변경할 수도 있습니다 시청 해주셔서 감사합니다!

Android Meets TensorFlow: How to Accelerate Your App with AI (Google I/O ’17)

[음악 재생] KAZ SATO : 고맙습니다 우리 세션에 참석해 주셔서 감사합니다

"Android Meets TensorFlow " 저는 사토 카즈입니다 저는 Google Cloud Platform 팀의 개발자 대행사입니다 과– HAK MATSUDA : 안녕하세요 좋은 아침

아주 이른 아침에와 주셔서 감사합니다 나는 아침에 사람이 아니기 때문에 나는 조금 졸려있다 어쨌든, 제 이름은 마츠다 하쿠로입니다 나는 안드로이드 게임 개발자 옹호자이다 및 고유 기술

KAZ SATO : 그래서 오늘,이 세션에서, 우리는이 주제들에 대해 토론하고 싶습니다 그래서 이번 세션의 첫 번째 부분은, 나는 AI, 기계 학습, 신경 네트워크, 깊은 학습, Google이 이러한 종류의 기술을 어떻게 사용하고 있는지 우리의 서비스를 구현합니다 그리고 TensorFlow는 무엇입니까? 그것은 건물을위한 오픈 소스 라이브러리입니다 너 자신의 신경망 그리고 나는 Hak에 그 무대를 전달할 것이다

그는 당신이 안드로이드를 어떻게 구축 할 수 있는지 논의 할 것입니다 TensorFlow에서 제공하는 애플리케이션 최적화 방법 마지막으로 미리보기를하고 싶습니다 TensorFlow Lite 및 Android와 같은 새로운 기술 신경 네트워크 API 그렇다면 기계 학습과 신경망은 무엇입니까? 얼마나 많은 사람들이 실제로 신경 네트워크를 시도 했습니까? 몇 명? 오, 너무 많은 사람들! 20 %처럼? 실제로 얼마나 많은 사람들이 신경망을 실제로 사용 했습니까? 모바일 장치에서? 매우 감사합니다 나는 10 명의 사람들을 발견했다

오늘은 TensorFlow를 사용하는 방법을 배우고 싶습니다 기계 학습 모듈 실행 내부 모바일 애플리케이션 너무 많은 유행어가있었습니다 인공 지능, 기계 학습, 신경 네트워크, 또는 깊은 학습 우리는 그 유행어에 대해 들었습니다

지난 몇 년간 차이점이 뭐야? 인공 지능이나 인공 지능 – 당신은 건물과 같은 똑똑한 것을 만들기위한 과학입니다 자율 주행 차 또는 아름다운 그림을 그리거나 음악을 작곡하는 컴퓨터 AI의 비전을 실현하는 한 가지 방법 기계 학습에 있습니다 기계 학습은 당신은 컴퓨터가 스스로 훈련하는 것을 허용 할 수 있습니다 모든 단계를 지시하는 인간 프로그래머, 자체적으로 데이터를 처리합니다

그리고 기계 학습에서 많은 다른 알고리즘 중 하나 신경 네트워크입니다 그리고 2012 년 이래로 우리는 큰 돌파구를 보았습니다 신경 네트워크의 세계에서, 특히 이미지 인식, 음성 인식, 또는 자연어 처리 및 기타 여러 응용 프로그램에 사용할 수 있습니다 그리고 Google에서 우리는 몇 년 동안 신경 네트워크 기술을 개발했다 그렇다면 신경 네트워크 란 무엇입니까? 수학의 함수처럼 생각할 수 있습니다

또는 프로그래밍 언어의 함수 따라서 모든 종류의 데이터를 입력으로 넣을 수 있습니다 일부 행렬 연산 또는 계산 수행 신경 네트워크 내부 그런 다음, 결과적으로 출력 벡터를 얻을 수 있습니다 많은 레이블이나 추측 값을 가지고있다

예를 들어 이미지가 많은 경우, 당신은 분류하기 위해 신경 네트워크를 훈련시킬 수 있습니다 어느 것이 고양이의 이미지인지 또는 개 이미지인지 그리고 이것은 사용의 한 예일뿐입니다 신경 네트워크의 경우 기술을 적용하여 모든 종류의 비즈니스를 해결할 수 있습니다

문제가 있습니다 예를 들어, 게임 서버가 많은 경우, 다음 모든 사용자 활동을 변환 할 수 있습니다, 플레이어 활동, 숫자의 무리로 그들을 변환, 벡터와 같은 신경망을 학습하고 신경 네트워크를 훈련 시키십시오 게임 서버의 플레이어 유형을 분류합니다 예를 들어, 어떤 치욕적 인 플레이어를 찾고 싶다면 자동화 된 스크립트를 사용하여 귀하의 서버에서 속이려고하거나 프리미엄 플레이어를 찾기 위해 신경망을 사용할 수 있습니다 게임 서버에서 점점 더 많은 아이템을 구입할 수 있습니다

그래서 이것은 하나의 가능한 예일뿐입니다 가능한 수천 가지 응용 프로그램 중 Google은 심층 학습 기술을 사용해 왔습니다 100 개가 넘는 스마트 기능 구현을위한 Google 검색, Android, Play, 및 많은 다른 응용 프로그램 예를 들어 Google 검색을 매일 사용하는 경우, 즉, 깊은 학습 기술에 액세스하고 있음을 의미합니다 매일 Google에서 제공합니다

2015 년에 RankBrain을 도입 했으므로, 이는 깊은 학습 기반 랭킹 알고리즘 인 정의 및 순위 지정을위한 신호를 생성합니다 검색 결과 모바일 애플리케이션을 살펴 본다면 Google의 예를 들어 Google 포토는 하나입니다 가장 성공적인 모바일 애플리케이션의 분석과 이해를 위해 깊은 학습을 해왔다 스마트 폰이 찍은 각 이미지의 내용, 그래서 직접 태그 나 키워드를 넣을 필요가 없습니다 대신, 당신은 단지 강아지, 당신의 친구의 이름, 또는 결혼식 파티 가이 콘텐츠를 기반으로 이미지를 찾을 수 있습니다

스마트 회신은 회신 옵션을 표시하는 기능입니다 각 이메일 스레드로 그래서 자연 언어 처리를 사용합니다 신경망 모델에 의해 구동 됨 전자 메일 교환의 컨텍스트를 이해하려고 시도합니다 그리고 지금, 응답의 12 % 이상 스마트 회신 기능으로 생성됩니다

이제 컴퓨터로 이메일을 작성했다고 말할 수 있습니다 더 이상 인간이 아닙니다 Google 번역 앱이 최근에 소개되었습니다 새로운 신경 번역 모델 인 품질, 특히 유창함이 향상되었습니다 번역 된 텍스트의 따라서 가능한 많은 유스 케이스가 있습니다

기계 학습 간의 결합 모바일 애플리케이션, 시작 이미지 인식, OCR, 음성 텍스트 텍스트 음성 변환, 번역 및 NLP가 포함됩니다 특히 기계 학습을 적용 할 수 있습니다 모션 감지 또는 GPS와 같은 모바일 전용 애플리케이션 위치 추적 그리고 왜 당신은 당신의 기계를 운영하고 싶습니까? 학습 모델, 신경 네트워크 모바일 애플리케이션 내부의 모델? 기계 학습을 사용함으로써, 상당한 양의 트래픽을 줄일 수 있습니다 그리고 당신은 훨씬 더 빠른 응답을 얻을 수 있습니다

귀하의 클라우드 서비스에서 원시 데이터에서 의미를 추출 할 수 있기 때문입니다 그게 무슨 뜻이야? 예를 들어, 기계 학습을 사용하는 경우 이미지 인식, 가장 쉬운 방법 이를 구현하기 위해서는 모든 원시 이미지 데이터를 보내야합니다 카메라에 의해 서버로 전송됩니다 대신에 기계 학습 모델을 실행하게 할 수 있습니다

귀하의 모바일 응용 프로그램 내부에서 귀하의 모바일 응용 프로그램 각 이미지에 어떤 종류의 물체가 있는지를 인식 할 수 있고, 그래서 당신은 단지 꽃과 같은 라벨을 보낼 수 있습니다 또는 사람의 얼굴을 서버에 보냅니다 트래픽을 1/10 또는 1/100로 줄일 ​​수 있습니다 상당한 양의 트래픽 절감 효과가 있습니다 다른 예는 모션 디텍션 일 수 있습니다

여기서 모든 움직임, 감각 데이터를 수집합니다 – 원본 이미지를 서버로 직접 보내지 않고, 기계 학습 알고리즘을 사용하여 추출 할 수 있습니다 소위 특징 벡터 기능 벡터는 숫자의 무리 일뿐입니다 특성을 나타내는 100 개 또는 1,000 개의 숫자 또는 모션 센서로부터의 모션의 서명 따라서 100 또는 1,000 개의 숫자 만 보낼 수 있습니다

특징 벡터에서 서버로 그리고 빌드의 출발점은 무엇입니까? 기계 학습으로 구동되는 모바일 애플리케이션? 출발점은 TensorFlow, 머신의 오픈 소스 라이브러리 Google의 정보 TensorFlow는 최신 프레임 워크입니다 기계 학습 또는 인공 지능 기반 서비스 개발을위한 개발 Google에 2015 년 11 월에 오픈했습니다 이제 TensorFlow가 가장 인기있는 프레임 워크입니다

신경 네트워크 또는 세계에서 깊은 학습을 구축합니다 TensorFlow로 얻을 수있는 한 가지 이점 개발의 용이성이다 시작하기가 정말 쉽습니다 몇 줄의 파이썬 코드를 작성할 수 있습니다 또는 수십 줄의 파이썬 코드를 사용하여 신경망을 정의하십시오

혼자서 실제로이 기술은 사람들에게 매우 가치가 있습니다 나는 정교한 수학적 지식이 없기 때문에 나를 좋아한다 배경 그래서 신경망에 관한 교과서를 읽기 시작했을 때, 나는 교과서에 많은 수학 방정식을 발견했다

차별 증식, 역 전파, 및 그라디언트 디센트 그리고 저는 모든 것을 혼자서 구현하고 싶지 않았습니다 대신, 이제 TensorFlow를 다운로드 할 수 있습니다 여기서 한 줄의 파이썬 코드를 작성할 수 있습니다 GradientDescentOptimizer와 같습니다

그 한 줄의 코드는 캡슐화 할 수 있습니다 그래디언트 디센트, 역 전파, 또는 구현 된 기타 최신 알고리즘 Google 엔지니어가 그래서 너는 너 자신을 가질 필요가 없다 신경망을 구현하도록 설정된 기술 기술을 처음부터 또한 TensorFlow의 이점 이식성과 확장 성입니다 예를 들어, 기술로 시작한 TensorFlow를 다운로드 할 수 있습니다

Mac 또는 Windows에서만 사용할 수 있습니다 아주 간단한 샘플의 Hello World 종류로 재생할 수 있습니다 그러나 기술에 대해 진지하게 생각하고 있다면 예를 들어 모델을 처음부터 렌더링하려는 경우 고양이의 이미지를 인식하려면 다음을 사용하십시오 GPU 서버 – GPU는 10 배 또는 50 배이기 때문에 CPU 또는 Mac 또는 Windows보다 빠름 – 모델 훈련 하지만 Google 어스와 같은 많은 대기업 또는 다른 모든 기업에서 클라우드에서 수십 또는 수백 개의 GPU 실행 컴퓨팅 파워가 가장 크기 때문에 깊은 학습 기술에 대한 도전

하지만 여전히 큰 변화는 필요 없습니다 귀하의 TensorFlow 신경망에, TensorFlow는 확장 가능하도록 설계 되었기 때문에 따라서 일단 신경 네트워크를 정의하면, 너는 그것을 배우고, 훈련하고, 사용할 수있다 단일 CPU 또는 다중 GPU에서, 또는 수백 개의 GPU 또는 TPU 또는 Tensor 처리 장치, Google에서 설계 한 ASIC 또는 맞춤형 ADSI입니다 그리고 일단 모델 교육을 마치면, 당신은 모델을 복사 할 수 있습니다 예를 들어, 이미지 인식을 위해, 단일 모델은 100 메가 바이트 데이터, 매개 변수

이러한 매개 변수를 모바일 장치에 복사 할 수 있습니다 Android, iOS 또는 Raspberry Pi와 같은 그리고 TensorFloworg 웹 사이트에 가면, 당신은 임베디드 시스템을위한 샘플 코드를 찾을 수있다 및 휴대 전화 그런 다음 TensorFlow에서 얻을 수있는 이점 지역 사회와 생태계입니다

따라서 실용적인 제작 품질을 원한다면 솔루션을 제공한다면 TensorFlow는 그 최선의 대답 너무 많은 대기업과 개발자가 있기 때문에 심각한 개발을 위해 TensorFlow를 사용하는 사람들, ARM, 이베이, 인텔, 드롭 박스, 트위터 등이있다 그들은 모두 TensorFlow를 사용하고 있습니다 이제는 무대를 Hak에 전달하고 싶습니다 누가 당신이 안드로이드를 어떻게 구현할 수 있는지 이야기 할 것입니다

TensorFlow에서 제공하는 애플리케이션 [박수 갈채] 오 감사합니다 Hak MATSUDA : 고마워요, Kazu Android 부분으로 넘어 갑시다 Kazu가 말했듯이, 우리는 많은 것을 발견했습니다

TensorFlow를 실행하는 유용한 사용 사례 모바일 장치에 대한 추론 우리가 어떻게 통합 할 수 있는지 살펴 보겠습니다 모바일 장치의 TensorFlow 추론 우리가 어떻게 그것을 최적화 할 수 있는지에 대해 설명합니다 TensorFlow는 다음을 포함한 여러 모바일 플랫폼을 지원합니다 Android, iOS 및 Raspberry Pi와 호환됩니다

이 강의에서는 Android와 같은 휴대 기기에 중점을두고 및 IOS TensorFlow 공유 객체를 처음부터 빌드하기 조금 까다 롭습니다 여러 단계를 거치기 시작했습니다 GitHub의 [INAUDIBLE], Bazel 설치, 설치 안드로이드 스튜디오, 안드로이드 SDK 및 NDK, 마지막으로 설정 파일을 편집하는 등의 작업을 수행 할 수 있습니다 그러나 우리에게는 오늘 좋은 소식이 있습니다

이 IO를 발표하면서 방금 JSON 통합을 추가했습니다 그 단계가 훨씬 쉬워집니다 [박수 갈채] 고마워요, 고마워요 빌드 줄에 하나의 선을 추가하기 만하면됩니다 Gradle은 나머지 단계를 처리합니다

도서관 자료실에서 [INAUDIBLE] TensorFlow 공유 객체가 JCenter에서 다운로드되면, 응용 프로그램과 자동으로 연결됩니다 또한 미리 작성된 모델을 가져올 수 있습니다 파일 (예 : 시작, 스타일 화, 등등, 구름 에서뿐만 아니라 iOS에서도 쉽게 사용할 수 있습니다 우리는 Cocoapod 통합을 시작했습니다

지금은 아주 간단합니다 TensorFlow API를 사용하는 방법을 살펴 보겠습니다 Android 유추 라이브러리를 출시했습니다 Java 응용 프로그램 용 TensorFlow를 통합합니다 라이브러리는 Java의 [INAUDIBLE]입니다

네이티브 구현에 성능에 미치는 영향은 최소화됩니다 처음에는 TensorFlow 유추 인터페이스를 만들고, APK의 자산에서 모델 파일을 엽니 다 그런 다음 피드 API를 사용하여 입력 피드를 설정하십시오 모바일에서는 입력 피드가 카메라, 가속도계, 등등

그런 다음 추론을 실행하십시오 마지막으로 결과를 가져올 수 있습니다 거기에 fetch 메소드를 사용합니다 이 통화가 모두 통화를 차단하고 있음을 알 수 있습니다 따라서 작업자 스레드에서 실행하는 대신 작업 스레드에서 실행하려고합니다

API는 길고 오랜 시간이 걸릴 것이기 때문에 메인 스레드, 몇 초 이것은 Java API입니다 물론 일반 C ++ API도 사용할 수 있습니다 당신이 C ++을 사랑한다면 내가하는 것처럼 승인

데모로 넘어 갑시다 이것은 Android에서 실행되는 TensorFlow 샘플입니다 샘플에는 세 가지 모드가 있습니다 첫 번째는 Inception v3을 실행 중입니다 카메라 이미지를 분류합니다

또한 분류 된 얼굴과 양식화 된 사진이 있습니다 견본 이 사진은 카메라 미리보기에 예술적 필터를 적용하고 있습니다 [박수 갈채] 고맙습니다 그리고 데모에서 한 가지 특별한 점 GPU를 사용하여 데모를 약간 수정 한 것입니다

[INAUDIBLE] 계산 쉐이더를 사용하십시오 [INAUDIBLE] 샘플은 CPU를 지원합니다 새로운 최적화 하지만 GPU를 사용하여 그것을 조정했습니다 그리고 이것은 단지 실험을 위해서 였고 재미를 위해서였습니다

그것은 꽤 재미 있었다 그리고 저는 TensorFlow를 GPU에 맞게 최적화하는 방법을 많이 배웠습니다 기본적으로 Android 기기에서 성능 제한 요소 대부분 메모리 대역폭에서 발생합니다 컴퓨팅 자체가 아니라 메모리 대역폭 줄이기 많은 도움이되었습니다 예를 들어, 어떤 [INAUDIBLE] 커널에서, 그것은 32 32 x 32 32 x 4 샘플을 가져 오는 중입니다

하나의 출력 값을 생성하기 만하면됩니다 Compute의 관점에서 엄청난 양의 데이터입니다 셰이더 따라서 메모리 대역폭은 안드로이드에있어 결정적으로 중요합니다 및 모바일 장치 최적화

어쨌든, 모두 TensorFlow 코드를 조정할 수 있습니다 오픈 소스이기 때문입니다 오픈 소스의 아름다움입니다 맞죠? 이제 모바일에 TensorFlow 추론을 통합 할 수 있습니다 내가 아주 쉽게 설명했다

그러나 성능에는 아직 문제가 있습니다 심지어 모바일 장치 성능 상당히 증가했다 클라우드 나 데스크톱보다 컴퓨팅 성능이 떨어집니다 또한 제한된 RAM을 가지고 있습니다 모바일에 소중한 자료

응용 프로그램이 1 기가 바이트의 RAM을 사용한다면, 그때 응용 프로그램은 매우 가능성이 높습니다 시스템 자체에 의해 죽임을 당한다 응용 프로그램이 백그라운드로 이동하면 행복한 상황이 아니지, 그렇지? TensorFlow를 최적화 할 수있는 방법에 대해 살펴 보겠습니다 그래픽, 메모리 사용 공간 감소, 런타임 성능 향상 및로드 시간 개선 잘 이 모델은 Inception v3 모델의 모델입니다 이 모델은 약 91 메가 바이트의 저장 공간을 필요로하며, 2,500 만 가지 매개 변수가 있습니다

그리고 바이너리 크기는 12 메가 바이트 걸릴 것입니다 그것은 거대합니다 그리고 우리는 그래프를 최적화하는 여러 기법을 가지고 있습니다 Graph Transform (그래프 변환)을 사용하여 그래프 고정 도구, 양자화, 메모리 매핑 등 가자

그래프 정지는로드 중 하나입니다 시간 최적화, 변수 노드를 변환 상수 노드에 변수 노드 란 무엇입니까? TensorFlow에서 변수 노드는 다른 파일에서 시작됩니다 그러나 상수 노드가 포함되어 있습니다 그래프 def 자체에서

따라서 변수를 상수 노드로 이동하십시오 여러 개의 파일을 하나의 파일로 연결할 수 있으며, [INAUDIBLE]처럼 그것은 약간의 성능이 될 것입니다 모바일에서 이기고 다루기가 더 쉽다 그렇게하기 위해 우리는 동결 그래프 점 파이썬 스크립트를 준비합니다

그래프 변환 도구는 친구입니다 이 도구는 다양한 최적화 작업을 지원하며, 추측을 위해 사용되지 않는 노드를 스트립하는 것과 같은 하지만 그것은 학습 문구에서만 사용됩니다 추론 노드를 배울 때 필요하지 않습니다 나는 그것이 현재 약간의 작은 단계가 필요할 것이라고 생각한다

어떤 노드가 시작 노드인지 판단한다 어느 노드가 출력 노드인지를 결정한다 따라서이 도구는 시작과 출력이 모두 필요합니다 포인트는 수동으로 지정됩니다 양자화에 대해 이야기 해 봅시다

신경망 작업에는 무리가 필요합니다 매트릭스 특성의, 곱하기의 톤을 의미 추가 작업 현재 모바일 장치는 일부 기능을 수행 할 수 있습니다 전문 하드웨어 예를 들어, [INAUDIBLE] 명령 CPU, 범용 컴퓨팅 GPU, DSP 등에서

대략적으로 모바일 CPU에서는 총 10 ~ 20GB FLOPS GPU를 사용하면 300 ~ 500 기가 플롭스 이상을 달성 할 수 있습니다 큰 숫자처럼 들리지만 여전히 데스크톱 또는 서버 환경 기반 그래서 우리는 최적화를 수행하기를 원합니다 양자화는 기술 중 하나입니다 메모리 사용 공간과 컴퓨터 부하를 줄입니다 일반적으로 TensorFlow는 단 정밀도 부동 값을 사용합니다

입력 및 수학을 위해 또한뿐만 아니라 출력 아시다시피, 단 정밀도 부동 소수점 각각 32 비트 걸린다 그러나 우리는 정밀도를 16 비트, 8 비트로 줄일 수 있다는 것을 발견했습니다 비트 또는 심지어 더 적은 결과를 유지하면서, 우리의 학습 과정에는 자연에 의해 약간의 잡음 그리고 약간의 여분의 소음을 추가하는 것은별로 중요하지 않습니다

따라서 양자화 된 가중치가 최적화입니다 저장 공간의 크기를 줄이면 정밀도가 떨어집니다 그래프 파일의 상수 노드의 값 그러나 양자화 된 가중치 최적화와 함께, 값은 메모리에 확장됩니다 그래프가로드됩니다

그래서 우리에게는 또 다른 최적화가 있습니다 우리는 그것을 양자화 된 계산이라고 부를 수 있습니다 양자화 된 계산으로, 우리는 양자화 된 값을 사용하여 계산 정밀도를 줄일 수 있습니다 예배 규칙서 이것은 첫 번째 메모리 대역폭에 좋으며, 이는 모바일 장치의 제한 요소입니다

또한 하드웨어는 이러한 정밀도 값을 더 빨리 처리 할 수 ​​있습니다 단 정밀도 부동 값보다 그러나 우리는 여전히 열려있는 문제가 있습니다 양자화 된 계산을 수행하기 위해 최대 값과 최소값이 필요하다 양자화 된 값의 범위를 지정합니다 우리는 여전히 훌륭한 해결책이 없습니다

그것은 여전히 ​​수동입니다 그러나 활발한 연구가 진행되고 있으므로 희망적으로이 문제는 곧 해결 될 것입니다 이것은 양자화 된 특성화의 예입니다 최적화는 TensorFlow에서 작동합니다 TensorFlow에는 양자화를 지원하는 일부 연산이 있습니다 예를 들어, 행렬에 대한 컨볼 루션 [INAUDIBLE] 등을 곱하십시오

우리는 그것이 충분히 다루기에 충분하다고 생각합니다 대부분의 추론 시나리오 그러나 우리는 여전히 연산 순서를 양자화하지 않았습니다 아직 값을 양자화하고 값을 역 양자화해야하기 때문에 각 노드의 앞과 뒤 바로 출력 그리고 그래프 변환 도구는 부품을 분석합니다

각 그래프 노드의 때로는 불필요한 양자화 및 역 양자화 된 값 메모리 매핑은 로딩 시간에 대한 또 다른 최적화입니다 이 최적화를 통해 모델 파일 변환되어 직접 매핑 될 수 있습니다 약간있을 수있는 memmap API 사용 일부 Linux 기반 운영에서 성능 최적화 Android와 같은 시스템입니다 또 하나는 실행 파일 크기를 줄이는 것입니다

모바일에서 중요한 주제입니다 모바일 장치에서, 실행 가능한 패키지 크기는 특정 크기로 제한됩니다 Android의 경우 100 메가 바이트, 이진, 그래픽 및 기타 리소스를 포함하여 기본적으로 휴대 장치는 선택한 여러 개의 거의 충분하다 추론 작업을 커버하지만, ops는 학습 프로세스를 사용 누락 따라서 모바일 장치에서 학습을하고 싶다면, 추가 작업을 등록해야합니다

또한 그래프에 일부 사전 등록 된 작업, 또한 그 중 일부를 제거합니다 그렇게하기 위해 선택 등록을 할 수 있습니다 예를 들어, Inception v3의 경우, 선택 등록을함으로써, 원래의 바이너리 크기는 12 메가 바이트였습니다 최적화 후에는 15 메가 바이트로 줄일 수 있습니다

이 최적화를 위해서는 공유를 다시 빌드해야합니다 당신 지역의 물건 따라서 빌드 환경을 구축해야합니다 따라서 이러한 최적화를 통해 Inception v3 그래프 이제 23 메가 바이트와 15 메가 바이트가됩니다

현재 바이너리 크기는 75 % 작아집니다 카즈 돌아 가자 KAZ SATO : Hak 고맙습니다 하크 (Hak)가 언급했듯이, 너무 많습니다

[박수 갈채] 고맙습니다 Hak이 언급했듯이, 많은 팁과 트릭이 있습니다 TensorFlow 모델 최적화 안드로이드 모바일 응용 프로그램으로 짜내다 그리고 바로 지금 할 수있는 일입니다 이러한 기술은 현재 사용 가능합니다

하지만 지금은 조금 이야기하고 싶습니다 가까운 미래에 출시 될 새로운 기술에 대해, TensorFlow Lite 및 Android Neural Network API 등이 있습니다 NNAPI 란 무엇입니까? 신경망 처리를위한 새로운 API입니다 안드로이드 안쪽에, 그리고 안드로이드 프레임 워크에 추가됩니다 새로운 API 추가의 목적 캡슐화하고 추상화하는 것입니다

계층은 GPU, DSP, 및 ISP 최신 스마트 폰은 강력한 컴퓨팅 리소스를 갖추고 있습니다 GPU 또는 DSP와 같은 CPU 이외의 다른 장치 특히 DSP는 거대한 양의 행렬 및 벡터 계산, DSP 나 GPU를 사용하는 것이 훨씬 빠릅니다 신경 네트워크 추론,보다는 CPU를 사용하여

하지만 지금 당장 당신이 그렇게하고 싶다면, 도서관에 직접 가야합니다 하드웨어 공급 업체가 바이너리를 빌드합니다 혼자서 지루한 작업입니다 또한 휴대용이 아닙니다

대신 표준 API를 제공하여 개발자가 하드웨어 가속기를 인식 할 필요가 없다 각 개별 공급 업체로부터 Neural Network API 위에는, 우리는 TensorFlow Lite를 제공 ​​할 것입니다 그것은 새로운 TensorFlow 런타임이 될 것입니다 모바일 및 임베디드 애플리케이션에 최적화되어 있습니다

따라서 TensorFlow Lite는 스마트하고 컴팩트 한 모바일 용으로 설계되었습니다 또는 임베디드 응용 프로그램 또한 Android와 결합되도록 설계되었습니다 NNAPI 그래서 당신이해야 할 일은 TensorFlow Lite로 모델을 작성하면됩니다

결국 모든 이점을 얻게 될 것입니다 당신은 안드로이드 NNAPI에서 얻을 수 있습니다, 하드웨어 가속과 같은 가까운 장래에 오픈 소스로 등장하게 될 것입니다 그러니 계속 지켜봐주십시오 이러한 새로운 기술에 관심이 있다면, 이 QR 코드의 사진을 찍어주세요 Android 용 ML에 대한 설문 조사에 참여할 수 있습니다

의견이나 요청을 할 수있는 곳 새로운 제품을 위해 네, 고마워요 그래서 마지막으로, 아주 흥미롭고 재미있는 것을 보여주고 싶습니다 TensorFlow로 구축 된 실제 응용 프로그램 모바일 및 임베디드 시스템에서 첫 번째 응용 프로그램은 Raspberry Pi에서 실행 중이며 일본인 오이 농부에 의해 사실, 나는이 사진을 찍었다

나는 오이 농장에 가서이 사진을 찍었습니다 그리고 그들은, 당신은 볼 수 있습니다 – 오, 미안 포인터가 없습니다 [CHUCKLE] 그래서 당신은 한 사람을 중간에두고 있습니다 그는 [부적절하다]

그는 2 년 전에 오이 농업을 돕기 시작했습니다 그리고 그는 오이를 올바른 부류로 분류하는 것을 알았습니다 가장 지루한 작업입니다 그의 어머니는 하루 8 시간을 보냈다 길이, 또는 색깔에 기초하여 각 오이를 분류하고, 9 개의 다른 수업으로 그녀를 돕고 싶지 않았어

그래서 대신 그는 TensorFlow를 다운로드했습니다 그 자신의 오이 선별기를 만들었습니다 [박수 갈채] 그가 한 일은 9,000 장의 사진을 찍은 것입니다 다른 오이 중에서 그의 어머니에 의해 분류 된 레이블, TensorFlow 모델을 혼자서 교육했습니다 그리고 그는 $ 1,500을 지출함으로써 스스로로 분류기 로봇을 만들었습니다

그리고 TensorFlow 모델은 Raspberry Pi에서 실행됩니다 접시에 놓은 오이를 감지 할 수 있습니다 그리고 그것은 오이를 9 개의 다른 종류로 분류 할 수 있고, 모양과 색상을 기반으로합니다 그리고 이것은 시스템의 시스템 다이어그램입니다 그래서 세 부분으로 구성됩니다

Arduino Micro는 서버 제어에 사용됩니다 및 모델 그리고 라스베리 파이에는 오이의 사진을 찍을 카메라가 있습니다 접시에 그리고 아주 작은 TensorFlow 모델을 실행합니다

그리고 이것은 실제로 아주 훌륭한 예입니다 작업을 분할하는 방법, 작업 에지 장치 및 클라우드 파트로 기계 학습을위한로드 그는 TensorFlow 전체 세트를 실행했기 때문에 Raspberry Pi 내부의 모델이 너무 무겁습니다 그래서 그는 그것을 두 가지 과제로 나누기로 결정했습니다 따라서 TensorFlow 모델은 Raspberry Pi에서만 실행됩니다

접시에 오이가 있는지 여부를 감지합니다 그리고 접시에 오이가 있음을 감지했을 때만, 그것은 그림을 서버로 보냅니다 그는 더 강력한 TensorFlow를 가지고 있습니다 오이를 9 개로 분류 할 수있는 모델 다른 클래스 흥미로운 또 다른 응용 프로그램을 살펴 보겠습니다

Android 및 iOS에서 실행되는 체조 운동 득점자 그게 뭐야? 사실 모든 일본인은 운동을 잘 알고 있습니다 우리는 전국 라디오 방송을 가지고 있기 때문에 방송 네트워크 그들은 동시에 같은 운동 음악을 연주한다 매일 아침

그리고 수천만 명의 일본인 매일 아침 같은 운동을하고 있습니다 당신은 알고 계십니까? [웃음] 이 응용 프로그램은 – 우리는 그것을 득점자라고 부릅니다 당신은 음악으로 당신의 운동을 해왔습니다 그리고 모션 센서로 모션을 캡처하려면, 그들은 TensorFlow를 사용했습니다 그리고 그들은 TensorFlow 모델을 포착하도록 훈련시킬 수있었습니다

데이터에서 패턴 또는 피쳐 추출 모션 센서에서 인간의 손으로 만든 동작을 평가할 수 있습니다 또한 TensorFlow 컴파일러를 자체적으로 구축했습니다 그래서 그들은 기술을 적용 할 수있었습니다 양자화 또는 근사와 같은 그리고 그들은 TensorFlow를 줄일 수있었습니다

모델을 수십 메가 바이트에서 수 메가 바이트로 모델링합니다 따라서 이것이 생산 품질을 구축하는 핵심 기술이었습니다 TensorFlow 기능을 갖춘 Android 및 iOS 애플리케이션 운동 실황 시범을 보도록하겠습니다 득점자 그럼 내가 여기로 바꿀 수 있을까? 선택할 수있는 응용 프로그램입니다 다양한 종류의 운동

그리고 나는 가장 표준적인 것을 연주 할 것이다 [음악 재생] 그래서 이것은 음악입니다 [웃음] [일본 축구 연발 스코어] [박수 갈채] 나는 잘하고 있니? 그래서 그렇게 그러니 그만하자 [웃음꾼과 박수] [음악 스톱] 충분 해 충분 해 [웃음] 이제 TensorFlow 모델이 시도하고 있습니다 이 운동을 얼마나 잘 수행했는지 평가하십시오

그리고 당신은 막대 차트를 여기에서 볼 수 있습니다 그것이 TensorFlow의 변형입니다 이 애플리케이션 내부의 모델 그것은 진짜입니다 승인? 슬라이드로 돌아가십시오

그것이 우리가 보여주고 싶은 것입니다 이 세션에서는 다음을 포함한 많은 것을 배웠습니다 일본에서 또 다른 이상한 물건, 그런 다음 몇 가지 최적화 기술 TensorFlow 응용 프로그램 구축 용 양질의 안드로이드 및 iOS 애플리케이션을 제공합니다 관심이 있으시면 TensorFloworg로 이동하십시오

시작하기에 많은 자료를 얻을 수 있습니다 그리고 훌륭한 codelab이 있습니다 codelab 웹 사이트에서 정말 고맙습니다 Hak MATSUDA : 고마워

[박수 갈채]

Streaming webcam to YouTube on Android via USB Camera app

먼저 goto https://wwwyoutube

com/live_dashboard로 이동하십시오 서버 URL 및 스트림 키 가져 오기 USB 카메라 앱 설정에 서버 URL과 스트림 키 넣기 당신은 또한 QR 코드로 그들을 누른 다음 스캔 QR 코드 기능을 사용하여 각 공백을 채울 수 있습니다 웹캠 연결 IP 카메라 서버 켜기 RTMP 푸시 사용 설정 및 스트리밍 시작 이제 YouTube에서 USB 카메라 앱으로 실시간 스트리밍 시작 이제 라이브 스트림을 볼 수 있습니다

Android app development tutorial #19( Android Xml Layout Design-2 )

지금 당신 당신 당신 좋아, 내 레이아웃 섹션 꿀벌 n을 완료했습니다 그리고 당신은 사용자가 볼 수 있습니다 섹션 리사이클 러가있는 내부 레이아웃을 제공했습니다

보기와 하나의 진행 막대가있는 리사이클 러 뷰는 모든 사용자 목록 괜찮아요받는 사람 메시지에서 여기 한 사람은 상대입니다 레이아웃은 부모 레이아웃이고 내부는 선형을 제공합니다 방향이 수평이고 내가 제공 한 안쪽의 레이아웃 오리엔테이션이 수직 인 또 다른 선형 레이아웃과 체중 중 하나는 영점 5이고 다른 하나는 괜찮습니다 편도 선형 레이아웃은 x에 대한 텍스트보기를 유지하고 다른 하나는 메시지는 괜찮아요

나는 배경을 chat background 이것은 드로어 블 내부에서 생성 한 셰이프입니다 폴더 괜찮아요 및 발신자에 대한 동일한이 차이를 한 적이 있다는 것입니다 그 부모의 끝은 부모의 오른쪽에있는 정렬이다 그것은 수령인에게 당신이 왼쪽에 부모 정렬을 볼 수 있다고 말했고 모든 것이 동일하고 단지 배경이 다른 것입니다 솔리드 및 솔리드 컬러 나는 사용하지만받는 사람 섹션에서 나는 획을 긋고 내가 제공 한 사용자 프로필에서 여기 상대 레이아웃과 동일하고 하나의 원형 이미지보기 내부 내가 평소에 가지고있는 외부의 Gradle 파일이고 텍스트보기입니다 사용자 이름을 보유하고 다른 사용자 이름은 텍스트보기로 연결되었거나 사용자의 상태를 볼 수 있습니다

그것은 오늘날 우리의 개요 인 온라인입니다 그래서 오늘 그 사람들이 업로드하고 있습니다 소스 코드도 그래서 내 설명에 소스 코드의 링크를 얻을 수 있습니다 그것은 오늘입니다 그리고 우리는 다음 강의로 계속 진행할 것입니다 내 채널을 더 구독하십시오

당신

Taking Advantage of Kotlin in Your Android App with Sean McQuillan (GDD India ’17)

[음악 재생] 연사 : 시작하겠습니다 안녕하세요, 저는 Sean McQuillan입니다

저는 Android 개발자 옹호자입니다 그리고 오늘 저는 코 틀린에 관해 당신과 이야기 할 것입니다 그래, 우리는 강사 주도의 훈련을 할거야 오늘 그게 무슨 뜻이야? Kotlin에서 코드 연구소를 운영하기 위해 도움을 받으러 여기 올거야

그래서 나는 너를 도울거야 나는 약간의 지시를 걸어 갈거야 그리고 우리는 청중에 몇 가지 TA를 가지고 있습니다 그들은 당신이 가진 어떤 문제라도 당신을 도울 것입니다 오늘 내가 할 일은 우리가 우리의 다운로드를 설치함으로써 시작할 것입니다, Android Studio에서 프로젝트를 컴파일하는 중입니다

그 다음 약 10 분 강의를 드리겠습니다 그런 다음 코드 연구소의 일부에서 작업 할 것입니다 다시 이야기하겠습니다 우리는 코드 랩의 일부를 다시 사용할 것입니다 이 코드 랩에서 우리가 할 일은 Java 애플리케이션을 Kotlin으로 마이그레이션하는 것입니다

우리가 함께 만든 주소록 응용 프로그램입니다 그것은 Java로 작성되었습니다 그리고 우리는 Kotlin 변환기를 사용할 것입니다 우리는 Kotlin에 추상화를 작성하려고합니다 그리고 우리는 그것이 어떻게 가능한지를 볼 것입니다

우리의 상용구 코드를 줄이는 데 도움이됩니다 유지하기 쉽고 간결하고 읽기 쉬운 코드를 제공하십시오 그리고 우리는 몇 가지 일반적인 문제를 피할 것입니다 더 나은 코드를 작성하는 데 도움이되는 추상화를 작성합니다 그러니 계속 뛰어 들어 보자

가서 그 링크를 따라 가라 맨 위의 코드 랩을 다운로드하여 시작하십시오 1 단계와 2 단계를 수행하고 요점을 알려면됩니다 어디 안드로이드 스튜디오에서 그것을 컴파일거야 그렇게하면 우리 모두 다운로드 할 수 있습니다

모든 의존성 [음악 재생] 나는 대부분의 사람들이 그 지점에 있다는 것을 알았다 Android Studio에서 종속성을 다운로드하는 곳입니다 따라서 Wi-Fi 휴식이 효과적이었습니다 Kotlin과 함께 제공되는 정말 멋진 기능 중 하나입니다

코 틀린은 – 죄송합니다 Android Studio의 Java to Kotlin 변환기입니다 그것을 사용하려면 프로젝트에 Kotlin이 있어야합니다 로 시작하도록 구성되었습니다 그리고 자바 파일을 선택할 때마다, 코드 메뉴로 이동할 수 있습니다

Java 파일을 Kotlin으로 변환하십시오 이 변환기에 대한 정말 멋진 기능입니다 내가 제일 좋아하는 것들은 마술처럼 보인다 내가 그것을 사용할 때마다 – 붙여 넣을 때이다 클립 보드의 Java 코드를 Kotlin 파일로 변환하고, Java 코드를 자동으로 Kotlin으로 변환합니다

그것은 붙여 넣습니다 그래서 내가 지금 이야기하고 싶은 것은 단지 모든 Kotlin 구문 기본에 대한 개요 우리는 오늘 코드 랩에서 사용할 것입니다 따라서이 함수 선언을 살펴볼 수 있습니다 바로 여기, 우리는 단계적으로 그것을 거치게 될 것입니다 따라서 Kotlin에서 함수를 정의하고 싶을 때, 재미있는 핵심 단어로 정의됩니다

그래서 여기에 함수, 합, a와 b 두 개의 매개 변수가 있습니다 매개 변수에는 유형이 있습니다 a는 정수 유형이고 b는 정수 유형입니다 그리고 이것은 코 틀린 (Kotlin) 전체에 공통된 구문입니다 변수 선언 다음에 변수의 유형을 넣으십시오

따라서 이것은 자바 프로그래밍과는 다릅니다 언어, 분명히 다른 방법입니다 비슷하게, 함수의 리턴 타입 인수 뒤에 나열됩니다 따라서 두 개의 매개 변수가있는 함수 합계입니다 정수를 반환합니다

그리고 Kotlin에 대한 또 다른 멋진 기능 세미콜론은 선택 사항입니다 JavaScript와 마찬가지로 Kotlin의 디자이너 우리가 수 년 동안 우리가 코드에 세미콜론을 넣거나 세미콜론을 넣지 않아야합니다 아니요, Kotlin 코드에 세미콜론을 넣으면 안됩니다 가지고있는 반 패턴으로 간주됩니다 세미콜론은 Kotlin 코드에 있습니다

한 줄 구문으로 함수를 정의 할 수도 있습니다 당신이 여기에서 볼 수 있습니다 여기서는 함수 합을 정의합니다 다시 두 개의 매개 변수를 취하고 더하기 b를 반환합니다 그래서 그것은 바로 그 표현입니다 그리고 우리는 할당 연산자를 순서대로 사용합니다

이 방법으로 함수를 정의하십시오 언제든지 사용할 수 있습니다 당신은 함수를 정의하기를 원한다 이와 같은 단일 표현식으로 구성됩니다 여러 개의 표현식을 만들고 싶다면, 중괄호 구문을 사용해야합니다

우리가 잘 알고있는 Kotlin은 기본 인수도 제공합니다 예를 들어, 우리는 함수, 합, 대개 두 개는 정수 유형을가집니다 기본값은 2입니다 그래서 당신이 이것을 부를 때마다, 당신이 인수를 지정하지 않으면 기본적으로 2로 설정됩니다

다음은 변수 선언에 대해 설명하겠습니다 여기서는 두 변수를 정의하고 있습니다 이름이 불렀다 다른 하나는 참석자라고합니다 이름은 val이고 참석자는 var입니다

그래서이 이름은 JavaScript와 비슷합니다 그래서 나는 다른 문자열을 지명 할 수 없다 니키타가 영원 할거야 참석자는 변경할 수 있습니다 그래서 나는 그것을 인스턴스화하는 배열리스트에 할당한다

하지만 나중에 내 소스 코드에서 할 수있어 그것을 다른 배열 목록에 지정하십시오 그래서 가변 변수입니다 Kotlin은 실제로 Kotlin과 Java의 차이점이 있습니다 프로그래밍 언어가 Kotlin에 추가됨 val은 Kotlin에서 변수를 정의하는 데 선호되는 방법입니다

이 슬라이드에는 몇 가지 다른 구문이 있습니다 새로운 배열리스트를 만들 때 볼 수 있습니다 우리는 새로운 키워드를 부르지 않는다 사실, Kotlin에는 새로운 키워드가 없습니다 클래스를 생성하는 것은 함수를 호출하는 것처럼 보입니다

Kotlin에서, 그리고 이것처럼 보입니다 계속 진행중인 또 다른 일은 질문을 보게 될 것입니다 거기에 표시하십시오 이는 해당 문자열이 null이 될 수 있습니다 Kotlin은 null 가능 유형을 소개합니다

이는 기본적으로 String을 작성한 경우를 의미합니다 물음표 없이는 null이 아닌 문자열이됩니다 그리고 그 문자열은 항상 당신에게 보증 할 수 있습니다 내 코드에서 null이 아니며 널 포인터도 얻지 못한다 예외

그것이 nullable다는 것을 말함으로써, 나는 거기에 null을 저장할 수 있습니다 그리고 내가 역 참조 할 때, 나는 특별한 문법을 ​​사용해야합니다 또는 널 포인터 예외가 발생합니다 내가 이야기하고 싶은 다음 이야기 Kotlin의 데이터 클래스입니다 그것들은 많은 코드를 정의하는 간결한 방법입니다

여기서 내가 정의하는 것은 데이터 클래스 접촉입니다 3 개의 필드가 있습니다 이름, 성 및 이메일이 있습니다 Java 프로그래밍 언어에서 동일한 작업을 수행 할 수 있습니다 나는 String first name, String last name, 및 문자열 전자 메일

그리고 세명의 게터와 세터를 써야합니다 그리고 나서 equals 메서드를 작성해야합니다 그리고 toString 메서드를 작성해야합니다 모든 기능이 자동으로 생성됩니다 나를 위해 데이터 클래스를 사용할 때

이것에 관해 정말로 흥미있는 일부 나는 일반적으로 데이터를위한 클래스 몸체를 제공 할 필요가 없다 수업 내가하고있는 일이 평범한 자바 빈을 정의하는 것이라면 이런 식의 물건, 나 그냥 가면 돼 이름의 값을 선언하십시오 성을 의미하는 불변의 것을 의미합니다

또한 불변 인 것을 의미하고, 그 다음 이메일의 var 그리고 그것은 할당 가능한 필드라는 것을 의미합니다 당신이 바닥에서 보는 것처럼 이메일에 지정할 수 있습니다 이 결론에 대해 생각할 수도 있습니다

나는 현장에 직접 지정하고있다 나는 실제로 세터에게 전화하고있다 그리고 이것은 Kotlin에 대한 멋진 부분입니다 getter와 setter 모두에 대해 암시 적으로 호출되며, C #이나 Swift 같은 언어와 비슷합니다 에서이 구문을 보았습니다

Kotlin에서 흥미로운 한 가지 자바 프로그래밍에 관해서는, 종종 Java에서는 수명주기가 있습니다 Android 라이프 사이클과 관련이 있습니다 따라서 우리는 활동주기가 다릅니다 활동 개체보다 그래서 객체에는 분명히 생성자가 있습니다 그리고 나서 우리는 활동을 시작했습니다

이는 다른 방법입니다 Kotlin은 클래스의 모든 null이 아닌 변수가 필요합니다 constructor의 말미에 의해 초기화된다 예를 들어, 공유 할 때 문제가 될 수 있습니다 생성자가 끝난 후 환경 설정

여기서 우리는 SharedPreferences를 만들 수있는 예제를 볼 수 있습니다 variable null 가능 그리고 우리가 접근 할 때, 우리는 더블 뱅 (double bang)을 사용하거나 확인을 위해 if 체크를해야한다 우리가 액세스 할 때마다, 우리가 널 (null) 변수에 액세스합니다 코 틀린에서 이것을 쓰는 더 좋은 방법은 – 안드로이드에서 우리가 할 일이 많습니다

lateinit을 사용하는 것입니다 그래서 한 lateinit 말한다 – 조금 이상한 구조입니다 그러나 이것이 실제로 의미하는 것은,이 SharedPreferences 내가 액세스 할 때 null이 아니게 될 것입니다 그러나 나는 그것을 끝내겠다고 보장 할 수는 없다 생성자가 끝날 때까지 그래서이 변수에 접근하기 전에 어느 시점에서, 저는 컴파일러에게 약속하지 않을 것입니다

따라서 null 허용 여부 검사를 완화 할 수 있습니다 하지만 그것을 지정하도록 강요하지 않을거야 생성자가 완료되기 전에 해당 필드를 실제로 초기화하지 않은 경우 그것을 액세스하면 다른 런타임 예외가 발생합니다 그래서 그것은 실제로 null 포인터 예외를 만들지 않습니다

여기까지 완전히 가버 리지 만 분명히 문서화되어있다 당신이하려는 일 여기서는 구문에 대한 기본적인 내용을 다루었습니다 코드 랩으로 돌아갈 시간입니다 3 단계를 거치면 방금 전에 말한 몇 가지 단계를 수행하십시오

일부 언어 구문을 사용하십시오 [음악 재생] 그래서 나는 한 쌍의 사람들에게서 한 가지 질문을했다 사실, Kotlin은 실제로 Java로 컴파일하기 전에 바이트 코드로 컴파일합니까? 그리고 답은 Kotlin이 직접 바이트 코드로 컴파일합니다 JVM-6 호환 바이트 코드를 생성하고, 또한 약간의 추가 정보를 추가합니다 바이트 코드로 Kotlin 언어의 일부를 지원한다

구문에 실제로 저장되는 구문 바이트 코드 파일의 헤더에있는 버퍼 따라서 자바에 대한 Kotlin과 같은 바이트 코드는 없습니다 Bytecode에 Kotlin, 바이트 코드에 Java, 그런 다음이 둘을 연결합니다 지금 제가 이야기하고 싶은 것은 Kotlin 뷰 바인딩입니다 Android 확장 플러그인입니다

JetBrains에서 온 것입니다 또한 합성 속성을 사용하여 뷰에 액세스 할 수 있습니다 그래서 우리는 이미 자바에서 이것을하기위한 라이브러리를 가지고 있습니다 프로그래밍 언어 아마 우리 모두는 버터 나이프를 보았을 것입니다

여기서 ID로 찾아보기를 건너 뛸 수 있습니다 이것은 매우 유사한 아이디어입니다 ID로 찾기 창을 건너 뛸 수 있습니다 Kotlin 컴파일러는 컴파일 시간에이를 수행 할 것이며, lazy 할당 및 캐싱을 제공합니다 그래서 저는 앞으로 나아가서 걸어 갈 것입니다

여기 몇 가지 슬라이드에서 뷰 바인딩을 사용하는 방법을 설명합니다 그래서 앱 수준의 Gradle 파일에서 이것들은 4 단계의 단계들입니다 우리는 계속해서 플러그인을 적용합니다 kotlin-android-extensions 그리고 우리가 그것을 할 때, 그것은 가고 있습니다

kotlinx 네임 스페이스에 합성 게터를 생성합니다 그래서 kotlinxandroidsynthetic입니다 그리고 이제 우리는 코드를 작성합니다

mainactivity_contacts가 있습니다 이것이 우리가 정의한 레이아웃 파일입니다 그리고 거기에서 우리는 전망을 얻을 수 있습니다 예를 들어 activity_contacts

xml을 with로 선언 한 경우 플로팅 액션 버튼이 있으며 ID가 있습니다 이것은 꽤 전형적인 코드입니다 수업 시간에 이것을 사용하고 싶을 때, ID로 찾아보기를 사용하는 대신 또는 contacts_activity에 대한 속성을 정의 할 수도 있습니다 나는 그냥 가서 FAB 액세서리를 사용할 수 있습니다 그리고 그것은 종합적으로 추가되었습니다

정적 가져 오기를 수행하면됩니다 ID로 찾기보기를 캐싱 할 것입니다 그래서 내가 FAB에 처음 접근했을 때, 그것을 찾기 위해 뷰 ID를 찾을 것입니다 그리고 나서 나는 그것을 액세스 할 때마다, 같은 인스턴스를 사용합니다 그리고 그것을 해시 맵에 캐시합니다

어제 Kotlin 이야기에서 우리는 많이 이야기했습니다 확장 기능에 대해 그래서 당신이 그것을 보지 못했다면 그것은 YouTube에 올라와 있습니다 어서보세요 오늘, 우리는 우리 자신의 확장의 일부를 정의 할 것입니다

이 코드 랩의 기능 오늘 확장 기능을 활성화하겠습니다 이 고전적인 패턴을 자바에서 보아서 프로그래밍 언어 기본적으로 isTuesday라는 메소드를 추가 할 것입니다 Date 클래스에 추가합니다 그래서 자바에서는 이것을 DateUtils라고 씁니다

우리는 정적 인 방법을 사용합니다 부울을 반환합니다 그것은 화요일이며 유일한 인수로서 날짜를 취합니다 그리고 이것은 멤버 함수처럼 보입니다 당신이 그것에 대해 생각한다면

자바에서 이것을 호출하면 DateUtilsisTuesday, date라고 말하십시오 어색한 구조에 불과합니다 하지만 모든 코드베이스에서 수행 한 작업입니다 그리고 그것은 정말로 잘 작동합니다

따라서 Kotlin은 확장 기능과 확장 기능을 제공합니다 속성을 사용하여 더 나은 구문 지원을 제공합니다 확장 기능은 확장 기능입니다 기존 클래스의 다른 멤버 추가 이미 존재하는 클래스로 마찬가지로, 확장 속성은 getter와 setter를 추가 할 수 있습니다 이미 존재하는 클래스로 여기에서는 정의 및 호출 구문을 볼 수 있습니다

확장 기능 그래서 우리는 함수를 정의하고 있습니다, isTuesday, that Date 클래스의 메서드입니다 그런 다음 인라인 할당을 사용하고 있습니다 to say 하루에 두 번이나 true로 돌아갑니다 형식 유추 때문에 우리는 함수의 반환 유형을 지정해야합니다

그리고 우리가 그것을 부를 때, 우리는 데이트를 말한다 그래서 그것은 클래스의 멤버 메소드처럼 보입니다 그러나 실제로 Date 클래스를 수정하지는 않습니다 따라서 이것이 확장 기능을 이해하는 데 핵심입니다 코 틀린

우리가이 모든 마술을하고있는 것처럼 보입니다 우리는 수업을 열고 방법을 추가하고 있습니다 그러나 우리는 그렇게하지 않습니다 따라서 Date 클래스는 다시 컴파일되지 않습니다 우리는 그것에 방법을 추가하지 않습니다

방금 isTuesday라는 정적 메서드를 정의했습니다 이는 date 매개 변수 인 단일 인수를 취합니다 Kotlin은 약간의 추가 구문을 제공합니다 이런 식으로 부르기 위해서 그래서 우리 코드는 Kotlin에서 이렇게 보입니다

그러나 실제로 우리는 수업을 열지 않았습니다 그리고 그것은 또한 전화가 어떻게 이것에 대한 의미론이 작용합니다 다음으로 얘기하고자하는 것은 람다 표현식입니다 그래서 저는 방금 람다 식을 가지고 있습니다 여기에 화면에

그리고 우리는 구문을 살펴볼 것입니다 읽고 쓰는 법, 쓰는 법 그래서 첫 번째 줄 -이 첫 번째 줄 실제로 자체적으로 모든 것을 컴파일하지는 않지만, 그러나 이야기하는 것이 유용합니다 그것은 람다 식입니다 우리는 외부에 중괄호가 있기 때문에 말할 수 있습니다

가운데에있는 화살 그리고 왼쪽에는 두 개의 인수 a와 b가 있습니다 그리고 오른쪽에는 표현 a plus b가 있습니다 그래서 이것은 두 개의 인수를 취하는 함수입니다 함께 추가합니다

우리가 컴파일하지 않았기 때문에 컴파일되지 않습니다 a와 b에 대한 유형을 제공했습니다 그래서 우리는 다음 라인으로 넘어갈 것입니다 우리는 a를 정수로, b를 정수로 정의했습니다 그래서 우리가 이것에 대해 생각한다면, 우리는 이제 더하기 b라고 말할 수 있습니다

우리는 그 람다의 리턴 타입을 지정할 필요가 없다 Kotlin에서는 정수와 정수가 항상 정수입니다 그런 다음 합계에 할당하고 우리가 유형을 제공 할 필요가없는 것을보십시오, sum은 리터럴 표현식에서 유형을 추론 할 수 있기 때문에 그것은 오른쪽에 있습니다 다음 줄, 세 번째 줄에는 합이 있습니다 여기서 sum 변수 자체에 대한 유형을 정의했습니다

그것은 두 개의 정수를 취하는 모든 함수를 말합니다 정수를 생성합니다 그 문법이 있습니다 괄호 안에는 매개 변수의 유형, 당신은 화살을 넣은 다음 오른쪽에, 함수의 반환 형식을 나열합니다 그런 다음 그것을 객체 리터럴 인 우리의 람다에 할당합니다

우리가 첫 번째 줄에 가지고 있었던 이제 컴파일되는 것을 볼 수 있습니다 타입 유추를 사용할 수 있기 때문에 그 유형을 통해 오른쪽에 매개 변수를 정수 및 정수로 정의했습니다 그리고 이제 a는 정수입니다 왜냐하면 우리는 그것이 있어야하는 맥락에서 그것을 사용했다

그리고 b는 정수입니다 왜냐하면 우리는 그것이 있어야하는 맥락에서 그것을 사용했다 그리고 다시, 우리는 여전히 돌아갈 필요가 없습니다 – 람다의 반환 유형을 말할 필요가 없습니다 그리고 마지막 줄에서 조금 더 보여줍니다 실용적인 람다의 값 notEmpty

따라서 텍스트 뷰를 사용하고 Boolean을 반환합니다 그리고 이것은 흥미로운 부분을 보여줍니다 Kotlin에서 람다 구문의 그래서이 경우에는 실제로는 아니에요 화살표 구문을 제공하거나 매개 변수의 이름을 지정합니다

하나의 매개 변수 λ에 대한 값을이 매개 변수라고합니다 그건 기본적으로입니다 항상 이름을 바꿀 수 있습니다 하지만이 경우에는 그냥 그대로 두겠습니다 그래서, 우리는 it

textisNotEmpty라고 말합니다 그래서 우리가 시작할 때 정말 빛나는 곳입니다 익명의 내부 클래스를 수행합니다 그래서 우리는 자바 프로그래밍 언어로 항상 이것을합니다

우리는 setOnClickListener를합니다 그리고 그 모든 것을 읽으면 매우 길어질 것입니다 그러나 결국에는 onClick 메서드를 재정의합니다 그리고 여기에 쓰고있는 유일한 실제 코드 performAction입니다 그 밖의 모든 것은 실제로 코드가 아닙니다

그것은 나를 위해 생성하는 IDE를 가져야 만하는 물건입니다 그래서 내가 쓰려고하는 코드를 작성할 수 있습니다 Kotlin에서는 람다를 사용하여 말하려고했다 이것이 우리가 할 수있는 일입니다 우리는 fab

setOnClickLIstener, 그리고 나서 우리는 문자 그대로 우리가 말하려고했던 코드를 작성합니다 우리는 그 여분의 것들을 모두 제거 할 수 있습니다 그리고 주변에 머물러 있습니다 형식 유추를 계속 사용합니다 훨씬 더 간결하며 Java 8과 매우 비슷합니다

람다 구문 람다가 정말 강력 해지는 곳 우리가 그들을 더 높은 순서대로 사용하기 시작할 때입니다 우리는 이미 이것의 예를 보았습니다 하지만 다른 함수를 사용하는 함수입니다 그것의 논증으로

그리고 이것은 여러분이 할 수있는 것입니다 Kotlin을 사용하여 코드를 매우 멋지게 만드십시오 읽기 쉽고 매우 표현적입니다 따라서 고차 함수의 고전적인 예 1970 년부터는 필터 방법이 있습니다 따라서 필터 메서드는 목록에 대해 작동합니다

그래서 당신은 목록을 가지고 있습니다 당신은 술어를줍니다 그리고 술어가 사실 일 때마다, 값을 포함하는 새 목록을 생성합니다 필터가 참인 곳 이제이 선언문을 읽으십시오

Kotlin 구문이 많이 표시되기 때문입니다 그래서 그것은 기능입니다 그것은 일반적인 유형 T를 가지고 있으며, 그것은 T의 목록에 대한 확장입니다 그리고 이것은 흥미로운 일입니다 왜냐하면 당신이 정의 할 수 있기 때문입니다

제네릭 형식의 확장 이것은 정말로, 정말로 할 수있는 일입니다 영리한 물건 T 물음표로 정의 할 수도 있습니다 내가 T에 확장을 정의하고 싶다

또는 T의 널값 그런 다음 filter라는 함수를 정의 할 것입니다 하나의 술어를 취합니다 그리고 나서 우리는 그것이 T 형의 1 개의 인수를 취하는 함수 부울을 반환합니다 그리고 마지막으로, 물론, 우리의 기능 T의 목록을 반환합니다

그리고 함수 안에서, 새 배열 목록을 만듭니다 그리고 항목에 대한 술어를 호출합니다 술어가 참일 때마다 새 목록에 추가합니다 그런 다음 새 목록을 반환합니다 그래서 우리가 앞서 가서 이것을 사용하려고 시도한다면, we''d는 listOf를 말한다

그것은 Kotlin의 길이다 정적 목록, 애플, 오렌지, 셀러리, 당근을 선언합니다 그리고 나서 우리는 바구니에 넣을거야 여과기 다시 말하지만, 코드를 단축하는 데 사용합니다

첫 번째 문자가 C이면 우리는 그냥 셀러리와 당근 목록을 생성하려고합니다 특히 그렇게 강하지는 않습니다 우리 모두가 루프를 쓸 수 있다고 생각해 앞으로 나아가서 우리 스스로 할 수 있습니다 그러나 우리는 훨씬 더 표현적인 것을 쓸 수 있습니다

우리가 이와 같은 보편적 인 코드를 시작할 때 이것은 데이터베이스 트랜잭션을 수행하는 방법의 예입니다 [? 방 ?] 거래를 시작해야합니다 실제 데이터베이스를 호출해야합니다

당신이하고 싶은 기능, 그리고 당신 끝내야 해 거래 그리고 당신이 그것을 더 잘하고 싶다면, 당신은 beginTransaction, call을해야합니다 당신이하고 싶은 함수, setTransactionSuccessful, 그런 다음 거래를 끝내십시오 다시 한번, onClickListener와 마찬가지로, 실제로 여기에는 실제 코드가 한 줄만 있습니다

그 밖의 모든 것들은 내가 방금하는 물건입니다 타이핑 및 / 또는 다른 수단을 통한 생성 자바 프로그래밍 언어가 작동하는 방식 때문에, 이것을 단순화하고 그것을 돌리기는 어렵다 추상화 하지만 Kotlin에서 우리는 실제로 꽤 잘 갈 수 있습니다

꽤 멀리 그래서 Kotlin에서 우리는 SQLite 데이터베이스 endTransaction을 할 수 있습니다 그래서 우리는 확장 함수를 할 것입니다 우리 데이터베이스에 그리고 우리는 그 모든 보일러 판을 정확히 놓을 것입니다

같은 방식으로 그래서 beginTransaction, setTransactionSuccessful, 및 endTransaction 하지만 우리는 그 모든 것을 쓰지 않고 우리가 작성하려고하는 모든 코드 라인을 중심으로, 우리는 코드 줄을 지나갈 것입니다 함수 인수에서 람다 (lambda)로 따라서 함수 – 인자를 취하지 않는 함수 값을 반환하지 않습니다

그래서 우리가 그것을 사용할 때, 이것처럼 보입니다, 그렇죠? 그래서 우리는 dbinTransaction을 말하고 우리는 람다를 전달합니다 그리고 나서 우리는 실제로 우리가 작성한 코드만을 씁니다 쓰기를 시도합니다 자, 이건 좀 이상해

우리가 우리의 람다 내부에서 데이터베이스에 액세스 그리고 lambda는 함수 리터럴입니다 그래서 그것에 대해 생각한다면 그것은 의미합니다 나는 끝내기 위해 폐쇄를해야 할 것입니다 해당 데이터베이스 변수

우리가 할 수있는 또 다른 방법은 함수에 데이터베이스를 전달할 수 있습니다 이 경우 함수를 SQLite로 정의합니다 SQLite 데이터베이스를 사용하고 아무 것도 반환하지 않는 함수 그래서 우리가 그렇게한다면 그것은 이렇게 보일 것입니다 db

inTransaction, itdelete 괜찮아요하지만 그건 나는 아직도 조금 이상하다고 생각한다 우리는 더 잘 할 수 있습니다 함수를 정의하는 바로이 구문 우리가 확장 람다라고 부르는 것입니다 확장 기능으로 작동하는 부동 함수입니다 기능

이렇게하면 확장 기능을 호출 할 수 있습니다 SQLite 데이터베이스 유형의 모든 객체에서 이 경우 암시적인 this를 사용합니다 우리의 확장 함수에서 thisfunc를 호출하십시오

그런 다음 다른 코드에서 dbinTransaction이라고 말할 수 있습니다 이제 데이터베이스에서 함수를 호출 할 수 있습니다 나는 그것을 사용하고 싶었다 도메인 별 언어의 시작 부분이 생성됩니다

Kotlin에서는 매우 강력합니다 코드에 대해 언급하고 싶은 것이 있습니다 그래도 우리는 여기에있다 이 코드를 컴파일하면 어떻게 될까요? 그런 다음 디 컴파일하십시오 우리는 이것으로 끝난다

그리고 조금 더러워 보이지만, 정말 중요한 것은 inTransaction을 호출 할 때입니다 새로운 함수 객체를 생성하고, 왜냐하면 매번 인수를 포착해야하기 때문입니다 Kotlin에서 함수를 작성할 때 당신은 람다 (lambda)를 취하는 고성능이 될 것이라고 생각합니다 인라인 키워드를 사용해야합니다 따라서 인라인 키워드를 사용할 수 있습니다

지정시 수행 할 작업 인라인은 실제로 소스 코드를 수행합니다 당신이 그 기능을 부를 때마다 이렇게하면 인라인과는 많이 다른 것입니다 C ++와 같은 다른 언어에서 익숙하다 Kotlin에서 인라인 함수를 호출하면 보장됩니다 – 그것은 힌트와 같지 않다 문자 적 요구 사항입니다

당신은 당신의 기능이 보장됩니다 인라인 함수의 본문 전화 사이트에서 제자리에 떨어 뜨리다 해당 인라인 함수를 호출 할 때마다 자, 이제 코드 랩을 끝내자 그래서 당신이 남긴 모든 조치 그리고 나는 모두에게 물어보고 싶었다

전에 3-5 분 정도 걸릴거야 이 파란색 탭의 피드백 양식을 여기에 작성하십시오 우리는 여러분이 코 틀린에 대해 어떻게 생각하는지 알고 싶습니다 우리가 앞으로 나아갈 것을보고 싶은 곳 그리고 Kotlin 사례 연구에 관심이 있다면, 가서 나하고 말해

나는 걸어 다닐거야 고맙습니다 [박수 갈채] [음악 재생]

Build the new, modular Android App Bundle (Google I/O ’18)

피에르 레 세네 : 안녕하세요 저는 Pierre이고 Google Play의 소프트웨어 엔지니어입니다

안토니 모리스 : 안녕하세요 저는 Google Play의 소프트웨어 엔지니어 인 Anthony입니다 IBRAHIM KARAHAN : 저는 Google의 파트너 개발자 옹호자 인 Ibo입니다 피에르 레 세네 : 음, 여러분 중 일부는 이전 세션에서 온 것일 수도 있습니다 Google Play에 대한 개요를 제공 한 원형 극장에서 동적 게재 및 새로운 게시 형식 안드로이드 앱 번들 (Android App Bundle)과 어떻게 이것은 애플 리케이션을 작게 만들 것입니다

이 세션에서는 기술 심층적 인 다이빙을 할 것입니다 이 새로운 출판 형식 우리는 그것이 무엇을 포함하는지, 그것을 어떻게 만드는지, 그것을 게시하는 방법뿐만 아니라 그것을 테스트 할 수있는 다른 방법을 제공합니다 Google Play의 생성 및 게재 방법에 대해서도 설명합니다 APK를 최종 사용자에게 제공합니다

이제 Android App 번들의 형식부터 시작해 보겠습니다 Android App Bundle은 zip 아카이브입니다 이미 익숙한 파일이 들어 있습니다 APK에서는 텍스트 파일, 리소스, 자산, 네이티브 라이브러리 앱 번들과 APK가 두 가지 목적을 지닌 두 가지 고유 한 형식입니다

앱 번들은 순전히 출판 형식입니다 그래서 그것은 장치에 직접 설치 될 수 없습니다 또한 일부 메타 데이터 파일 최종 APK에서 끝나지 않는 도구가 올바른 방식으로 APK를 구축하는 데 도움이됩니다 마지막으로 앱 번들의 형식이 APK보다 엄격합니다 우리는 도구가 완전히 묶음에있는 파일 이해하기 유효한 APK를 생성 할 수 있습니다

이제 하나의 앱 번들을 열고 내부 내용을 살펴 보겠습니다 그래서 그 묶음을 열면, 이것은 당신이 기대해야하는 것입니다 그래서 이것은 많은 사람들에게 익숙해 져야합니다 바퀴를 다시 발명하는 대신에, 우리는 APK의 일부 구조를 재사용하기로 결정했습니다 우리가 파일을 더 잘 설명하는 데 필요한 것을 수정해야합니다

그래서 우리는 그들을 자유롭게 통과 할 것입니다 시작하려면 앱 번들에 다중 모듈 지원, 전에 들었을 수도 있습니다 그리고 곧 모듈에 대해 더 자세히 알려 드리겠습니다 지금 당장은 최상위 디렉토리 앱 번들에는 모듈의 이름이 있습니다 모듈에는 항상 base라는 모듈이 있습니다

번들에 이것이 우리가 여기서 바라 보는 것입니다 Android 매니페스트가 계속 표시됩니다 새 프로젝트는 실제 XML 파일입니다 APK에서는 바이너리 형식을 볼 수 있습니다

앱 번들에서 프로토콜 버퍼로 컴파일됩니다 형식을 사용하면보다 쉽게 ​​변환 할 수 있습니다 APK와 달리 dex 파일은 dex라는 디렉토리 아래에 있습니다 Android 리소스, 애셋, 반면에 부정적인 도서관은, APK와 동일한 디렉토리 구조를 따르십시오 유일한 차이점은 XML 리소스입니다

이들은 또한 프로토콜 버퍼 포맷으로 컴파일되며, 바이너리 형식 대신 resourcespb 파일은 리소스 테이블입니다 이것은 파일 resourcesarac과 같습니다

APK에서 보았을 수도 있습니다 앱에있는 리소스를 설명합니다 및 타겟팅pb 확장자는 프로토콜 버퍼 형식입니다

다시 말하면, 이전에 도구를 변형하기가 더 쉬워졌습니다 APK에서 이진 형식으로 변환됩니다 assetspb 및 nativepb 파일 자산에 대한 자원 테이블과 동일합니다

및 네이티브 라이브러리 그래서 자산이나 네이티브 라이브러리가있는 경우에만 존재합니다 또한 파일의 대상 지정을 설명합니다 각각의 디렉토리에 있습니다 앞에서 언급 한 것처럼 리소스 테이블, 자산 테이블 및 기본 라이브러리 테이블 앱 파일 타겟팅에 대해 설명합니다

그래서 나는 그것이 의미하는 바를 설명하겠습니다 파일 타겟팅은 설명입니다 주어진 파일을 대상으로하는 장치 또는 사용자 유형 Google Play 동적 게재의 핵심 개념입니다 파일 타겟팅을 이해 한 이후 은 주어진 사용자에게 필요한 파일 만 제공 할 수 있음을 의미합니다 그리고 이것이 우리가 앱을 더 작게 만들 수있게 해줍니다

앱 번들은 APK에 존재하는 타겟팅을 다시 사용합니다 당신은 이미 이것에 익숙합니다 그래서 나는 빨리 가서 빨리 달릴 것입니다 리소스의 경우, 예를 들어, 리소스의 디렉토리 이름에 HDPI HDPI 장치를 대상으로 지정하거나 프랑스 사용자를 대상으로 fr을 추가하십시오 네이티브 라이브러리의 경우 동일합니다

디렉토리에 아키텍처를 추가합니다 여기서도 새로운 것은 없습니다 앱 번들도 같은 방식으로 작동합니다 이제 우리는 당신 중 일부를 위해, 애셋은 앱의 큰 부분을 차지합니다 따라서 앱 번들은 자산 타겟팅을 지원합니다

언어 타겟팅부터 시작합니다 곧 텍스처 압축 형식을 추가 할 예정입니다 및 그래픽 API 버전 따라서 우리는 관련 자산 만 사용자에게 제공 할 수 있습니다 앱과 게임의 크기를 줄이십시오

이것이 대상 자산 디렉토리를 만드는 방법입니다 해시 기호를 사용하는 동안 타겟팅하는 저작물 디렉토리를 식별하려면 다음에 정의하는 키가옵니다 우리가 목표로 삼고있는 차원들 – 예를 들어, lang은 언어를, tcf는 텍스처 압축 포맷을, 등등 그런 다음 키와 관련된 값이옵니다 음, 몇 가지 예를 살펴 보겠습니다

애셋이 포함 된 디렉토리의 예는 다음과 같습니다 프랑스어 사용자 이것은 자산 디렉토리의 또 다른 예이며, 여기서 텍스쳐 압축 포맷에 기초하여 타겟 화되고, etc1 형식을 지원하는 장치를 타겟팅합니다 이제 앱 번들 형식에 대해 더 많이 알고 있으므로 나는 Anthony에게 그것을 넘겨 줄 것이다 사용자에게 소규모 앱을 제공하는 데이 방법을 사용하는 방법을 알려줍니다 ANTHONY MORRIS : 고마워, 피에르

안녕, 모두들 피에르가 너에게 설명하고 있었어 우리가 어떻게 형식을 바꾸는 지 Play 스토어에 게시합니다 그리고 지금 나는 너에게 설명 할거야 사용자에게 제공하는 서비스의 형식을 어떻게 변경하는지, 어떻게 우리가 이것을 제공하는 데에만 사용하는지 각 사용자에게 필요한 것

이제 분할 된 APK부터 시작하겠습니다 그래서 Android Lollipop에서 Android에 기능을 추가했습니다 플랫폼으로 분할 APK라고합니다 Split APK를 사용하면 여러 APK를 장치에 설치할 수 있습니다 마치 하나의 앱에 속한 것처럼 행동합니다

이 분할 APK를 설치할 수 있습니다 다른 장치에서 다른 조합으로, 한 번에 하나씩 설치하거나 한 장씩 설치할 수 있습니다 이제 분할 된 APK는 일반 APK와 동일한 형식을 갖습니다 여기에는 Java 코드 색인 파일, 원시 코드, 자원, 및 자산 디렉토리 일단 APK가 분리되면, 단일 APK에있는 것처럼 액세스 할 수 있습니다

또한, 각 애플리케이션 패키지 이름과 버전이 같다 다른 모든 것들과 코드 장치에 설치되어 있어야합니다 동일한 키로 서명해야합니다 자 이제 Android App을 어떻게 사용할 수 있는지 살펴 보겠습니다 우리가 장치에 제공하는 분할 APK를 묶어서 생성하십시오

먼저 앱 번들을 살펴 보겠습니다 모든 장치에 공통되는 모든 것을 찾아야합니다 기본 APK에 넣습니다 그래서 여기에는 Android 매니페스트 파일이 포함됩니다 예를 들어, dex 파일 등이 있습니다

그런 다음 다른 APK를 생성합니다 각 화면 밀도에 대해 각 분할에는 모든 내구재가 포함됩니다 Android 프레임 워크에 의해 선택되었을 것입니다 그 밀도를 가진 장치에서 다른 APK를 생성 할 수도 있습니다

네이티브 라이브러리를 포함하는 각 네이티브 아키텍처 용 그 아키텍처의 그리고 우리는 다른 분할을 생성 할 수 있습니다 앱에서 지원하는 각 언어에 대해 각 언어의 문자열을 다른 APK에 저장합니다 자, 함께, 우리는 이러한 분할 구성을 호출합니다 분할 또는 구성 분할

이제 기기에 앱을 제공하려고 할 때, 우리는이 분할의 서브 세트를 제공하기 만하면됩니다 모든 기기에 모든 것을 제공하는 대신 그래서 삼성 갤럭시 J5가 있다고 해봅시다 기본 APK와 xhdpi 밀도를 설치합니다 split, ARM 아키텍처 분할 및 영어 왜냐하면 나는 영어 만 할 뿐이니까 하지만 그보다 조금 더 까다 롭습니다

Pierre는 프랑스어와 영어를 모두 구사하며, 그는 자신의 장치에서 두 가지 언어를 모두 지정합니다 설정 그래서 그의 장치에서 Pixel 2 XL과 올바른 밀도와 아키텍처 우리는 영어와 불어를 모두 제공합니다 자기 장치로 나눠 피에르가 브라질로 이주하여 포르투갈 인

그런 다음 포르투갈어를 장치에 추가 할 수 있습니다 이제 그가이 작업을 수행 할 때 Play 스토어 이를 인식하고 포르투갈어를 다운로드하려고 시도합니다 기기에서 스플릿을 사용하는 모든 앱에 대한 언어 분할 그리고 그 당시 장치가 온라인 상태가 아닌 경우, 그러면 우리는 그 언어를 다운로드 할 것입니다 다음 기회에 나눕니다

그리하여 이것이 config split이 작동하는 방법입니다 그러나 내가 처음에 언급했듯이, Lollipop 이상에서만 지원됩니다 이는 현재 사용자의 약 85 %를 차지하지만 대부분의 사용자는 여전히 L 장치를 대상으로합니다 이러한 기기의 경우 앱 번들 여전히 크기 절약을 달성 할 수 있습니다 특정 밀도를 포함하는 독립 실행 형 APK 생성 및 아키텍처

그래서 우리가 L 플러스에서 할 것처럼 분할을 생성하는 대신, 우리는 독립형 APK 매트릭스를 생성 할 것입니다 우리는 이것을 언어로 확장하는 것을 간략히 고려했다 쪼개지도 그러나 우리는 합계의 약간을했다 손에 조금 닿았습니다

하지만 지금은 Pre L 기기의 경우 각 독립 실행 형 APK에 모든 언어를 포함합니다 이제 앱을 제공하려고 할 때 장치에 가장 적합한 단일 APK를 선택하십시오 Galaxy Nexus라는 첫 번째 Android 기기가 있다면 우리는 hdpi 팔 독립형 APK를 제공 할 것입니다 이것을 인식 할 수 있습니다 당신이 한 일과 비슷하다

과거에는 멀티 APK로 하지만이 모든 것을 하나로합시다 이 그림은 이렇게 보입니다 실제로는 방법에 대한 세부 사항을 실제로 걱정하지 않아도됩니다 이 모든 분할 APK가 생성됩니다 또는 독립 실행 형 APK가 생성됩니다

하나의 앱 번들 만 업로드하면됩니다 Play는 오른쪽 분할을 생성하고 각 장치에 적합한 역할을합니다 그리고 우리가 지금까지 토론 한 차원들 시작일뿐입니다 Pierre는 앱 번들을 사용하여 애셋을 타겟팅하는 방법에 대해 설명했습니다 그래픽 API를 사용하면 곧 설정 분할을 생성합니다 그걸 바탕으로 우리는 또한 설정 생성을 시작합니다

새로운 플랫폼 기능을 활용하기 위해 분할합니다 그리고 우리는 압축되지 않은 네이티브 라이브러리 m-class 장치에서 이제 이보에게 가져 가라고 부탁합니다 이 앱을 사용하여 앱 크기를 얼마나 줄일 수 있는지 살펴 봅니다 묶음

이브라힘 카라간 : 고마워요, 안소니 이제 Play에서 APK를 기기로 분할하는 방법을 알았습니다 우리는 앱 번들로 크기 절약에 대해 이야기 할 것입니다 평균적으로 앱 번들로 게시 된 앱 20 % 더 작아지고 매회 20 % 절약됩니다 응용 프로그램이 다운로드되거나 업그레이드됩니다

이제 우리가이 숫자에 어떻게 도달했는지 살펴 보겠습니다 Play 스토어의 모든 애플리케이션을 분석했습니다 다운로드 횟수는 1 백만 회를 넘습니다 그리고 우리는 문자열에 대해 언어 분리를 사용하여 크기의 95 % 이상을 절약 할 수 있습니다 이미지의 경우 45 %입니다

또한 네이티브 라이브러리의 경우 크기의 20 %를 절약 할 수 있습니다 즉, 모든 앱이 앱 번들로 이동하는 경우, 우리는 하루에 약 10 페타 바이트의 데이터를 저장합니다 앱 다운로드 및 업데이트에서 가져옵니다 그것은 1000 만 기가 바이트, 또는 3 억 뮤직 비디오입니다 YouTube에서

그리고 그 위에 사용자는 추가 300 메가 바이트를 볼 수있었습니다 더 많은 사진, 더 많은 앱 또는 더 많은 음악을위한 디스크 공간 확보 자신의 장치에 이제 실제 크기 절약을 살펴 보겠습니다 이는 초기 액세스 프로그램 및 파트너 중 일부입니다 그래서 우리는 Twitter로 시작할 것입니다

Twitter – 이미 다중 APK로 게시 중입니다 전에 아키텍처가 분할되었습니다 그러나, 그들의 응용 프로그램은 번역되었습니다 많은 언어로, 그리고 그것은 여러 화면을 지원합니다 밀도 그들은 여전히 ​​출판비로 많은 비용을 절감합니다

앱 번들과 함께 크기가 20 % 증가합니다 또한 더 이상 다중 APK를 제공 할 필요가 없습니다 다음은 이전에 멀티 APK를 사용하지 않는 TextPlus입니다 앱 번들을 사용하면 앱 번들을 사용하여 모든 크기에서 26 %의 크기 절감 Jaumo의 앱은 원래 크기의 절반이며, 이것은 그들이 [무관심] 한 대형 도서관을 가지고 있기 때문입니다 또한 단일 APK에서 여러 아키텍처를 지원했습니다

이제 앱 번들을 만드는 방법을 살펴 보겠습니다 지금 저장을 시작할 수 있습니다 최신 안드로이드 스튜디오 32 카나리아 Android 앱 번들을 완벽하게 지원합니다 이제 우리는 빌드 할 새로운 옵션을 보게 될 것입니다

빌드 메뉴의 번들 [부적절한] 모든 앱 번들 할당은 쉽습니다 우리는 앱 모듈, 제품 맛을 선택하기 만합니다 빌드 유형 및 Android Studio 당신을위한 앱 번들을 만들고, 서명하고, 게시 할 준비가되었습니다 커맨드 라인을 선호하는 사람들을 위해 또는 자동화 된 빌드 시스템과 통합하려는 경우, 새로운 Gradle Android 플러그인은 새로운 작업 세트를 제공합니다

Android 앱 번들을 만들 수 있습니다 기억하십시오, 이것은 당신이 사용하는 것입니다 – 조립 작업 명령 줄에서 APK를 만듭니다 이제 앱 번들의 경우 번들 명령으로 전환하십시오 어셈블 링 태스크와 마찬가지로, 번들 태스크 또한 특정 향미료를 만들 수 있습니다 귀하의 응용 프로그램의

일단 번들 작업이 끝나면 출력 폴더에 앱 번들을 만들려고하는데, 맛과 빌드 유형이 선택되었습니다 빌드 된 아키텍트는 bundleiad입니다 번들 작업은 서명 구성과 호환됩니다 귀하의 build

gradle 파일 그리고 하나의 gradle 작업으로, 당신은 서명 된 앱 번들을 생성 할 수 있습니다 출판 준비 또한 앱 번들을 사용하면 Play가 자동으로 애플리케이션을 아키텍처, 화면 밀도, 및 언어 스플릿을 기본적으로 사용합니다 당신 구성을 할 필요가 없습니다

그러나 우리는 또한 개발자 스플릿을 완전히 제어 할 수 있습니다 어떤 이유로 든 분할을 사용하지 않으려는 경우 모든 차원에서 새로 도입 된 기능을 사용하여 번들 블록은 여기에 이제 Pierre는 앱을 게시하는 방법에 대해 이야기 할 것입니다 번들을 재생 콘솔에 추가합니다 PIERRE LECESNE : 감사합니다

좋아요, 그래서 당신은 앱 번들을 만들었습니다 이제 어떻게 게시 할 수 있는지 살펴 보겠습니다 Google Play Console에 있습니다 먼저 Google Play에서 앱 서명에 등록해야합니다 기억하는 사람들을 위해이 프로그램을 시작했습니다

작년에 Google I / O에서 등록 할 때 공개 키를 안전하게 전송합니다 Google Play에 그런 다음이 릴리스 키를 사용하여 Play에 서명합니다 사용자를 대신하여 생성 된 APK 사용자에게 보내기 전에 그러나 APK를 계속 업로드하는 경우 제작 탭 트랙에서 테스트 트랙에서 앱 번들을 테스트하고, Play는 업로드 된 APK를 사임하지 않습니다 그리고 우리는 당신이 자신감을 가질 수 있도록 이것을했습니다 먼저 작은 청중에게 앱 번들을 시험해보고, 현재 프로덕션 사용자에게 영향을주지 않습니다

등록한 후에는 릴리스를 관리하고, APK에서했던 것처럼 새 릴리스 만들기 – 앱 번들을 현재 같은 위치에 드롭합니다 APK를 삭제하고 업로드를 기다립니다 업로드되면 출시를 검토하고 출시를 해제 할 수 있습니다 그게 전부 야 그리고 나는 충분히 강조 할 수 없다

더 이상 멀티 APK를 처리 할 필요가 없습니다 Play Console이 백그라운드에서 생성했습니다 지원되는 모든 APK를 제공합니다 이제 앱 번들을 업로드했습니다 그리고 플레이는 너를 위해 모든 힘든 일을 해냈다

큰 그러나 개요를 가질 수 있으면 좋지 않을까요? Play에서 무엇을 생성 했습니까? 이제 Play Console에서 새로운 도구를 만들었습니다 번들 탐색기라고합니다 번들 탐색기를 사용하면 업로드 된 번들을 탐색 할 수 있습니다 보세요

첫 번째 화면에서 오른쪽 상단 모서리에 번들 게시로 얻을 수있는 크기 절감 효과 이제 앱의 1/4 이상을 저장했습니다 물론 이것은 장치마다 다릅니다 그래서 우리는 널리 사용되는 장치 구성을 사용하여 이것을 계산했습니다 또한 장치 구성 목록 아래에 있습니다

및 해당 장치에 대한 APK 서비스의 전체 크기입니다 몇 가지 기기를 클릭하고 어느 기기를 볼 수 있습니까? 기기는 각 버켓에 있습니다 지원되는 모든 장치를 이름으로 검색 할 수도 있습니다 생성 된 APK 집합을 다운로드하려면 특정 장치에 게재되었습니다 이것은 매우 도움이 될 것입니다

그 특정 장치에 대한 버그 보고서를 얻고, 그리고 사용자가 얻은 것을 정확히 얻고 싶습니다 APK가 제공되는 서비스 따라서 이름을 검색하고 다운로드를 클릭 한 다음, Play에서 제공 한 APK 세트를 받게됩니다 물론, 우리는 여러분 모두를 잊지 않았습니다 누가 우리의 출판 API를 사용하는지 앱 번들 업로드는 오늘 API를 사용하여 가능합니다

모든 문서를 찾을 수 있습니다 developersgooglecom/android 게시자 그리고 이제 앤서니에게 넘기십시오 ANTHONY MORRIS : 고마워, 피에르

이제 우리는 빌드하고 게시하는 방법을 배웠습니다 Android 앱 번들 그러나 우리가 배포판을 완성하기 전에, 우리는 여전히 테스트의 라운드를하고 싶습니다 그러나 앱 번들 자체는 설치할 수 없습니다 그럼 어떻게 테스트합니까? 첫째, 개발 과정에서 앱에서 빌드 된 APK를 설치할 수 있습니다

Android Studio에서 직접 다운로드 할 수 있습니다 따라서 여기서 아무 것도 할 필요가 없습니다 그러나 품질 관리 팀의 경우 항상 그렇지는 않습니다 Android Studio에서 소스 코드에 액세스 할 수 있습니다 따라서 세 개발자의 이야기를 통해 이야기하겠습니다

앨리스, 밥, 클레어 QA로 앱 번들을 테스트하는 방법 항목 앨리스부터 시작합시다 Alice는 새로 출시 된 내부 테스트를 사용합니다 재생 콘솔에서 내부 트랙은 알파 베타 트랙과 유사하지만, 이미 익숙 할 수도 있습니다 그러나 지연이 거의 없다는 점이 다릅니다

번들 업로드와 업데이트 사이 테스터 장치에서 사용할 수 있습니다 품질 보증 테스트를위한 신속한 처리 Play Console (앨리스)을 거치며 품질 보증팀이 받게 될 신뢰감이 있습니다 자신의 장치에서 byte와 byte는 무엇과 같은가? 최종 사용자는 릴리스를 프로덕션으로 푸시하면 얻을 수 있습니다 앨리스가 어떻게 이것을 설정하는지 보도록하겠습니다

정말 간단합니다 그래서 Alice는 최대 100 명의 QA 테스터의 이메일리스트를 생성합니다 내부 테스트 트랙에 적합합니다 그녀의 QA 테스터가 업데이트 링크를 따릅니다 업로드 된 번들을 받게됩니다

내부 테스트 트랙으로 그게 전부 야 그러나 모든 사용자가 Play Console에 액세스 할 수있는 것은 아닙니다 귀하의 품질 보증주기 동안 피에르가 밥의 이야기를 들어 봅시다 피에르 레 세네 : 사실, 밥은 접근 할 수 없습니다

Play Console에 연결합니다 그는 자신의 컴퓨터에서 로컬로 테스트하는 것을 선호합니다 아무것도 업로드하기 전에,하지만 그는 여전히 사용자가 얻을 수있는 것을 테스트하려고합니다 어떻게 그 일을합니까? 음, 번들에서 APK를 생성하려면, Play는 Bundletool이라는 새로운 도구를 사용합니다 따라서 Bob이 로컬에서 빌드를 재생하려면, 그는 단순히 Bundletool을 다운로드하고 몇 가지 간단한 명령

Bundletool에는 Build APKs라는 명령이 있습니다 Android 앱 번들을 사용하여 우리가 APK 세트 아카이브라고 부르는 것 APK 세트에는 APK 모음이 들어 있습니다 장치에 설치할 준비가되었습니다 APK 설치라는 또 다른 명령 해당 APK 세트 아카이브를 가져 와서 APK를 추출하고, 해당 장치에 설치하십시오

실제 커맨드 라인 작업을 보도록하겠습니다 그래서 여기에 명령 [? 최근?] Bob에 의해 build-apks 호출, 앱 번들 전달, APK가 만들어지기를 원하는 위치를 말합니다 그리고 깃발 연결 장치를 통과시킴으로써, Bundletool은 현재 기기 전용 APK를 구축합니다 자신의 컴퓨터에 연결되어 있습니다 그리고 Bob이 APK를 생성하려고한다면, 말하자면 팀원이 아닌 다른 사람 손에 물리적 장치, 그것은 여전히 ​​수 있습니다

사양이 포함 된 파일을 제공하십시오 장치를 JSON 형식으로 그리고 당신은 여기서 그 파일의 압축을 볼 수 있습니다 이 장치가 지원하는 API에 대한 정보를 제공하며, 지원되는 언어, 화면 밀도 및 APK 버전 Bundletool도 이러한 장치 사양 파일을 생성합니다 따라서 온라인에서 장치 사양을 찾을 필요는 없습니다

또는 직접 작성하지 않아도됩니다 이 명령을 실행하면됩니다 이 파일을 생성하십시오 또한 Bob은이 APK를 설치하려고하기 때문에 장치에서 APK는 개인 키로 서명해야합니다 그래서 그는 경로를 키 스토어에 전달합니다

APK 세트에 포함 된 모든 APK 그러면 서명되어 Bob의 장치에 직접 설치할 수 있습니다 다음은 APK 설치 명령의 호출입니다 APK 세트에서 APK를 추출합니다 연결된 장치에 직접 설치합니다 쉬운

그래서 Bob과 그의 지역 테스트였습니다 이제 Ibo가 클레어의 이야기를 들려 줄 것입니다 이브라힘 카라한 : 클레어가 일하고있다 중간 규모 회사의 경우 그들의 응용 프로그램을 채우기 위해 지속적인 통합 도구를 설정하십시오 매일 QA 팀은 야간에 응용 프로그램 빌드, 여러 장치에 설치, 응용 프로그램이 올바르게 작동하는지 테스트합니다

클레어는 QA 팀을 돕고 싶어합니다 그녀는 Bundletool을 다시 사용합니다 CI에 APK 세트를 생성합니다 그녀는 다음과 같은 명령을 사용합니다 Bob은 이전에 사용했습니다

그러나 이번에는 장치 사양 플래그를 생략하고, APK 세트를 생성합니다 APK 세트에는 가능한 모든 기기의 APK입니다 이제 QA 팀이 CI에서 설정 한 APK 만 가져옵니다 그들은 장치를 연결하려고합니다 install-apks 명령을 실행하십시오

Bundletool이 장치 구성을 읽습니다 첨부 된 기기에서 APK 세트의이 구성과 일치하는 APK, 장치에 설치하십시오 Play와 동일한 선택입니다 특정 기기에 대해 APK를 게재 할 때 발생합니다 Bundletool이 할 수있는 한 가지 더 범용 플래그를 전달하여 범용 APK를 생성하는 것입니다

범용 APK는 파일을 포함하는 단일 APK입니다 모든 장치의 모든 파일 따라서 모든 장치에 설치할 수 있습니다 글쎄, 그건 정말 대변하지 않아 사용자가 언제 받게 될지 Play 스토어에서 애플리케이션을 설치합니다 그러나 이는 APK를 사용자에게 전달하는 편리한 방법입니다

사용자가 어떤 장치를 실행 중인지 모를 때 Bundletool은 Android App Bundle을 만드는 데 사용되는 도구이기도합니다 Gradle은 장면 뒤에서 그것을 사용합니다 우리는 다른 사람들과 함께 일할 것입니다 체인, 툴체인 제작, 빌드 툴 통합 Android 앱 번들을 만들 수 있습니다 귀하가 사용하고있는 툴체인의 그리고 마지막으로, 우리는 어떻게 Google이 제공 한 APK를 생성합니다

귀하의 사용자에게 Bundletool을 오픈 소싱하는 이유는 무엇입니까? 오늘 가서 githubcom/google/bundletool을 이용하십시오 실행 파일 또는 [? 빌드?]에서 그것 출처 이제 Pierre는 다른 방법에 대해 이야기 할 것입니다 응용 프로그램을 더 작게 만들 수 있습니다

PIERRE LECESNE : 감사합니다 Google Play 동적 전송을 사용하면 우리는 헤어지는 새로운 방법을 도입하고 있습니다 앱을 별도의 기능으로 통합하여 각 사용자마다 필요합니다 레시피 앱이 있다고 가정하고 초기 다운로드를 작게 유지하려고합니다 모든 사용자가 좋아하는 동안 레시피 검색, 작은 분량 만 선택 실제로 새로운 레시피를 추가 할 수 있습니다

그리고이 기능이 앱의 중요한 공간 당신이 할 수있는 일은 그 기능을 자체 모듈로 분해하는 것입니다 필요한 때에 만 봉사하십시오 여기서 사용자를 찾는 방법을 볼 수 있습니다 앱을 엽니 다

그래서 사용자가 레서피를 추가하기를 원할 때, 그는 바닥에 작은 플러스를 클릭한다 그리고 백그라운드에서 볼 수 있습니다 모듈이 다운로드되어 설치됩니다 몇 초 후에 모듈을 사용할 수 있습니다 앱의 어느 부분에서 별도의 기능으로 탈출 하시겠습니까? 사용자 중 일부만이 기능을 사용하는 경우, 좋은 후보가 될 수 있습니다

특히 해당 기능이 앱에서 상당한 공간을 차지하는 경우 마지막으로, 사용자가 몇 초 동안 기다릴 수 있는지 고려하십시오 기능을 사용하기 전에 생성 할 기능을 결정한 후에는 이것이 앱 번들에서와 같이 보일 것입니다 기본 디렉토리 이외에도, 이제 별도의 디렉토리가 있습니다 앱의 각 모듈에 대해 이 디렉토리의 형식은 정확하게 앞에서 다룬 기본 형식과 동일합니다 Play에서 재생할 APK입니다

각 모듈에 대해 분할 세트를 생성합니다 기능 분리 및 구성으로 구성 해당 모듈을 분할합니다 Anthony는 앞에서 언급했듯이 APKS가 분리되어 소개되었습니다 Android Lollipop을 사용하여 3L 기기를 지원하고, 거절 할 모듈을 표시 할 수 있습니다 Bundletool은 지정된 APK를 생성합니다

모듈이 함께 병합되었습니다 이제 동적 기능의 작동 방식에 대해 살펴 보았습니다 내가 너를 이보에게 넘겨 주자 너는 너를 보여 줄 것이다 그것들을 만드는 법

IBRAHIM KARAHAN : 고마워, 피에르 동적 모듈을 만들려면 필요한 작업 만 수행하면됩니다 안드로이드 스튜디오 32 카나리아 다운로드 동적 기능 마법사를 사용하십시오 파일 메뉴의 새 모듈을 클릭하고, 동적 모듈을 선택하십시오

모듈 이름을 입력하면 Android Studio가 실행됩니다 새로운 동적 모듈을 만들 것입니다 수동으로 동일한 작업을 수행 할 수도 있습니다 manifest 및 buildgradle 파일을 편집하십시오

새 모듈의 매니페스트부터 시작할 것입니다 첫 번째 단계는이 모듈을 선언하는 것입니다 앱의 새로운 APK로 설정합니다 이렇게하려면 split 속성을 추가합니다 매니페스트 태그에 이름을 지정합니다

이 예제에서는 vrviewer입니다 다음 단계는 모듈 태그를 추가하는 것입니다 모듈을 선언하려고하면 모듈에 제목을 붙이십시오 이 태그는 Play 스토어에서 모듈을 식별하는 데 사용됩니다 귀하의 응용 프로그램의

그런 다음이 모듈을 주문형 모듈로 선언합니다 onDemand 특성을 추가합니다 즉,이 모듈은 사용자의 기기로 전달됩니다 앱이 Play 스토어에 앱을 요청하면 설치시 전달하는 대신 물론, 주문형 모듈은 L plus 장치에서 지원됩니다 따라서 3L 장치에서이 모듈을 제공하기로 결정한 경우, 융합 태그를 추가 할 것입니다

포함하도록 Play 스토어에 지시 이 모듈은 설치시 기본 모듈 옆에 있으며, 3L 기기 또는 범용 APK로 전송할 때 이제 buildgradle 파일을 살펴보십시오 동적 모듈부터 시작하겠습니다 첫 번째로 지금은 새로운 플러그인을 사용하고 있습니다 com

androiddynamic-feature 두 번째로 기본 모듈을 추가합니다 이 모듈에 대한 종속성으로 기본 모듈에 포함 된 기능에 액세스 할 수 있습니다 베이스의 build

gradle 파일에 필요한 유일한 변경 사항 모듈은 동적 피처 목록을 추가하는 것입니다 모든 동적 모듈 이름을이 목록에 넣으십시오 이것은 gradle이 리소스를 저장하도록 지시하는 것입니다 동적 모듈에서 사용할 수있는 기본 모듈 이제 Anthony는 어떻게 이러한 모듈을 사용할 수 있는지 보여줄 것입니다 새로운 Play Core 라이브러리로 ANTHONY MORRIS : 고마워, 아이보

그럼 어떻게 가는지 살펴 보겠습니다 온 디맨드 모듈의 설치 요청시기 당신은 그들이 설치되기를 원한다 따라서 Play 스토어와 상호 작용하려면 분할 설치 API를 도입했습니다 Play Core Library라는 새로운 라이브러리의 일부로 이제 Play Core 라이브러리는 Java 클라이언트 라이브러리입니다 장치에서 IPC를 사용하기 위해 Play와 통신합니다

그런 다음 Play 스토어에서 통신합니다 이 주문형 모듈을 Play의 서버에서 다운로드하여 당신은 그들을 요청합니다 약간의 코드를 살펴 보겠습니다 API는 동일한 작업 프레임 워크를 사용하여 구성됩니다 Google Play에서 익숙 할 것입니다

서비스 API 및 FireBase API 분할의 설치는 호출 된 클래스에 의해 조정됩니다 splitInstallManager 모든 모델로 요청을 구성합니다 다운로드하고 싶은 파일 재생을 시작하기 위해 startInstall을 호출합니다

요청한 모듈에 필요한 분할을 다운로드하십시오 API를 사용하면 수신 할 수도 있습니다 다운로드 및 설치 프로세스 전반에 걸쳐 업데이트합니다 진행 상황을 표시하고 다운로드 할 때 사용할 수 있습니다 설치 진행 상황을 사용자에게 알려주고, 온 디맨드 기능을 다운로드하기를 기다리고 있습니다

피에르 비디오에서 이걸 봤어 모듈의 주소를 다운로드 할 때 나타났습니다 대규모 모듈의 경우 사용자 확인을 받아야합니다 분할 설치 API로 다운로드하기 전에 앱이 요청할 때마다이 작업을 수행해야합니다 10 메가 바이트 이상의 온 디맨드 모듈 다운로드받을 수 있습니다

그러나 대체 옵션이 있습니다 이러한 모듈을 설치하는 데 필요하지 않은 경우 즉각적인 사용을 위해 즉각적으로 사용할 수 있으며 이것을 지연이라고합니다 설치 API 이 간단한 한 줄을 사용하여 지연된 설치를 요청하는 경우 모듈의 사용자가 편리한 시간에 다운로드 할 수 있습니다 일반적으로 사용자가 장치를 사용하고 Wi-Fi에서 충전하는 방법에 대해 설명합니다

이 때문에 우리는 더 큰 모듈을 설치할 수 있습니다 API에 의해, 사용자 확인을 요구하지 않고, 최대 100 메가 바이트 따라서 이것은 매우 사용자 친화적 인 방법입니다 앱의 대형 주문형 모듈을 다운로드 할 수 있습니다 분할 설치 API를 사용하여 귀하의 주문형 모듈

따라서 현재 어떤 모듈이 설치되어 있는지 확인할 수 있습니다 그리고 사용자가 더 이상 해당 모듈을 필요로하지 않는 경우, 모듈 제거를 요청할 수 있습니다 사용자에게 귀중한 디스크 공간 확보 기기에서 앱의 공간을 줄일 수 있습니다 이제 주문형 모듈을 설치하고 설치할 때 N Plus 기기에서는 앱을 다시 시작할 필요가 없습니다 따라서 코드는 즉시 사용할 수 있습니다

설치 완료 후 새로운 자원 및 자산 컨텍스트 개체를 새로 고치면 사용할 수 있습니다 그러나 Android L / M에서는 스플릿을 설치합니다 앱을 다시 시작해야합니다 올바르게 설치하려고합니다 하지만이를 피하기 위해 분할 컴팩트 라이브러리, 에뮬레이트하는 L / M에 스플릿 설치 앱이 백그라운드에 들어갈 때까지 우리는 올바르게 설치할 수 있습니다

그래서이 분할 컴팩트 라이브러리 앱을 다시 시작하지 않아도된다는 의미입니다 이 모듈 안에있는 거의 모든 것들 앱에서 즉시 사용할 수 있습니다 이 분할 컴팩트 라이브러리를 설정할 수 있습니다 어떻게하면 될지와 매우 유사한 방식으로 앱에서 Multidex 라이브러리를 설정하는 것에 익숙해야합니다 마지막으로 앱 업데이트를 릴리스하면 Play는 기본 모듈과 이미 설치된 모든 주문형 모듈을 포함합니다

따라서 장치에있는 모듈의 버전 항상 동기화됩니다 항상 같은 버전입니다 파트너는 이것이 실제로는 이 모델에 대해서 좋아, 그럼이 모든 걸 감싸 줘 오늘부터 모든 개발자가 Android App Bundles를 만들 수 있습니다

안드로이드 스튜디오 32 카나리아 그리고 모든 사용자에게 Play에서이를 게시 할 수 있습니다 그래서 나는 여러분 모두가 이것을 시도하고 보도록 권합니다 전환하여 앱이 얼마나 작아 질 수 있는지 안드로이드 애플 리케이션 번들로

이제 모듈화를 시작할 예정입니다 개발자들에게 앞으로 몇 개월 동안 오늘부터 모듈화 된 앱을 만들 수 있습니다 Studio Canary에 게시하고 게시 할 수 있습니다 Play 콘솔의 내부 트랙과 알파 트랙으로 이동합니다 하지만 우리는 출판과 제작을 시작할 것입니다

앞으로 몇 개월 동안 베타 버전으로 추적합니다 관심이 있으시면 관심사를 등록 할 수 있습니다 제공되는 링크에서 모듈화합니다 그리고 그걸로와 주셔서 감사합니다 질문이 있으시면 나중에 잡으실 수 있습니다

나는 우리가 지금 시간이 있다고 생각하지 않는다 또는 Sandbox에서 며칠 동안 우리를 붙잡을 수 있습니다 C, 무대 뒤 그리고 고마워 훌륭한 입출력을 가져라

[음악 재생]

Best Video Editing App for Android (2018!)

– 지금 우리가 볼거야 현재 사용 가능한 최고의 안드로이드 비디오 편집기 응용 프로그램

그리고 최고의 비디오 편집 응용 프로그램에 대한 내 선택 2018 년에 안드로이드에 대한 모든 테스트를 거친 후 저기, Primal Video의 저스틴 브라운입니다 우리가 당신을 증폭 시키는데 도움이되는 곳 비디오와 함께 귀하의 비즈니스와 브랜드 네가 여기 새로운 사람이라면, 구독 버튼을 클릭했는지 확인하십시오 이 비디오에서 언급 한 모든 것에 대한 모든 링크와 아래의 설명 상자에서 해당 링크를 찾을 수 있습니다 그래서 그것에 뛰어 들어 봅시다

이제 나는 매번이 말을한다 하지만 이것은 3 년 연속으로 뛰는 것과 같습니다 우리가 만든 비디오 비디오 편집 앱의 풍경에 앱은 점점 더 강력 해지고 있습니다 오늘 우리가 다루는 옵션 많은 데스크톱 소프트웨어와 경쟁하기 시작했습니다 당신은 그 모든 힘에 접근 할 수 있습니다

손바닥에 원하는 곳 어디에서나 사용할 수 있습니다 우리의 전체 조사 과정을 거친 후 어떤 새로운 앱이 등장했는지 확인하려면, 지난 번에 앱으로 변경된 사항 모든 경쟁자를 테스트해라 그들이 정말 어떻게 비교하는지 확인하십시오 이 비디오에서 우리는 최선의 선택을 할 것입니다 Android에서 동영상을 수정하는 앱의 인기 앱 그리고 그것은 나의 최고의 제안이다

그래서 우리는 후보 목록을보고 시작할 것입니다 그걸 멀리 만든 모든 앱 중에서 그리고 당신이 알아야 할 모든 중요한 것들 각 옵션에 대해 그리고 우리가 달리면서, 아래에 주석을 삭제하십시오 Android에서 가장 좋아하는 동영상 수정 앱은 무엇이며 그 이유는 무엇입니까? Android 앱 스토어에서 실제로 본 적이 있다면 비디오 편집 응용 프로그램의 경우, 선택할 수있는 방법이 너무 많습니다 그래서 우리의 최고 경쟁자 또는 우리의 명단 우리는이 모든 앱을 축소했습니다 Cute CUT, Adobe Premiere Clip, Quik, WeVideo, KineMaster, PowerDirector 및 FilmoraGo

그리고 이러한 각 앱을 사용하면 동영상을 수정할 수 있지만, 이러한 앱을 사용하면 훌륭한 결과를 얻을 수 있습니다 실제로 제어 수준과 기능 수준 앱에서 얻을 수있는 것들 꽤 많이 바뀐다 그것이 정말로 내려 오는 곳은, 얼마나 많은 컨트롤을 실제로 편집하고 싶습니까? 어떤 종류의 비디오를 편집하고 있습니까? 얼마나 많은 실제 편집을해야합니까 네가 쏜 장면에? 그리고 그게 전부가 될거야 당신을위한 최고의 비디오 편집 소프트웨어입니다 따라서 편집 애플리케이션의 대다수는 우리의 후보 목록에있는 대부분의 편집 응용 프로그램 매우 기본입니다

기본 절단 작업을 수행하고 색상을 추가하고 텍스트를 추가 할 수 있습니다 하지만 꽤 많이 있습니다 확실히 몇 가지 뛰어난 점이 있습니다 정말로 경계를 밀고있는 몇 명 Android 기기에서 수행 할 수있는 작업에 대해 설명합니다 그래서, 당신은 거기에 애플 리케이션을 가지고있어

Adobe Premiere Clip 및 WeVideo와 같은 기기에서 동영상을 편집하는 데 환상적입니다 그러나 그들은 매우 기초적입니다 하지만 그 앱의 가장 큰 장점은, WeVideo에서 편집하는 경우 바탕 화면에서 플랫폼으로 또는 Adobe Premiere Pro, 다음 프로젝트를 실제로 전송할 수 있습니다 그래서 당신은 WeVideo에서 비디오를 시작할 수 있습니다 또는 장치의 Adobe Premiere Clip 그것을 옮기고 당신의 탁상용 컴퓨터에 끝내십시오

그래서 그게 아주 멋진 기능입니다 하지만 뭔가를 원한다면 완벽한 엔드 – 투 – 엔드 솔루션 모바일 장치에서 그런 다음 두 앱 모두 실제로는 기능이 제한되어 있습니다 기기에서 실제로 편집하는 경우입니다 그리고 Quik 앱과 거의 비슷합니다 좋은 비디오 편집 응용 프로그램입니다

당신이 아주 기본적인 편집을했다면, 많지 않은 컨트롤과 다중 비디오 트랙 고급 기능의 힙 다른 앱 중 일부는 따라서 기본 편집을 수행 한 경우, Quik은 여전히 ​​훌륭한 솔루션입니다 하지만 여기에 몇 가지 뛰어난 점이 있습니다 우리가 곧 뛰어 들겠다 Android 기기에서 동영상을 실제로 편집하는 작업 다음 수준으로 전체 목록에서 앱을 전반적으로 살펴 봅니다

실제로 4 개의 우수한 앱이 있습니다 당신이 할 수있는 일의 경계를 밀고 있습니다 Android 기기에서 동영상을 수정하는 것과 관련이 있습니다 그리고 그들은 FilmoraGo, Cute CUT, KineMaster입니다 및 CyberLink PowerDirector

이제 마지막 비디오에서 우리는 귀여운 컷을했습니다 그리고 FilmoraGo는 실제로 많은 것을 얻지 못했습니다 지난 1 년 동안 그들은 실제로 꽤 많이 성장했습니다 그리고 그들이 가지고있는 기능 세트 지금 꽤 단단 해 또한 비디오 편집을 통해 훨씬 더 많은 작업을 수행 할 수 있습니다

지금 가져온 고급 도구로 그 두 앱에서 그러나 말하자면, 상위 2 개 앱 Android에서의 비디오 편집, 우리가 이것을 좁혀 버렸습니다 실망한 KineMaster와 PowerDirector입니다 이것은 작년과 정말로 같은 결과입니다 이 두 개는 다른 앱보다 앞서 있습니다 전문적 수준에 관해서 Android 기기에서 동영상 편집

하지만 지난 한 해 동안이 두 앱 변화를 겪었고 개선되었고 나아가고 있습니다 이제 저는이 두 가지 앱 모두를 매우 좋아합니다 나는 그들이하는 일을 사랑한다 나는 그들이 얼마나 멀리 왔는지 사랑한다 하지만 내가 승자를 골라야한다면, CyberLink PowerDirector로 이동합니다

그리고 몇 가지 분명한 이유가 있습니다 PowerDirector를 KineMaster 이상으로 이동합니다 첫번째 것 그리고 아마 가장 중요한 것, 사용하기 쉽고 직관적 인 방법입니다 여전히 모든 고급 기능을 갖추고 있습니다 둘 다 멀티 트랙 비디오 편집, 고급 오디오 컨트롤, 고급 색상 보정, 손쉽게 클립을 집어 들고 움직일 수있는 능력 그 (것)들을 아래로 정돈하고, 음악을 통합하기 위하여 모든 볼륨 레벨을 조정하십시오

따라서 실제 비디오 편집과 관련하여, 둘 다 매우 비슷하다 PowerDirector의 인터페이스 실제로 편집하는 방법 당신이 가지고있는 성과 KineMaster보다 훨씬 앞서있는 것 같습니다 적어도 내 의견으로는 이제 PowerDirector의 또 다른 큰 특징 인, 당신이 가지고있는 통제 수준입니다 동영상 내부의 색상 보정보다 그것은 어디에서나 비디오 편집에있어 대단한 일입니다

전화를 걸 수 있습니다 실제로 원하는 색상으로 원하는 색상을 얻을 수 있습니다 PowerDirector가있는 곳입니다 제어 및 고급 제어가 훨씬 더 많습니다 그러나 KineMaster를 통해 간단한 방법으로 이루어졌습니다

그래서 KineMaster와 함께, 당신은 당신의 밝기, 대비 및 채도 드롭 할 때 사용할 수있는 필터가 있습니다 Instagram 스타일의 필터와 같은 것 같아 다른 모양을 적용하려면 동영상에 적용 할 수 있습니다 PowerDirector에는 이러한 모든 기능이 있습니다

하지만 훨씬 더 고급 제어 기능도 있습니다 화이트 밸런스 조정과 같은 간단한 작업으로도 최종 비디오 출력에 큰 차이를 만들 수 있습니다 PowerDirector의 또 다른 큰 특징 KineMaster에서 찾을 수없는 실제로 찾지 못한다 밖에있는 많은 다른 응용 프로그램에서, 동영상을 수정할 수있는 기능입니다 가로 및 세로로

그래서 편집을한다면, Instagram 스토리 또는 인물 사진과 같은 것들 PowerDirector에서 실제로이 작업을 수행 할 수 있습니다 세로 비디오를 스쿼시하려고하는 대신 가로 프레임으로 그게 당신이 관심있는 부분이라면 Instagram의 이야기를 한 단계 높은 수준으로 끌어 올리려는 노력, 지금 카드에 링크를 달아 놓을 게 우리가 그 과정을 통해 당신을 데리고 오는 비디오 그리고 실제로 PowerDirector를 사용하고 있습니다

그 비디오 편집을 초상화로하는 것 자, 그 모든 것들과 함께, 그것은 KineMaster를 말하는 것이 아닙니다 솔리드 옵션이 아닙니다 KineMaster에는 두 가지 뛰어난 기능이 있습니다 PowerDirector에는 없습니다

그리고 내가 말할 수있는 가장 큰 것 오디오 파일에 대한 제어 수준입니다 당신이 입을 수있는 전문적인 필터의 양 비디오에서 오디오 음질을 정말 좋게 만드십시오 오디오 압축기와 같은 간단한 것입니다 너는 켜거나 끌 수있다 또한 키 프레임 기반 편집 기능 다른 볼륨 레벨을 조정하는 방법 당신이 가면서 비디오 전반에 걸쳐

정말 저에게 돋보이는 기능입니다 그러나 다시 한번, 정말로 당신이이 두 가지 중 하나를 사용한다면, 둘 다 당신을 줄거야 귀하의 동영상으로 좋은 결과를 얻을 수 있습니다 지금 우리가 아직 만지지 않은 가장 큰 것 이 두 앱의 가격입니다 자, 둘 다 무료로 달릴 것입니다

무료로 편집 할 수 있습니다 동영상에 워터 마크가 추가됩니다 당신이 그것을 구할 때 이제 그 워터 마크를 제거하기 위해 돈을 좀 내야 할 곳이야 우리가 마지막으로 살펴본 시간은 이 두 가지 앱을 나란히 놓고, PowerDirector는 훨씬 더 나은 기능을 제공합니다

앱을 완전히 구매하는 것은 5 달러 또는 6 달러의 정액 요금이었습니다 PowerDirector를 이미 지불했다면, 그러면 돈을 내지 않아도 될 것 같습니다 새로운 가격 모델을 위해, 실제로 구독 모델입니다 월 단위 구독 또는 연간 구독 소프트웨어를 사용하려면, 그것은 KineMaster가 전체 시간 동안 가지고있는 것입니다 따라서 KineMaster에 가입하면 비용이 들게됩니다

한 달에 약 5 달러, 또는 연간 약 42 달러 이제 이것은 호주의 가격 책정이며, 그래서 가격은 약간 다를 수 있습니다 네가있는 곳에 따라, 하지만 그 가격에있을거야 PowerDirector의 새로운 가격 모델 한 달에 7 달러 쯤 올릴거야 또는 연간 약 $ 50

또한 세 번째 옵션이 있습니다 앱에 3 개월 동안 액세스 할 수 있습니다 약 14 달러가들 것입니다 따라서 PowerDirector로, 워터 마크를 제거 할 라이센스를 구입할뿐만 아니라 너에게 줄거야 높은 품질, 1080p 수출

이제 내가보기 엔 가장 큰 것 같아 이 앱의 가격 책정을보고있을 때 그들이 어떻게 지금 모두 움직 였는지 가입 기반 모델로, 그들이 무엇을 할 수 있는지를보고 있습니다 그래서 이들은 전문적인 수준의 비디오 편집 응용 프로그램입니다 가장 가까운 앱입니다 데스크톱 동영상 수정을 모방 한 Android 기기에서 그리고 그 유연성과 장치의 힘을 얻으려면 어디서나 편집 할 수있는 능력이 미치지 않습니다

그래서 저는 개인적으로 생각할 필요가 없다고 생각합니다 동영상을 편집하고 싶다면 Android 기기에서 이 두 가지 앱 중 하나를 진지하게 고려해야합니다 그래서 내 선택은, 당신이 더 전문적인 것을 좇지 않는다면, FilmoraGo를 더 잘 확인하고 Cute CUT도 확인하십시오 둘 다 솔리드 옵션입니다 그리고 그들은 정말로 먼 길을왔다

지난 12 개월 동안에도 그래서 지금 당장 나를 위해, Android에서 최고의 비디오 편집 응용 프로그램, CyberLink PowerDirector로 이동합니다 레벨을 올리려는 분이라면 귀하의 콘텐츠 전문성, 반짝 반짝 빛나는 새로운 소개 애니메이션을 얻고, 또는 맞춤 브랜드 도서, 생각보다 훨씬 쉽게 할 수 있습니다 그런 다음 가져올 수 있습니다 Android 기기에 바로 연결 새 편집 응용 프로그램에서 사용하십시오 지금 화면의 링크를 클릭하십시오

전체 프로세스를 통해 진행되는 비디오의 경우, 나는 너를 곧 볼거야