Getting Started with Test Lab for Android – Firecasts

Firecast에 관심을 가져 주셔서 감사합니다 저는 더그 스티븐슨입니다 Firebase Test Lab 이용해서 앱을 테스트하는 방법에 관해 간단히 훑어 보도록 하겠습니다 어플리케이션의 품질은 앱이나 비즈니스의 장기적인 성패에 영향을 주지요 심각한 문제가 있는 앱을 내놓으면 고치다가 돈과 시간을 허비하는 경우도 많습니다

문제가 많으면 사용자들이 삭제해 버리니 더 큰 문제죠 이런 문제를 해결하려면 안드로이드를 위한 Firebase Test Lab을 사용해서 수많은 기기에서 동시에 테스트하여 높은 품질을 유지하는 것이 좋습니다 Test Lab은 유용한 게 많습니다 그럼 Test Lab을 지금 시작해 보겠습니다 Firebase 콘솔에서 프로젝트를 만들어두었으니 그걸 사용하겠습니다 여기를 볼까요? 왼 편에서 Test Lab을 선택하면 Blaze 플랜으로 업그레이드하라고 메시지가 뜹니다 업그레이드 버튼을 누르면 선택항목이 나오는데 Blaze 플랜에 Test Lab이 있습니다 Blaze를 선택하면 실시간 데이터베이스, 파일 저장소 웹 호스팅에 대한 요금이 청구됩니다 문제네요 고작 첫 버전을 만들면서 SPARC 플랜으로도 충분한데 스토리지나 용량으로 돈을 내기는 싫거든요 그럼 방법이 있습니다 프로젝트에서 Test Lab을 사용하지 마시고 앱 개발에만 쓰는 거지요 Test Lab에 대해서만 지불하려면 테스트용으로만 쓸 완전히 새로운 프로젝트를 생성하세요 그 프로젝트를 Blaze 플랜으로 업그레이드하고 테스트에 대해서만 지불하면 됩니다 사실 Test Lab으로 테스트만 할 거라면 앱에 Firebase가 없어도 상관 없습니다 APK만 올리면 Test Lab에서 테스트를 수행하지요 청구서는 그 앱이 속한 프로젝트의 지불정보로 청구됩니다 그럼 새 프로젝트를 만들어서 업그레이드해요 우선, Firebase 콘솔 메인 스크린으로 가겠습니다 그리고 새 프로젝트를 생성합니다 뭘 하려는지를 잘 표현하는 이름을 붙이고 기본 국가는 그대로 놔둡니다 이제 이 프로젝트를 업그레이드합니다 Blaze 플랜을 선택하고 billing 설정으로 갑니다 촬영은 여기서 잠깐 중단 신용카드 정보가 나가면 안 되니까요 나머지는 여러분이 알아서 하시면 돼고요 다 끝나면 프로젝트가 Blaze 플랜에 있고 테스트가 가능하게 됐습니다 앱을 테스트하는데 돈이 어떻게 드는지 궁금하죠 신용카드 청구서를 보면 physical device hour 당 5달러가 청구됩니다 즉 다섯 개의 기기를 사용하고 각기 12분 정도 걸리는 작업을 하도록 했다면 총 1시간이 되며, 5달러입니다 기기를 6개로 하고 10분씩 돌렸다면 총 1시간으로 5달러입니다 계산도 쉽고 이해하기도 쉽습니다 그럼 간단한 테스트를 해 봐요 업그레이드된 프로젝트에서 Test Lab을 클릭하면 하고자 하는 테스트들을 선택할 수 있습니다 가장 쉬운 테스트는 Robo 테스트입니다 이것은 자동화된 인지 테스트로 코딩이 필요 없습니다 앱을 작동시키고 나서 보고서가 나옵니다 APK를 업로드하고 테스트할 설정만 선택하면 됩니다 Nexus7과 Nexus5를 선택해 보겠습니다 API 레벨21과 21이고 가로보기와 세로보기입니다 기본 로케일은 US English로 놓습니다 스크롤해서 내려가면 총 6개의 테스트라고 알려줍니다 이 버튼을 클릭하면 테스트할 앱이 Test Lab 내에서 내가 선택한 기기로 배포됩니다 그리고 잠시 후에 결과가 콘솔에 표시됩니다 여러분이 자신의 계기오차 테스트를 한다면 콘솔에서 여기로 가서 할 수 있습니다 앞서 말했듯이 수많은 APK를 테스트할 수 있어요 Firebase가 포함되지 않아도 테스트가 가능하고 여러 다른 앱을 같은 프로젝트에서 테스트할 수 있어요 또 하나 있네요 테스팅으로 지불하기가 싫을 경우 구글 플레이 디벨로퍼 콘솔에서 알파 혹은 베타 채널로 APK를 업로드하면 Firebase Test Lab을 사용할 수 있어요 구글 플래이에서 Pre-Launch Report 사용하기를 선택하세요 그럼 그 순간부터 두 채널로 올리는 APK에 대해 5분간 여러 기기에서 Robo 테스트를 받게 됩니다 무료입니다 테스트 결과는 잠시 후에 APK올렸던 채널에서 볼 수 있게 됩니다 여기까지입니다 Firebase 유튜브 채널을 구독하시면 Android Firebase Test Lab과 기타 Firebase 기능의 정보를 받으실 수 있습니다 질문이 있으시면 트위터 #askfirebase에 올리시거나 댓글로 남겨 주세요 저는 더그 스티븐슨입니다 시청해 주셔서 감사합니다 Firebase 테스트를 잘 활용해 보세요

Unlocking Location Context with the Android Places API (100 Days of Google Dev)

[음악 재생] 앱을 더 스마트하게 만드시겠습니까? 사용자의 위치 이해하기 도움이 될 수있는 핵심 성분 중 하나입니다 보다 쉽고 직관적 인 사용자 환경을 만들 수 있습니다

나는 제임스 맥길이야, 너에게 보여줄거야 Android 용 Google Places API를 사용하는 방법 지능적으로 앱 동작을 기반으로 사용자의 현재 위치에서 얼마 동안 개발자들은 Android에서 위치 서비스를 사용할 수 있습니다 사용자의 위치를 ​​더 잘 이해할 수 있습니다 그러나 Google 사용자 및 API 두 가지 다른 언어로 말하고 있습니다 위치 API는 위도와 경도를 사용하여 통신합니다

하지만 너와 나는 만날 곳을 이야기 할 때, 우리는 특정 카페 나 레스토랑의 이름을 사용합니다 긴 숫자 Android 용 Google Places API 이 둘 사이의 번역에 필요한 누락 된 키를 제공합니다 언어 및 100 이상의 Google 데이터베이스에서 제공 백만 개 장소 이것을 당신이 이것으로 바꿀 수 있도록

우리가 응용 프로그램을 만들고 있다고 상상해 봅시다 피트니스 팁을 제공하여 사용자의 웰빙을 향상시킬 수 있습니다 그들이 어디에 있든 상관 없습니다 사용자가 앱을 열면 그들에게 가장 유용한 정보를 보여줄 수있다 그 당시와 그 특별한 장소에서

우리는 그들이 어디에 있는지 물어볼 수 있습니다 누가 다른 탭을 필요로하는지 우리의 애플 리케이션을 사용하는 방식으로? Google Places API 사용 현재 장소 가져 오기 방법 우리는 그 프롬프트를 건너 뛰고 자동으로 사용자가있는 장소를 결정하십시오 현재 장소 가져 오기는 장소 목록을 반환합니다 기기의 현재 위치를 기반으로 우도에 따라 정렬됩니다 유사한 기능이 웹을 통해 제공되었지만 몇 시간 동안 Places API를 사용하면 정확도와 정밀도 모두 향상 API를 Android로 가져 오는 과정에서 Google은 API를 깊이 통합함으로써이 목표를 달성했습니다

다양한 센서 사용 가능 Wi-Fi 및 블루투스를 포함한 최신 휴대 기기에서 가능한 장소 목록을 결합하여 앱의 맥락에서이 견적을 향상시킬 수 있습니다 더욱 여기서는 연결된 장소 유형을 사용할 수 있습니다 각 입장은 휘트니스 경기장 만 필터링 할 수 있습니다 공원과 체육관처럼

각 장소와 함께 현재 장소 방법을 얻습니다 우도를 반환합니다 0과 1 사이의 값입니다 장치가 얼마나 가능성이 높은지 나타내는 특정 장소에서 이 값을 앱에서 임계 값으로 사용할 수 있습니다

우리가 정말로 그 위치를 추론 할 수 있도록 말이된다 피트니스 앱의 경우 07 이상일 수 있습니다 체육관이나 공원으로 지정된 장소 매우 강한 신호입니다 사용자에게 그들이 어디에 있는지 묻지 않아도되도록 사용할 수 있습니다

굉장해 Google API 팀은 정확성 향상에 투자합니다 이러한 장소 검색 API 중 따라서 시간이 지남에 따라 첫 번째 장소의 가능성이 증가했다 우리가 더 빨리 거기에 도착할 수 있도록 돕고 싶다면, Place 메서드에서 Report Device를 호출하면됩니다

신호가 강한 경우 사용자가 특정 위치에 있다는 것을 나타냅니다 제출 된 데이터는 익명으로 처리되어 개선됩니다 우리의 세계 모델이지만 검색 할 수는 없다 귀하의 응용 프로그램이나 최종 사용자가 따라서이 데이터에 액세스하는 것이 중요한 경우, 영구 데이터 저장소에도 저장해야합니다 가장 좋은 점은이 기능 무료로 기본으로 제공됩니다

확인 된 개발자의 경우 하루에 최대 150,000 개의 쿼리가 허용됩니다 더 필요해? 걱정 마 이 URL에서 우리와 연락을 취하십시오 또는이 사이트에서 지침을 확인하십시오 개발 프로젝트를 검증하는 방법

Google Places API를 사용하면 의미 론적 위치 정보를 앱에 가져와야합니다 시작하려면 시작하기를 확인하십시오 이 URL의 안내 나는 James McGill이고, 나는 기다릴 수 없다 Android 용 Google Places API로 장소를보고 있습니다

[음악 재생]

Tidal now plays nice with Amazon Fire TV as well as Android Auto

자신을 즐겁게하는 것은 훨씬 쉬워졌습니다 Tidal은 Android Auto 및 Amazon Fire TV 및 Fire 용 새 앱을 출시했습니다

TV 스틱 조수 회원은 이제 대형 스크린에 최적화 된 맞춤형 Fire TV 인터페이스를 제공합니다 Android Auto 호환 차량이있는 사람들은 좋아하는 음악을 확인할 수 있습니다 플랫폼을 사용할 수 있습니다 Fire TV의 "홈"화면으로 이동하면 선별 된 비디오 재생 목록 및 콘서트를 포함하여 플랫폼의 최신 콘텐츠, 라이브 스트리밍, 뮤직 비디오, 앨범, Podcast 등

이름에서 알 수 있듯이 새로운 '내 컬렉션'화면이 있습니다 자신이 좋아하는 콘텐츠로 개인화했습니다 또한 사용자가 Tidal의 카탈로그를 활용할 수 있도록 최적화 된 검색 기능이 있습니다 5 천만 개가 넘는 트랙을 제공하거나 스트리밍 서비스에서 원본 콘텐츠를 시청할 수 있습니다 HD 품질로 볼 수있는 라이브 및 주문형 콘서트, 뮤직 비디오 등이 있습니다

Fire TV와 Fire TV Stick을 통해 제공됩니다 Fire TV "Apps"섹션을 통해 앱을 다운로드하거나 TV 검색을 사용하여 찾으십시오 수단 새로운 Android Auto 기능 (400 가지가 넘는 다른 기능과 호환 가능) 자동차 모델), Android 50 이상의 드라이버는 Tidal에 액세스 할 수 있으며 자동차

필요한 것은 USB 케이블뿐입니다 이 통합은 회원들이 좋아하는 음악, 팟 캐스트, 및 기타 콘텐츠를 차량 대시 보드에서 바로 볼 수 있습니다 "My Collection"섹션에 대한 액세스는이 인터페이스에서 매우 간단합니다 즐겨 찾기 재생 목록, 앨범, 트랙, 아티스트 등을 다운로드 할 수 있습니다 여행 중에 새로운 것을 찾고 있다면, 체크 아웃 할 수 있습니다

"탐색"섹션을 통해 새롭고 최고의 앨범, 팟 캐스트 및 신중하게 큐 레이 티드 재생 목록을 찾습니다 장르를 기반으로합니다 Tidal은 방금 Fire TV와 Android Auto에 가입했지만이 서비스는 통합을 자랑합니다 Apple TV 및 Android TV, Apple CarPlay, Sonos를 통해 직접 제어 기능을 제공합니다 음악을 듣고 싶다면 Tidal이 여기에 있습니다

조금 더 쉬워

Integrating Google Maps API v2 with Android Part-1

안녕하세요, 저는이 에피소드에서 Ashok Kumar입니다 우리는 어떻게 통합 할 것인가? Android 애플리케이션 용 Google지도에서 필요한 애플리케이션을 시작할 수 있습니다

안드로이드에 대한 경험이 있으니 갖고 계시다면 많이 도와 드리겠습니다 이미 Google지도에서 작업 한 다음이 동영상에 이점이 추가되므로 두 가지를 기억해야합니다 Google 개발자 콘솔 설치 및 실행 및 Android Studio 시작 내가 가지고있는 저장소에는 다른 것들이 있습니다지도와 관련된 두 개의 응용 프로그램이 있습니다 많은지도 관련 자료를 이해할 수 있으므로 코딩부터 시작하겠습니다

모두를위한지도라는 프로젝트 여기에 Google지도 활동을 만드는 대신에 빈 활동을 만들 것입니다 학습자는 Google지도 활동이 처음부터 시작하는 것이 좋습니다 아직 버그가 있으며, 모든 오류가 발생하여 모든 것이 준비되면 필요할 때가 있습니다 Google Play 서비스를 Android 앱에 통합하여이 기능이 필요합니다 Playservices 의존성, 당신이 gradle 빌드 시스템에 대한 의존성을 찾고 싶다면 다음 http://gradleplease

appspotcom 멋진 당신이 피카소를 원한다면 아주 멋진 웹 도구 예제 당신이 gson을 원한다면 피카소의 의존성을 분명히 얻을 수 있습니다 이 도구를 사용하여 다른 gradle 종속성을 얻을 수있는 것과 비슷한 gson 종속성을 얻을 수 있습니다 그래서 프로젝트는이 TextView를 삭제하려고하는데 나는 내 gradle 의존성을 추가 할 것입니다 com

googleandroidgms : play-services : 750은 최근 버전입니다

우리는 API 키가 필요한 두 가지를 정렬해야합니다 Google지도 서버가 Android 용지도를 푸시합니다 API 키를 기반으로 어떻게 작성합니까?이 https://consoledevelopersgoogle

com으로 이동하십시오 이 아래쪽 화살표를 사용하여 프로젝트를 만들면 프로젝트 제목이 생기고 안드로이드 키를 만들 수 있습니다 안드로이드 키를 만들기 전에 API 및 인증 섹션에서 API로 이동하십시오 Google지도 및 Android API로 이동해야합니다 이 확인란이 활성화되어있는 것처럼 보이기 때문에 활성화 된 API가 비활성화 된 이유가 표시됩니다

따라서 API를 사용 중지하면 API가 표시됩니다 그게 어떻게 작동하는지 일단 API가 활성화되면 새로운 안드로이드 키를 만들면 어떻게 만들 수 있을까요? 그래서 우리는 시스템 터미널 따라서 keytool을 사용하여 keytool은 보여줄 자바 도구입니다 지문 몇 명령은 비디오 아래에 동봉되어 있습니다 시스템을 가져 오는 것입니다 sha1 지문 그래서 이것은 우리에게 sha1 지문을 줄 것입니다

이 지문을 복사하여 안드로이드 키 대화 상자 안의 콘솔에 붙여 넣으십시오 그것을 ';'으로 분리하십시오 매니페스트에서 패키지 주소 복사 그렇게하면 API 키가 생성됩니다 이 작업이 완료되면 매니페스트 파일을 구성해야합니다 이 메타 데이터 태그가 항상 액티비티 태그에도없는 애플리케이션 태그 안에 있는지 확인하십시오

그리고 약간의 변경은 패키지 주소를 yourpackge 자리 표시 자로 복사하고 있는지 확인해야합니다 그리고 인터넷 사용 허가를 외부 저장소 쓰기 허용 거친 위치 미세 위치 퍼미션 그리고 당신은 OpenGL에 대한 허가를 줄 것입니다 그렇게 됐어 메타 데이터 태그에 api 키를 붙여 넣습니다

우리의 매니페스트가지도를 수신하도록 구성되었습니다 한 번 완료되면 조각 컴패니언 만들기 그래서 그것을 컴파일 할 수 있습니다 너는 볼 수 있어야한다 그래서 일단 컴파일되면 그것은 대화를 줄 것이다 장치를 선택하는 방법 나는 달리기 장치를 선택할 것이다

그리고! 로드 중 APK 및 그로드 된 그래서지도가 성공적으로로드되었습니다

Android S7E4 : PHP MySQL – PDF Viewer with GridView

Todays 'Edition이나 ProgrammingWizards TV에 오신 것을 환영합니다 이것은 안드로이드 mysql을 PDF로 자습서입니다

우리는 MySQL 데이터베이스에 저장된 PDF 문서를 나열하는 PDF 뷰어 android 앱을 만드는 방법을 알고 있습니다 gridview에서 우리는 HTTP GET 요청을 통해 이러한 PDF 문서를 다운로드하여 이미지와 텍스트가있는 사용자 정의 그리드 뷰 여기에 우리의 응용 프로그램을 볼 수 있습니다, 우리는 헤더 레이블로 TextView, 그리고 빈 gridview 및 다운로드 단추 이 다운로드 버튼을 클릭하면 PHP MySQL 서버에서 PDF가 다운로드됩니다

HTTP GET 요청을 다운로드하거나 만들 때 불확정 progressbar가 렌더링됩니다 그리드 뷰에서 렌더링되는 PDF 문서를 볼 수 있습니다 GridView의 관점에 유의하십시오 그냥 이미지와 텍스트를 렌더링하는 것입니다 PDF 아이콘, PDF 문서 제목 및 PDF 문서 설명입니다

사용자는 문서를 스크롤하고 하나의 PDF 문서를 클릭하여 열어 볼 수 있습니다 이 PDF 문서는 PHP MySQL 데이터베이스에 저장됩니다 그리고 우리는 HTTP GET 요청을 통해 다운로드합니다 단일 gridview 항목을 클릭하면 PDF Viewer 활동을 사용하여 PDF 문서를 렌더링 할 수 있음을 알 수 있습니다 사용자가 볼 수 있듯이 스크롤 핸들을 사용하여 PDF 문서를 스크롤하면 현재 PDF 페이지도 표시됩니다

사용자는 렌더링 된 pdf 문서를 확대 및 축소 할 수도 있습니다 그런 다음 렌더링 할 수있는 다른 PDF 문서도 있습니다 클릭하기 만하면됩니다 이제 우리가 클릭 한 것을 완벽하게 렌더링하고 있음을 알 수 있습니다 당신이 볼 수 있듯이 포맷은 전문적이며 우리는 PDF 문서를 bartesk의 안드로이드 PDF 뷰어 라이브러리

github에서 무료로 사용할 수있는 무료 라이브러리입니다 우리는 당신이 볼 수있는 것처럼 우리의 gridview에서 렌더링 된 다른 PDF 문서를 가지고 있습니다 앞서 말했듯이 PDF를 읽거나 볼 수 있도록 렌더링합니다 그래서 우리는 Java android를 사용하여 PDF Viewer / Reader 응용 프로그램을 작성합니다 그것은 PDF 문서를 MySQL 데이터베이스에 저장합니다

또한 가로 모드에서는 애플리케이션을 볼 수 있습니다 데이터를 다운로드하면 진행률 표시 줄이 표시됩니다 그러면 우리의 PDF 문서는 우리의 gridview에 나열됩니다이 튜토리얼에서는 gridview를 사용했지만 물론 ListView 나 ReccylerView에서 PDF 문서를 나열하거나 해당 어댑터 뷰를 확인할 수도 있습니다 여기에서 PDF 문서가 PDF 활동에서 렌더링되는 것을 볼 수 있습니다

사용자는 확대 / 축소 및 스크롤이 가능하며 PDF 문서는 확실하게 렌더링됩니다 우리의 PDF 문서는 다시 mysql 데이터베이스에 저장 될 것입니다 파이썬을 우리의 서버 측 프로그래밍 언어로 사용할 것이며, 우리의 안드로이드 응용 프로그램은 HTTP (Hyper Text Transfer Protocol)를 통해 PHP에 연결하여 대화 할 것입니다 우선 우리는 mysql 데이터베이스를 설정해야한다 당신은 wamp 서버와 같은 databasae 도구를 사용할 수 있습니다, xampp 서버 또는 유니폼 서버

나는이 경우에 후자를 사용한다 데이터베이스와 테이블을 생성하고 mysql 데이터베이스에 데이터를 삽입 / 저장하려면 PHPMyAdmin이 필요합니다 이러한 데이터는 이름, 설명, 경로 URL, 이미지 URL 및 작성자와 같은 PDF 세부 정보가 될 것이며, 브라우저에서 프로젝트를 실행하여 우리가 처음에 얻은 것을 확인해 봅시다 브라우저에서 내 PHP 스크립트를 클릭하면 mysql 데이터베이스에서 데이터가로드됩니다 그 데이터는 다음과 같습니다

json_encoded로 json 형식으로 출력됩니다 그래서 우리가 안드로이드 애플 리케이션에서 우리의 HTTP 요청을 만들면, 이것이 우리가 얻는 것입니다, 안드로이드 응용 프로그램에서 파싱 될 json 데이터입니다 PHPMyAdmin으로 이동하여 데이터베이스를 만들어 보겠습니다 나는 유니폼 서버를 사용하는 것을 선호한다고 말했지만, 그것과 wamp 서버 또는 심지어 xampp 사이에는 큰 차이가 없다 먼저 제공된 양식에 데이터베이스 이름을 입력하여 데이터베이스를 작성합니다

그런 다음 폼에 테이블 이름을 입력 할 수 있도록 mysql 테이블을 만들어야합니다 내 테이블에 이미 데이터가 있음을 알 수 있습니다 테이블은 행 ID로 구성됩니다 자동으로 증가합니다 pdf 또는 제목의 이름은 이름 열에 저장됩니다

범주 descroption은 테이블에 열을 포함합니다 또한 PDF URL과 이미지 URL을 기록해 두십시오 가장 효율적인 방법은 PDF URL과 이미지 URL을 데이터베이스에 저장하는 것입니다 그런 다음 PDF 파일과 이미지 파일이 서버의 폴더에 저장되어 mysql에 원시 바이너리 모양으로 저장되지 않습니다 우리 테이블 구조는 여기에 있습니다

id 열은 기본 키이며 자동 증가됩니다 다른 열은 varchars 및 텍스트입니다 데이터베이스 테이블을 준비 했으므로 웹 사이트 http://camposhainfo에서 더 많은 지침을 얻습니다 다시 말하지만, 우리는 pdf와 image URL을 데이터베이스에 저장 한 다음 그 URL을 우리의 pdfs 및 이미지를 mysql 데이터베이스 테이블에서로드 할 수 있습니다

여기에서 우리는 pdf 문서 / 아이콘뿐만 아니라 pdf 문서를 저장할 수있는 폴더가 있다는 것을 알 수 있습니다 또한 하나의 PHP 파일 인 indexphp 만 있습니다 여기에 우리의 프로젝트 폴더가 있습니다, 당신은 그것이 당신의 루트 디렉토리에 저장되기를 원합니다 WAMP 서버를 사용한다면 www 디렉토리

Xampp을 사용하면 htdocs 디렉토리가됩니다 이것들이 PDF 문서의 이미지 또는 아이콘임을 알 수 있습니다 이 이미지의 경로를 mysql 데이터베이스에 저장합니다 그런 다음 안드로이드에서 Picasso Imageloader를 사용하십시오 응용 프로그램에서 해당 이미지를 비동기 적으로로드합니다

mysql 데이터베이스에 적절한 이미지 경로를 저장해야한다는 것을 알고 있어야합니다 그런 다음 pdfs 디렉토리도 갖습니다 이 폴더에 PDF 문서가 있음을 분명히 알 수 있습니다 이 PDF의 경로를 mysql 데이터베이스에 저장합니다 그런 다음 비동기 적으로 경로 또는 URL에서 PDF를로드합니다

따라서 필요한 파일과 폴더는 indexphp, PDF 문서가 포함 된 pdfs 디렉토리 및 pdf 이미지가 포함 된 PDF 아이콘입니다 PHPMyAdmin을 사용하여 mysql 데이터베이스에 데이터를 삽입 할 수 있습니다 자동 생성 될 ID를 입력하지 마십시오 당신은 우리가 이름, 카테고리, 설명, PDF URL과 PDF 이미지 / 아이콘 URL을 볼 수 있습니다

그때 그들을 입력하십시오 구하다 대부분의 경우 당신은 일종의 웹 인터페이스를 통해 이것을 할 것입니다 브라우저를 통해 표시 할 수있는 URL을 통해 이미지를로드하는지 확인할 수 있습니다 이제 우리는 PHP 코드를 작성하게되었습니다 PHP는 서버 측 프로그래밍 언어이며, 아마도 가장 인기있는 서버 측 웹 개발 언어입니다

강력한 웹 응용 프로그램을 만들 수 있습니다 이 경우 이해하기 쉬운 객체 지향 PHP 코드를 작성합니다 먼저 Constants라는 클래스를 만듭니다 이 클래스는 데이터베이스 자격 증명과 상수를 보유 할 것이며, 여기에는 데이터베이스 서버 이름, 데이터베이스 이름, 데이터베이스 사용자 이름 및 암호가 표시됩니다 우리 서버는 분명히 localhost입니다

pass라고하는 암호로 sisi라는 사용자 정의 사용자를 만들었습니다 당신이 사용할 수있는 사용자를 만들지 않은 경우 루트를 기본 용도로 사용하고 비밀번호는 비어있는 비밀번호를 사용하십시오 그런 다음 mysql 데이터베이스에서 모든 것을 선택하는 sql 문을 갖게 될 것입니다 이 경우 모든 pdf 문서는 물론 이미지, 설명, 제목, 작성자 등이 선택됩니다 그런 다음 Pdfs라는 다른 클래스에서 PDF CRUD 작업을 수행합니다

먼저 우리에게 우리에게 필요한 기능을 정의합니다 mysql 데이터베이스 테이블 null 또는 mysqli 객체를 반환한다 우리는 객체 지향 방식으로 mysqli를 사용한다 서버 이름, 사용자 이름, 암호 및 데이터베이스 이름을 전달하여 인스턴스를 생성합니다 resultnat mysqli 객체를 con이라는 변수에 넣습니다

그런 다음 mysql 데이터베이스에서 데이터를 선택할 함수로 이동합니다 먼저 connect 메소드를 사용하여 mysql 데이터베이스에 연결한다 연결이 null인지 확인하십시오 그렇다면 우리는 안드로이드 앱으로 전송 될 예외 메시지를 인코딩합니다 그렇지 않은 경우 connection이 null이 아니면 mysqli 객체의 query 메소드를 호출한다

우리는 죄수 물건을 들고 있습니다 모든 mysql 데이터베이스를 선택하기 위해 SQL 문을 전달했다는 것을 기억하십시오 결과가 제로보다 큰 경우 그런 다음 먼저 PHP 배열 배열을 인스턴스화합니다 그런 다음 fetch_array () 메소드를 통해 얻은 결과를 while 루프 루프를 사용합니다 그런 다음 결과를 pdfs 배열로 푸시합니다

원래 우리가이 배열로 밀어 넣고있는 pdf 세부 사항입니다 그런 다음 루프를 종료 한 후 json 형식으로 클라이언트에 보낼 수 있도록 역순으로 배열을 json으로 인코딩합니다 우리가 안드로이드 애플 리케이션에서 마지막으로 추가 된 항목을 먼저 보여주기 때문에 우리는 그것을 뒤집었다 나중에 데이터베이스 연결을 닫습니다 그런 다음 우리는 안드로이드 프로젝트를 만들게됩니다

안드로이드 스튜디오를 사용하고 있습니다 API 레벨 14를 최소 sdk로 사용하고 빈 활동을 선택하겠습니다 그런 다음 우리는 우리 프로젝트에옵니다 먼저 프로젝트 레벨 buildgradle로 이동합니다

여기에서 allprojects 클로저에 maven URL을 https // jitpackio로 추가하고, 이제 앱 수준 buildgradle로 이동합니다 여기에 몇 가지 종속성을 추가합니다 우리 프로젝트에 먼저 CardView, appcompat 및 design과 같은 지원 라이브러리가 있습니다

그럼 우리는 안드로이드 네트워킹 라이브러리, 빠른 안드로이드 네트워킹 라이브러리라고도합니다 이것은 http 요청을 수행하는 데 사용할 라이브러리입니다 이 경우 우리는 http get request를 수행 할 것입니다 빠른 안드로이드 네트워킹 라이브러리는 우리가 비동기 방식으로 우리의 요청을 할 수있게합니다 오류를 적절하게 처리합니다

OkHHTP 네트워킹 레이어를 기반으로합니다 그럼 우리는 asyncronously php mysql에서 우리의 이미지를로드 할 피카소있을 것이다 Android PDFViewer 라이브러리를 사용하여 PDF 문서를 볼 것입니다 서버에서 다운로드하십시오 Android PDF 뷰어는 무료 라이브러리이며 사용하기 쉽고 빠릅니다

마지막으로 우리는 파일,이 경우 자신의 URL에서 PDF 문서를 허용하는 파일 로더 라이브러리를 갖습니다 또한이 작업은 비동기 적으로 수행됩니다 그런 다음 해당 PDF 파일을 내부 저장소에 저장하거나 파일을 저장할 수도 있습니다 외부 저장소 그럼 우리는 그들의 PDF 파일을로드합니다

이러한 종속성을 추가하고 동기화하십시오 그런 다음 androimanifest로 이동하여 인터넷 권한을 추가합니다 또한 외부 저장소에 pdfs를 캐시하는 경우 외부 저장소에 대한 읽기 및 쓰기 기능을 추가 할 수 있습니다 그런 다음 두 개의 이미지 (pdf_iconpng 및 placeholder

png)가 생성됩니다 그럼 우리의 activity_mainxml 루트에서 우리는 수직 방향을 가진 선형 레이아웃을 가지고 있습니다 ProgresssBar 인 TetxtView라는 헤더가 있습니다

ProgressBar가 표시됩니다 우리는 php mysql 서버에서 pdf 문서를 우리의 gridview로 다운로드합니다 그런 다음 다운로드 한 PDF 문서를 나열 할 GridView입니다 ListView, RecyclerView도 사용할 수 있습니다 그런 다음 버튼을 눌러 데이터 다운로드를 시작하고, 다음은 activity_main

xml 레이아웃의 디자인 뷰입니다 다음으로 row_modelxml이 나온다 여기서 디자인보기를 볼 수 있습니다 루트에서 CardView를 갖습니다

CardView 입면도, cardCornerRadius 등을 설정합니다 그런 다음 mysql 데이터베이스에서 pdf 이미지를 렌더링하는 이미지 뷰 그런 다음 TextView를 사용하여 PDF 문서의 이름이나 제목을 표시합니다 pdf의 저자를 표시하는 또 다른 TextView RelativeLayout에 랩핑합니다

그런 다음 activity_pdf 레이아웃 이 레이아웃은 PDF 문서를 렌더링합니다 이 레이아웃에서 사용자는 보거나 pdf를 읽으십시오 맨 위에는 진행 표시 줄이 있습니다 이 진행 상황 표시 줄은 pdf 문서를로드 할 때 표시되며, 그 아래에는 PDFView 요소가 있습니다

이것은 pdf 문서를 렌더링 할 책임이 있습니다 다음으로 우리는 MainActivityjava에옵니다 우리의 프로그래밍 언어는 java이며이 android mysql pdf 뷰어 튜토리얼입니다 우리는 처음부터 시작합니다

먼저 패키지 이름을 지정하십시오 그런 다음 import 문을 추가합니다 그런 다음 클래스를 만들고 AppCompatActivity에서 파생시킵니다 그것은 우리가 여기에서 한 것처럼 안드로이드 manifestxml에 등록되어야하는 활동이다

그런 다음 PDFDoc이라는 내부 클래스를 만듭니다 이 단일 POJO 클래스를 나타내는 클래스 pdf 문서 이 수업에서는 PDF 문서 속성을 정의 할 것입니다 여기에는 정수 인 ID, 이름 pdf의 종류, pdf url뿐만 아니라 pdf 심상 url 우리는 getters에게 세터를 생성합니다 Alt + Enter를 누르고 getters 및 setters를 선택하여 Android Studio를 통해 직접 할 수 있습니다

이제 우리는 GridviewAdapter에 왔습니다 이 클래스를 사용자 정의 어댑터 클래스로 바꾸기 위해 BaseAdapter를 확장합니다 그러나 BaseAdapter는 추상 클래스입니다 그래서 우리는 몇 가지 방법을 재정의하기 위해 열중하게 될 것입니다 그러나 먼저 PDF 문서의 Context와 ArrayList라는 두 개의 인스턴스 필드를 지정합니다

그럼 우리의 생성자 그런 다음 해당 메소드를 대체하십시오 여기에는 getCount (), getItem () 및 getItemId ()가 포함됩니다 getView ()도 있습니다 이 메소드 안에서 우리는 row 객체의 xml 레이아웃을 뷰 객체에 넣고 그것을 반환 할 것이다

하지만 먼저 우리는 그것을 확인합니다 그렇다면 LayoutInflater 클래스를 사용하여 해당 레이아웃을 뷰 객체로 확장합니다 그런 다음 mysql에서 데이터를 표시하기 위해 TextViews와 ImageView를 참조합니다 우리는 우리의 어댑터에서 현재 pdf 문서를 검색합니다 우리는 속성을 가져 와서 적절한 위젯으로 설정합니다

이미지 URL이 null 또는 비어 있는지 확인합니다 그렇다면 우리는 우리가 drawables에 가지고있는 사용자 정의 PDF 아이콘을 표시합니다 그렇지 않으면 Picasso ImageLoader를 통해 네트워크에서 이미지를로드합니다 로드 할 때 자리 표시 자 이미지가 표시됩니다 우리는 또한 우리의 맞춤 그리드 뷰의 onClick 이벤트를 청취 할 것입니다

클릭하면 인 텐트를 통해 PDF 뷰어 활동이 열리고, 우리는 일부 데이터를 해당 활동에 전달할 것이며, 기본적으로 pdf url을 다운로드하여 해당 활동에 pdf 파일을 다운로드 할 수 있습니다 putExtra () 메서드를 사용하여 데이터를 전달합니다 startActivity ()를 호출하여 gridview 항목을 클릭하면 해당 pdf 활동이 열립니다 그런 다음 HTTP 클라이언트를 만듭니다 나는 JSONDownlader를 호출하여 그 일을합니다

먼저 PDF 사이트 URL을 제공해야합니다 기본적으로 pDF URL로 연결되는 URL입니다 IP 주소 또는 1002

2를 사용할 수 있습니다 즉, 우리가하는 것처럼 localhost를 테스트하고있는 것입니다 그런 다음 생성자는 컨텍스트 개체를 사용합니다 우리는 mysql 데이터베이스에서 데이터를 가져 오는 검색을 담당하는 retrieve라는 메소드를 생성 할 것이다 이 메서드는 GridView 및 ProgressBar를 매개 변수로 사용합니다

우리는 pdf 문서를 보관할 arraylist를 만들 것입니다 그런 다음 서버에 HTTP GET 요청을하기 직전에 진행률 막대를 표시합니다 그런 다음 HTTP GET 요청을합니다 AndroidNetworking 또는 Fast Android Networking Library를 사용하고 있습니다 get 메소드에 url을 전달합니다

우선 순위를 설정하고 실제로 HTTP 요청을 수행하기 위해 build ()를 호출합니다 그런 다음 JSON 응답을받습니다 우리는 JSONArray를 받고 있습니다 이제이 JSON 응답을 구문 분석합니다 두 가지 가능성이 있습니다 : 서버로부터 유효한 응답을 얻거나 또는 오류가 발생했습니다

유효한 응답이지만 잘못된 데이터를 얻을 수 있습니다 따라서 JSON 예외를 잡기 위해 JSON 데이터를 구문 분석하는 동안 try catch를 사용합니다 이제 JSON 객체에서 데이터를 가져옵니다 우리는 이름, 카테고리, 설명, pdf url 및 pdf icon url 그런 다음 PDFDOc 객체를 인스턴스화합니다

JSON 객체에서 데이터를 검색하고 PDFDoc을 인스턴스화하면, 우리는 그 항목들을 PDFDoc으로 설정할 것입니다 우리는 setter 메서드를 사용하여이를 수행합니다 그런 다음 해당 PDFDoc을 PDF Documents ArrayList에 추가하십시오 이 arraylist 모든 PDF 문서를 보유합니다 그런 다음 어댑터를 인스턴스화하여 컨텍스트 및 pdf 문서 arraylist를 전달합니다

그런 다음 gridview에 pdf 문서 목록을 표시하기 위해 어댑터를 gridview에 설정하십시오 물론 ListView 나 RecyclerView를 사용할 수도 있습니다 오류가있는 경우 토스트 메시지에 표시합니다 마지막으로 우리는 onCreate () 메소드에 올 것이다 먼저 setContentView () 메서드를 사용하여 contentView를 설정합니다

그런 다음 우리의 gridview 인 adapterview를 참조하십시오 ListView 또는 RecyclerView를 사용한 경우 참조 다음 여기에 우리는 또한 버튼과 진행 막대를 다시 언급합니다 버튼의 onClick 이벤트를 수신합니다 클릭하면 우리는 먼저 인스턴스화하여 다운로드를 시작합니다

JSONDownlaoder 클래스를 호출 한 다음 retrieve () 메소드를 호출합니다 이제는 PDFActivity에 도달 할 차례입니다 먼저 패키지를 지정해야합니다 AppCompatActivity에서 상속하는 클래스를 만듭니다 여기에서 볼 수있는 것처럼이 클래스가 일부 인터페이스를 구현하도록 할 것입니다

정의 된 인터페이스입니다 PDFViewer 라이브러리에 있습니다 PDF 로딩을위한 오류 이벤트는 물론 완료까지들을 수 있습니다 우리가 원하는 두 개의 loadComplete () 및 onPageError () 메서드를 재정의합니다 그런 다음 onCreate () 메서드를 재정의합니다

WE는 먼저 PDFView 라이브러리를 참조 할 것입니다 우리는 또한 진행 표시 줄을 참조하고 그것을 보여줍니다 일부 데이터가 MainActivity에서 사용하도록 전달되었음을 기억하십시오 음, pDF URL입니다 우리는 의도를 통해 데이터를 다시 조사해야합니다

그런 다음 FileLoader 라이브러리를 사용하여 PDF 문서를로드합니다 우리는 내부 저장 장치에 pdf 문서를 임시 저장합니다 다운로드가 완료되면 Android PDF 뷰어 라이브러리를 사용하여 PDFView에서 렌더링합니다 파일에서로드합니다 기본 PDF 페이지는 1 페이지입니다

우리의 PDF 문서는 스크롤 할 수 있습니다 로드가 완료되면 진행률 표시 줄을 닫습니다 또한 오류가 발생하면이를 기각합니다 우리가 안드로이드 mysql을 PDF 뷰어 프로젝트를 실행하기 전에 인터넷 사용 권한을 추가했는지 확인하십시오 우리는 프로젝트를 실행합니다

Nox Player 에뮬레이터를 사용하고 있습니다 먼저 브라우저로 가서 ip 주소를 통해 php mysql에 연결할 수 있는지 확인하십시오 또는 1002

2 당신이 볼 수 있듯이 연결을 설정할 수 있습니다 그리고 실제로 브라우저에서 PHP를 실행하면 JSON 데이터가 있음을 알 수 있습니다 그래서 우리는 이제 안드로이드 PHP mysql pdf app으로 이동합니다 처음에 Gridview를 실행하면 데이터가 없습니다

그런 다음 우리는 다운로드 버튼을 클릭하고 우리의 PDF 문서는 우리의 gridview에 나열됩니다 당신은 이름과 저자와 같은 pdf 세부 정보와 함께 PDF 아이콘을 표시하고 있음을 볼 수 있습니다 그런 다음 pdf 항목을 클릭하면 읽을 수 있도록 렌더링 할 수 있습니다 우리는 우리의 애플 리케이션에 나열된 모든 PDF 문서를 열 수 볼 수 있습니다 우리의 응용 프로그램이 성공적으로 작동합니다

그게 다야 긴 튜토리얼로 우리 채널에 가입하십시오 우리는 ProgrammingWizards TV 커뮤니티의 친구들을 만들고 있습니다 또한 공유함으로써 우리를 도우며 도와주세요 소스 코드는 아래 웹 사이트 http://camposha

info에서 다운로드 할 수 있습니다 고마워, 오 클루 미

Media Playback with MediaSessionCompat (Android Development Patterns Ep 4)

여러분의 음악을 정지시키는 것과 같은 기능은 먼 얘기가 아닙니다 안드로이드는 이를 위한 여러 방법을 제공해왔죠 몇 가지 얘기하자면 화면 제어 잠금과 알림을 위한 미디어 제어 그리고 안드로이드 웨어, 그리고 심지어 안드로이드 오토도 있습니다 이렇게 좋은 기능을 여러분의 오디오 앱에서 어떻게 사용해야 할까요? MediaSessionCompat를 사용하면 간단합니다 여러분을 위하여 안드로이드와 통합된 많은 작업을 할 수 있는 안드로이드 지원 라이브러리를 통하여 하나의 API를 이용할 수 있습니다 저는 이안 레이크입니다 이제 MediaSessionCompat를 살펴보고 여러분의 미디어 메타데이터를 가지고 어디에서든지 제어할 수 있는 방법을 알아볼 것입니다 여러분의 미디어 재생의 대표로서 미디어 세션을 생각해 보시길 바랍니다 오디오, 비디오 심지어 구글 캐스트에서 먼 거리로 재생하더라도 시스템에 여러분이 하는 걸 알려주지 않으면 도움을 줄 수 없습니다 하지만 여러분을 도울 수 있는 많은 방법을 제공합니다 앨범아트와 아티스트 이름과 같은 메타데이터를 게시한다면 여러분이 지원하는 재생과 일시중지와 같은 미디어 제어를 알려줍니다 하지만 이에 대해 다루기에 앞서 시작을 제어하기 위해 MediaSessionCompat 객체를 생성해봅시다 또한, 롤리팝 이전에 안드로이드 버전에서 미디어 버튼 수신기를 생성하는 하나의 예비 단계가 필요합니다 블루투스 헤드셋과 안드로이드 웨어에서 미디어 제어를 제공하며 안드로이드 50 이전의 장치에서 여러분의 앱으로 전달할 수 있습니다 단순한 브로드캐스트 수신기입니다 이렇게 매니페스트에 등록하고 여러분의 앱을 위한 액션으로 수신 키 이벤트를 변형시킵니다 일반적으로, 실제로 일시 정지를 이동시키고 재생 명령을 여러분의 미디어 재생을 제어할 수 있는 서비스로 보내는 것입니다 예시로 우리의 훈련 문서를 보겠습니다 자, MediaSessionCompat가 있습니다 컨텍스트가 필요한데요 디버깅 태그로 제공되는 문자열과 여러분의 미디어 버튼 수신기의 구성요소 이름입니다 마지막 널은 대기중인 인텐트입니다 안드로이드 4

3에 있는 구성요소의 이름 대신에 사용할 수 있습니다 이렇게 생성되는데, 널을 통과하게 되면 일반적으로 올바르게 작동되는 것입니다 더 진행하기에 앞서서 세 가지를 해야 할 겁니다 적절한 플래그를 설정해야 합니다 미디어 버튼 제어가 있는데요 이러한 미디어 버튼 이벤트를 우리의 앱으로 보냅니다 그 다음, 콜백을 설정합니다 롤리팝과 더 높은 장치가 콜백을 사용하여 버튼을 눌렀을 때 재생, 일시 정지 그리고 다른 작동을 할 것입니다 마지막으로 무언가를 재생할 때 활성화할 세션을 설정합니다 여러분의 앱에서 미디어 버튼 경로와 다른 제어가 있는 시스템의 신호입니다 자, 플럼빙이 설정되었고 작동될 준비가 되었습니다 하지만 우리의 미디어 세션이 미디어를 재생시킬 수 있는지는 아직 모릅니다 어떤 것이 재생되고 어떤 제어를 지원하는지 알 수 있을까요? 첫 번째 부분은 MediaMetadataCompat에서 처리됩니다 이는 빌더 패턴을 사용하며 여러분은 가지고 있는 모든 정보를 추가할 수 있습니다 그 다음에 여러분의 미디어 세션에서 setMetadata를 호출합니다 하지만 여전히 미디어 제어가 없습니다 우리가 아직 다른 부분을 처리하기 않았기 때문입니다 재생 상태를 게시하지 않았기 때문이죠 PlaybackStateCompat은 두 개의 목적을 가지고 있습니다 setState 메소드를 통하여 설정된 재생과 일시 중지 또는 버퍼링과 같은 현재의 상태와 setActions 메소드를 통해 설정된 중지 또는 일시 정지, 재생 정지와 같은 현재의 액션이 있습니다 이러한 두 가지를 포함합니다 일반적으로 액션은 상태와 동시에 변경되기 때문입니다 중지 상태는 일시 정지 액션을 가지고 있지 않을 것입니다 예를 들면 말입니다 MediaSessionCompat이 작동되기에 충분합니다 통합된 미디어와 모든 API 8과 더 높은 장치, 그리고 아이스크림 샌드위치, 젤리 빈, 그리고 킷캣 장치를 위한 잠금 화면 제어의 블루투스 버튼을 보실 수 있을 겁니다 MediaSessionCompat이 NotificationCompat과 API14 그리고 더 높은 장치에서 특히 인라인 미디어 제어를 포함한 모든 API 레벨에서 여러분에게 훌륭한 미디어 알림을 제공하는 AppCompat 지원 라이브러리에 속한 MediaStyle과 잘 작동되고 있는 것도 보실 수 있을 겁니다 여러분의 미디어 세션에서 특별히 독특한 미디어 세션 토큰이 있는 SetMediaSession를 호출하는 것만 기억하시면 됩니다 이를 통하여 안드로이드 웨어에 미디어 세션을 연결시킵니다 그리고 안드로이드 50과 더 높은 장치를 위한 웨어의 미디어 제어를 제공합니다 미디어 세션을 완료했을 때 배포를 하는 것을 잊지 마시길 바랍니다 정말로, 잊지 마시길 바랍니다 아직 MediaSessionCompat에 대해서만 다뤄 봤습니다 미디어 브라우저 또는 미디어 컨트롤러나 미디어 세션의 상단에 만들 수 있는 전체 호스트를 아직 다루지는 않았습니다 하지만 이로 인해서 여러분이 시작할 수 있을 겁니다 여러분의 미디어 재생 정보와 재생 제어를 어디에서나 재생할 수 있습니다 MediaSessionCompat를 사용하여 여러분의 멋진 미디어를 볼 수 있기를 기대하고 있으며 여러분이 더 나은 앱을 가질 수 있도록 도움이 되었기를 바랍니다 그리고 배포하시길 바랍니다

Android Jetpack: sweetening Kotlin development with Android KTX (Google I/O ’18)

[음악 재생] JAKE WHARTON : 안녕하세요 제이크는 제이크입니다

코틀 린 물건에 대한 안드로이드 팀에서 일하고 있습니다 오늘은 Android KTX에 대해 이야기 할 것입니다 그리고 난 그냥 가지 않을거야 거기에있는 물건들을 묶어서 나는 그것보다 조금 더 재미있게 만들고 싶다 그래서 나는 약간의 일부터 시작하려고합니다

작년에 Google I / O에서 작년에 여기 있었는데 Android 유형에 대한 확장 기능을 작성할 수 있습니다 이 예와 같이 ViewGroup 내부의 뷰를 반복하는 코드 이 일반 코드를 확장 프로그램으로 가져올 수 있습니다 그리고이 확장이하는 일은 타입을 향상시키는 것입니다 우리가 통제하지 않는 ViewGroup 유형

기본적으로 멤버 함수를 만들 수 있습니다 그건 실제로 멤버 함수가 아닙니다 실제로 바이트 코드에서 정적 함수로 변합니다 우리가 향상시키고 자하는 기능으로 그래서 우리는 원래 코드를 취할 수 있습니다 명시적인 for-loop가 있었고이 새 멤버를 사용합니다

우리가 의도 한 것의보다 간결한 버전을 만들 수 있습니다 실제로 시각적으로 구분됩니다 일반 멤버 함수에서 이탤릭체로 표시됩니다 어두운 황색을 사용하면 실제로 노란색이됩니다 그러나 이것은 회원에게 전화하는 것과 의미 상으로 동일합니다

또는 의의는 의미 상 동등한 느낌을주기위한 것입니다 그리고 자주 시작됩니다 확장 기능에 대해 이야기하고, 당신이 생각하기에, 음, 이것이 아주 유용하다면, 왜 우리는 D 그룹에 직접 기능을 넣지 않습니까? ViewGroup은 왜 for-each와 for-each 인덱스를 제공하지 않는가? 람다를 필요로합니까? 그리고 정말로, 그 이유는 람다 때문입니다 우리가 Java 8이나 Kotlin에서 lambda를 넘길 때, 기본적으로, 그 방법을 먹는 익명의 클래스를 만들어야합니다 클래스 로딩을 유발합니다

그러나 Kotlin은 언어 기능, 우리는 그 람다의 할당을 제거 할 수 있습니다 함수를 인라인으로 표시함으로써, 확장의 본문이 호출 사이트로 복사되고, 우리는 제로 오버 헤드 추상화가 있습니다 다른 예를 살펴 보겠습니다 API 23에서 우리는 시스템 서비스를 얻을 수있었습니다 클래스 유형에 따라 그리고 27

1 개의 지원 도서관에서, ContextCompat 버전은 모든 API 수준에서 작동하도록 추가되었습니다 이것을 인라인 인 확장 프로그램으로 가져올 수도 있습니다 이전과 같지만 람다를 포함하지 않습니다 이게 다른 점은 무엇입니까? reified라고하는 것입니다 자, 이것은 컴파일러 트릭입니다

그 트릭이하는 일은 타입 정보 컴파일 타임에 알려진 일반의, 런타임에 사용 가능하도록 만들 수 있습니다 그래서 이것이 우리가 할 수있는 것입니다 그렇지 않으면 우리는 classjava를 호출 할 것입니다 알림 관리자에서 이제 그 정보를 추상화 할 수 있습니다

이 연장 뒤에 그래서 우리의 호출 코드가 이제는 단순화되었습니다 제네릭을 통과 할 수 있어야합니다 그리고 그것이 구체화 되었기 때문에, 그것의 구현은 classjava를 호출 할 수있는 액세스 권한이 있습니다

따라서 뷰의 패딩을 업데이트하려면 우리는 4 가지 중 2 가지만 지정합니다 매개 변수 -이 경우에는 왼쪽과 오른쪽 모두를 업데이트합니다 우리는 기존 패딩을 꺼내야합니다 안드로이드가 필요하기 때문에 상단과 하단에 대한 당신은 네 가지 모두를 지정해야합니다 이것은 우리가 다시 치료할 수있는 것입니다

확장 기능을 사용합니다 여기서 핵심은 각 인수에 대해 우리가 정의한이 새로운 기능에 대해, 우리는 기본값을 지정하고 있습니다 그리고 그 기본값 해당 인수에 값이 제공되지 않을 때 사용됩니다 그래서 우리는 호출하는 코드를 우리는 4 개 모두를 지정하고 있으며, 이제는 2 개로 지정합니다 하지만 여기서 문제는 우리가 제거한 것입니다

두 가지 주장 그러나 우리는 두 가지를 공급하기 때문에, 코 틀린 (Kotlin)은 이것을 처음 두 가지 의미로 생각합니다 후자의 두 개는 기본값이 사용되는 곳입니다 이것은 우리가 의도 한 바가 아닙니다 우리는 왼쪽과 오른쪽, 그것은 첫 번째와 세 번째입니다

또 다른 언어 기능이 여기에 도움이되는데, 이름이 매개 변수입니다 매개 변수의 이름을 지정함으로써, 우리는 컴파일러에게 두 개의 인수 중 어떤 것을 말할 수 있습니다 우리가 지정하고 그것을 채울 수 있도록 다른 사람의 기본값은 승인 Android API에는 여러 가지 복합 유형이 있습니다 이들은 점, 직사각형, 쌍과 같은 것들입니다

심지어 위치 클래스 이러한 복합 유형은 단지 래퍼 일뿐입니다 작은 개별 데이터 조각 주위 이 경우 사각형이있는 API를 호출합니다 그것은 네 개의 주위를 둘러싼 합성물입니다 – 왼쪽, 위쪽, 오른쪽, 그리고 바닥 – 직사각형의 값

계산을해야하는 경우 이러한 복합 형의 내부의 값에 근거 해, 당신은 그것들을 개별적인 값들 또는 변수들로 끌어 내야 만합니다 그 계산을하기 위해서 그리고 잠재적으로, 그들을 다시 모으십시오 확장의 도움으로이 문제를 피할 수 있습니다 이것은 약간 다릅니다 연산자라는 새로운 키워드가 있습니다

운영자는 Kotlin이 특별한 호출 사이트 구문을 사용할 수있게 해줍니다 그리고 각 연산자 함수는 매우 구체적인 이름을 가지고 있습니다 잘 알려진 이름 당신은 어떤 이름도 만들 수 없습니다 그리고 그 이름은 당신이 어떤 콜 사이트 구문을 정의하는지 창조하려고합니다

이 경우 구성 요소라고합니다 그리고 구성 요소를 사용하면 기능을 사용할 수 있습니다 Kotlin의 파괴라고합니다 그래서 개별적으로 철수해야했던 우리의 원래 코드 네 가지 구성 요소가 이제이 호출 ​​사이트를 사용할 수 있습니다 사각형이 자동으로 작성된 구문 4 개의 값에 압축을 풀고 4 개의 변수에 할당 우리가 선택한 이름으로 이것에 대해 정말 멋진 점은, 나중에 그 사람에 대해 신경 쓰지 않는다면 그 사람을 생략 할 수 있습니다

그리고 당신이 중간에있는 사람들에 관심이 없다면, 그것들을 밑줄로 지정할 수 있습니다 그리고 만약 우리가 단지 두개의 값을 꺼낼 필요가 있다면, 우리는 그것을 매우 간결하게 할 수 있습니다 승인 숙련 된 Kotlin 사용자가 알 수도 있습니다 그게

음, 우린 뒤집혔을거야 슬라이드로 돌아갈 수 있을까요? 승인 이 코드는 어떻게 우리는 문자열에는 숫자 만 포함됩니다 기본적으로 문자를 반복합니다

Kotlin의 for-in 구문을 사용합니다 그것이 자인지 여부를 확인합니다 문자에 대한 확장 함수 사용; 값을 true 또는 false로 설정합니다 그것이 자릿수가 아닌 것을 발견 할 때마다 숙련 된 Kotlin 사용자 인 경우, 당신은 모든 기능에 대해 알고있을 것입니다

string 상에 존재하는데, 그것은 동일한 루핑을 캡슐화한다 술어를 지정할 수있게 해줍니다이 경우, 입니다 실제로는 인라인 함수입니다 그래서 우리가 가지고있는 것과 똑같은 일을 할 수 있습니다

이전 슬라이드에 썼다 그러나 흥미로운 점은 Android는 실제로 이것을위한 내장 함수 그리고 나는 많은 사람들이 실제로 이것이 존재한다는 것을 알지 못한다 그리고 이것은 우리가 실제로 취할 수있는 것입니다 확장으로

그러나 당신은 궁금해하기 시작합니다 연장에있는 그것의 무게? 이 정적 메서드를 사용하면 어떤 가치를 얻을 수 있습니까? 내선 번호로 전화 할 수 있습니까? 글쎄, 하나, 그것은 방법을 변경 우리가 더 자연스럽고 관용적 인 느낌을 갖기 위해 코 틀린에서 – 확실한 그러나 여전히, 우리가 이것에서 추출한 가치가 있습니까? 우리가 이걸로 얻은 것 중 가장 큰 것 IDE에있을 때 문자열이 있습니다 당신은이 질문을하기를 원한다 그것은 숫자 만 포함합니다

TextUtils의 정적 메서드가 있다는 것을 모르는 경우, 당신은 아마 그것을 결코 발견하지 못할 것입니다 확장 기능을 사용할 때 IDE에서 타이핑을 시작하면, 실제로이 확장 기능과 자동 완성 기능을 보여줍니다 다른 곳보다 훨씬 더 쉽게 발견 할 수 있습니다 Enter 키를 누릅니다 그리고 당신은 그것을 얻습니다

괜찮아 그래서 여기에 몇 가지 확장 기능을 설명했습니다 나는 너에게 조금 생각 나게하고 싶었다 이러한 확장의 힘, 사실 우리는 오직 존재하는 언어 기능을 활용하고 있습니다 Kotlin에서는 Java 언어가 아닙니다

실제로,이 예제 중 일부는 우리는 나머지 동안 계속 돌아갈 것입니다 이 이야기 그래서 내가 방금 보았던 모든 확장 기능들 Android KTX 라이브러리에 포함되어있다 2 월 초 발표했습니다 그 이후로 두 번의 발표가있었습니다

화요일 현재, 그것은 제트 팩 (Jetpack)의 일부입니다 Jetpack으로 버전이 지정됩니다 그래서 화요일에 Core-KTX는 10 알파 1이되었습니다 버전이 만들어지고 출시 될 예정입니다

미래의 젯팩 (Jetpack) 도서관이있다 그래서 우리는이 Core-KTX를 출시 할 때 호출했습니다 그것은 이상한 이름의 종류이었다 그것은 말이되지 않았습니다 이것은 프레임 워크에서만 유형의 확장을위한 것입니다

많은 사람들이 도서관 자료를 추가 할 수 있을지 제안했습니다 그리고 우리는 no라고 말하는 것에 대해 매우 단호했습니다 바라건대 지금은 훨씬 더 의미가 있어야합니다 그러나 이것조차도 사실이 아닙니다 Core-KTX가 처음에는 support-compat에 의존했기 때문입니다

Support-compat은 이전 버전과의 호환성을 제공합니다 Android 프레임 워크에있는 것들의 버전 이전에는 ContextCompat로 예제를 보여 줬습니다 이것은 support-compat에서 나온 것입니다 그리고 지금, 제트 팩 브랜드와 안드로이드 X 패키지, support-compat이 핵심이되었습니다

이제 Core-KTX는 Core와 함께합니다 그래서 우리는 우리가 무엇을하고 있는지 알았습니다 우리가 이것을 시작했을 때 그리고 지금, 그것은 단지 갚기 시작했습니다 다른 Jetpack 라이브러리와 함께, 실제로 몇 가지 새로운 KTX 라이브러리가 있습니다

그것으로 시작됩니다 그래서 우리는 fragment, collection, SQLite를 가지고 있습니다 최신 구성 요소, 탐색 및 작업 런타임 용 나중에 조금씩 발견 할 수있는 방법을 알려 드리겠습니다 하지만 범위 지정에 대해 조금 이야기하고 싶습니다

무엇을해야할지 여부를 결정하는 방법에 대해 이 라이브러리들 중 하나에 들어가십시오 괜찮아 그래서 Core-KTX 03에서는 확장 기능을 제공했습니다 그게 그렇게 보였어

서명을 보면 연산자입니다 그리고 그것은 색상으로 작동합니다 이름은 플러스입니다 그래서 이것은 우리가 정상적인 더하기 구문을 사용하여 추가, 함께 두 가지 색상 합성 서명은 확실히 확장입니다

하지만이 몸은 매우 다른 것처럼 보입니다 우리가 본 다른 확장보다 상당한 양의 코드가 여기에 있습니다 당신이 안으로 볼 경우, support-compat, 현재 코어입니다 컬러 유틸리티 클래스가 있습니다 그리고 그 컬러 유틸리티 클래스는 정수 색상에서 작동하는 합성 색상이라고하는 메소드입니다

전경과 배경을 가져갈 수 있습니다 그것들을 하나의 색깔로 바꾸십시오 구현을 배치하기에 적합한 후보입니다 그 확장 기능이 무엇인지 이 클래스에 모든 사람이 사용할 수 있도록 자바 언어에서 사용할 수 있습니다 또는 Kotlin 언어

그래서 Core-KTX 10에서는 실제로 해당 ColorUtils에 위임하기 위해 다시 작성되었습니다 따라서 Java 언어 사용자는 해당 기능을 사용합니다 그러나 Kotlin 사용자는 향상된 구문을 사용합니다 그리고 우리가 얘기 한 확장 기능을 살펴 본다면 지금까지, 그들의 몸, 구현 이 함수들 중, 그들은 모두 사소한 것입니다

그들은 대단히 사소하다 그리고 그것은 의도적으로 설계된 것입니다 그리고 이것은 나를 몇 가지 원리를 다루도록합니다 우리는 KTX 확장이 가져야한다고 정의했습니다 따라서이 첫 번째 기능은 기능을 적용하려는 것입니다

그것은 이미 존재합니다 새로운 기능을 추가하려면 그것들은 업스트림으로 리디렉션되어야합니다 그들은 언어 불가지론 자입니다 두 언어 모두 그들을 이용하십시오 이것의 다른 예 – 몇 가지 HTML compat stuff와 path iterator가있었습니다

이후 Core-KTX에서 처음으로 구현 된 코어로 업스트림으로 이동 가능 두 언어로 사용됩니다 이러한 모든 확장에 공통적 인 또 다른 사항 인라인으로 표시되어 있다는 것입니다 우리가 첫 번째 행을 인라인하는 이유는 맨 위에있는 것 – 람다 할당을 피하기 위해서입니다 두 번째의 경우, 우리가 수정 된 제네릭을 사용하고 있기 때문에, 우리는 실제로 컴파일러에 의해 인라인을 사용해야합니다 세 번째, 구성 요소 1, 맨 아래 1 모두 인라인입니다

네가 쓰지 않는 것에 대한 앨리어스 만 확장 기능이없는 경우 우리가 뭔가를 본다면 Core-KTX에는 인라인이 아닙니다이 반복자 확장자가 있습니다 우리가 Kotlin 's for / in을 사용할 수있게 해주는 ViewGroup에 뷰와 ViewGroup을 반복하는 구문 이것은 매우 구체적인 이유로 인라인되지 않습니다

그리고 그것은이 함수의 구현이 익명 클래스를 정의합니다 만약 우리가 이것을 인라인했다면, 당신이 그것을 사용하면 익명의 클래스가 호출 사이트에 정의됩니다 그래서 갑판의 크기, 방법 수, 및 클래스 로딩 우리는 명시 적으로이를 인라인으로 만들지 않습니다 우리는 단일 구현을 모든 발신자가 다시 사용할 수 있습니다

그래서 우리는 인라인이 아닌 확장 기능을 기본값으로 사용합니다 할당 이유 그리고 나는 이것이 정말로 KTX 스타일 확장 만 가능합니다 일반적인 Kotlin 코드에서 이것은 권장하지 않습니다 인라인 기본 설정을 원하지 않습니다

실제로 가지고있는 잠재력이 있기 때문에 긍정적 인 것보다는 당신의 코드에 부정적인 영향 괜찮아 그래서 우리가이 확장을 보여 주었을 때, 나는 인라인 수식어가 사실과 결합 된 방법에 대해 이야기했다 람다가 있다는 것,이 확장을 허용합니다 제로 오버 헤드 추상화

검증 된 경우, 우리는 능력을 얻습니다 더 많은 선언적 버전을 가짐 지정하지 않고도 호출 사이트에서 조회를 수행 할 수 있습니다 콜론 콜론 classjava 패딩을 업데이트하기 위해 기본값을 사용합니다

각 인수를 지정할 필요가 없기 때문에, 인수의 하위 집합을 지정하는 이름 매개 변수 우리는 실제로 제공하고자합니다 구조 조정의 경우에는 멋진 구문을 사용합니다 이를 통해 우리는 컴포넌트 변수를 분리 할 수 ​​있습니다 합성 오브젝트의 이것은 유용합니다 이것은 우리가 가지고있는 사실에 의해 가능합니다

Kotlin에서 연산자 오버로딩 우리는 또한 우리가 어떻게 더하기 색상을 추가 할 수 있었는지에 대해서도 이야기했습니다 이 경우 정적 메서드 확장의 별칭을 지정합니다 이는 발견 가능성을 높이는 데 도움이됩니다 당신이 그렇지 않으면 몰랐을 내장 헬퍼가 존재합니다

그리고 컬렉션과 유사하지만 그렇지 않은 유형의 경우 실제로 컬렉션, 우리는 능력을 가지고 그들을 가상 컬렉션으로 변환 우리는 언어의 용역을 사용할 수 있습니다 마치 실제 컬렉션 인 것처럼 그래서 이들 각각은 매우 Kotlin 특정 언어를 가지고 있습니다 사용하는 기능 그리고 우리는 이러한 모든 확장 기능이 Kotlin 언어의 일부 기능을 활용하도록 정의 자바 호출자에게는 그렇지 않다

우리는 API를 수정하는 것만으로도 확장 기능을 제공하지만 확장 기능을 제공합니다 레버리지를 사용하여 사용하는 것이 더 즐겁다 이러한 Kotlin 관련 기능 승인 우리가 자주 얻는 제안 중 하나 setOnClickListener와 같은 것을 가져 오는 것입니다

확장을 작성하면 Click 또는 OnClick과 같은 것을 사용하여 호출 할 수 있습니다 이것은 호출 코드를 허용합니다 setOnClickListener를 호출 할 필요없이, 클릭의 단축 버전을 얻습니다 이 언어의 기능을 활용하고 있습니까? 글쎄, 우리는 확장 함수를 사용하고 있지만 실제로는 그렇지 않습니다 우리는 단지 짧은 별명을 만들고 있습니다

이 확장 프로그램에서 얻을 수있는 가치는 무엇입니까? 글쎄, 우리는 몇 가지 적은 문자를 입력하고 있습니다 그러나 실제로, 그것은 어쨌든 자동 완성됩니다 그러나 더 나쁜 것은, 우리가 여기서 선례를 세울 것인가 이 확장 기능을 추가하여? 모든 청취자에게이 작업을 수행 할 예정입니까? 그래서 이것이 뭔가 좋은 예입니다 우리는 명시 적으로 KTX 라이브러리에서하고 싶지 않습니다 당신이 그 용어에 익숙하지 않다면, 우리는이 코드를 골프라고 부릅니다

가능한 한 최단의 코드를 만들려는 욕구를 가지십시오 이것은 우리가하고 싶지 않은 것이다 코드를 더 짧게 만들려고 여기에 온 것은 아닙니다 승인 지금은 또 하나의 제안이 있습니다

그리고 나는 사람들이 사용하는 것을 보았다 Android의 경우 다양한 API 레벨로 인해 우리는 아주 자주 당신을 지원해야합니다 SDK int 주변의 IF 검사를 참조하십시오 그래서 이것을 꺼내는 유혹을받을 수 있습니다 확장 기능으로 이것의 조금 더 많은 선언적 버전

비교를 확장 함수로 옮깁니다 인라인 함수이기 때문에 오버 헤드가 없습니다 람다는 마지막 매개 변수입니다 그래서 우리는 멋진 Kotlin 호출을 얻습니다 사이트 구문

그리고 이것은 우리의 IF 진술을 이것으로 변환합니다 자, 이것 자체만으로는 너무 끔찍하지 않습니다 우리는 실제로 어떤 언어 기능도 활용하지 않습니다 다시 말하지만, 마지막 것과 비슷하지만 여전히 별명입니다 하지만 최소한이 점은 조금 더 논쟁 할 수 있습니다

그것의 공로 때문에 그러나 문제가 있습니다 이 두 문장은 동일하지만, 오, 한가지는 최소한 정적 SDK SDK int, 그리고 나서 그들은 조금 더 가깝습니다 이것이 이것이 덜 타당한 이유 중 하나입니다 하지만 한 가지는 IF 문 프로그래밍 언어의 아주 원시적 인 구조입니다

IF 문은 IF 문이 아니기 때문에, ELSE와 같은 구조가 있습니다 요구 사항이 변경되면 어떻게 될까요? 이 두 가지 행동을 바꿔야한다고 다른 버전? 당신이 작성한이 확장 프로그램을 사용했다면, 이 사건을지지하기 위해 IF 문을 사용하여 다시 변경해야합니다 또는 함수를 수정해야하는 경우, 어쩌면 지금은 두 개의 람다가 필요합니다 한 명은 19 세 이상이고 한 명은 사건입니다 네가 아니야 이 함수에서는 두 개의 람다를 사용하지 않기 때문에, 우리는 특별한 후행 람다 구문을 잃어 버렸습니다

이제 우리는 내부적으로 인수로 전달해야합니다 괄호는 이전에 비해 우리는 그렇지 않았습니다 즉각적으로이 확장은 붕괴되기 시작합니다 다른 조건부 분기를 도입하면 어쩌면 API 전반에서 동작을 다르게해야 할 수도 있습니다 세 가지 다른 방법으로 – 글쎄, 우리가 확장 프로그램이이를 가능하게 할 수 있습니다

이 확장에 대해 다른 점은 IF 문과 비교하면 우리가 가정하고있는 것입니다 확인하고 싶은 조건부 보다 크거나 같음 우리가 람다에서 뛰고 싶은 행동, 우리는 단지 19 플러스에서 뛰고 싶습니다 글쎄, 많은 시간, IF 문 중 일부는 – 다시, SDK int -는 작거나 같을 것입니다 그리고 이제는 순서대로 두 번째 확장이 필요합니다 사용 사례를 지원합니다

그래서 이것은 뭔가의 또 다른 예입니다 우리가하려는 게 아니야 우리는 단 한 번의 사용으로 최적화하고 싶지 않습니다 사례 또는 특정 유스 케이스, 확장 만 한 가지 일을 지원합니다 그리고 나서 좀 더 복잡한 것으로 옮겨야 할 때, 당신은 원래의 행동으로 되돌려 야합니다

확장 프로그램을 통해 당신이 필요로하는 모든 것을 표현하기 그것이 존재하지 않는다면 표현할 수 있습니다 승인 지금까지 우리가 얘기해온 모든 확장 기능 Core-KTX 라이브러리에있는 것들이었습니다 나는 많은 연장을 겪고 싶지 않다 이 다른 도서관에 있습니다

다시 한 번 조금씩 발견 할 수있는 방법을 보여 드리겠습니다 하지만 나는 하나를 만지고 싶다 그래서 KTX 단편에는 확장이 있습니다 트랜잭션을 캡슐화합니다 beginTransaction과 commit 함수를 이동합니다

확장 기능으로 호출합니다 우리는 인라인 함수를 사용할 수 있다는 사실을 사용합니다 및 람다를 다시 0 오버 헤드로 변환합니다 맡은 일 우리의 호출 코드는 조금 더 짧아지고, 이제 우리는 람다 본문과 트랜잭션을 사용합니다

조각을 사용했다면 커밋이 유일한 커밋 기능이 아니라는 것을 알아라 실제로는 여러 가지가 있습니다 그래서 우리는 뭔가를함으로써 이것을 모델링 할 수 있습니다 같은 부울을 제공 할 수 있도록 상태 손실을 허용할지 또는 허용하지 않을지 여부 당신이 저지를 때 이것은 수용하기가 정말로 쉽습니다

그러나 그것은 일종의 무언가에 반대한다 나는 이전에 말했어 오, 우리는 이것을 사용할 수 있도록 콜 사이트를 업데이트 할 수 있습니다 내가 앞서 말한 것에 위배된다 구현의 영향을 최소화하는 방법에 대해 이야기했습니다

이러한 확장의 이것은 인라인 함수이기 때문에, 그리고 나서 우리는 이제 인라인 내부에 조건부를 넣습니다 함수, 그 조건부가 인라인되고있다 모든 콜 사이트로 그래서 모든 콜 사이트가 이제 그 내부에 조건부가 있어야합니다 이것은 실제로 나쁜 것입니까? 글쎄, 우리가 바이트 코드를 보면 호출 사이트에서 생성됩니다

우리가 허용 상태 손실을 true로 지정할 때 – 너는 정말로 이해할 필요가 없다 여기에서 무슨 일이 일어나고 있는지 이해하기위한 바이트 코드 기본적으로 세 가지 함수 호출이 있습니다 첫 번째는 beginTransaction입니다 두 번째는 람다 내부에 있던 교체 작업입니다

세 번째 것은 commitAllowingStateLoss에 대한 호출입니다 IF 문은 없습니다 조건부는 없습니다 그리고 이것은 인라인 함수이기 때문에 인수는 부울이므로, 컴파일러는 실제로 컴파일 타임에 가치 그리고 컴파일 시간에 알고 있기 때문에, 그것은 실제로 죽은 코드 제거를 할 수 있습니다

실행될 수없는 분기를 제거하십시오 그리고 실제로 바이트 코드에서, 당신이 그렇지 않으면 쓰려고했던 것과 동등한 것 실제로 커밋 기능이 많이 있습니다 지금 커밋하고 커밋 할 수있는 방법이 있습니다 따라서 우리는 추가 Boolean을 추가하여이를 지원할 수도 있습니다

그리고 똑같은 일이 여기서 일어납니다 이제 그들은 중첩되어 있지만, 데드 코드 제거 단 하나의 기능 만 있도록 결과 바이트 코드를 호출하십시오 승인 이러한 모든 I / O 릴리스의 노력의 일환으로, 우리가 한 일 중 하나 Kotlin 특정 생성을 시작합니다 Android에서 게시하는 라이브러리보기 프레임 워크 자체

그래서 보시다시피 그 파란색 상자에 참조 문서를 방문 할 때, 네가 원한다면 실제로 너에게 물어볼거야 Kotlin 특정 버전의 플랫폼을 보는 방법 또는 Android X 라이브러리 또한 왼쪽 탐색 창에서 아래로 스크롤하면 맨 아래에는 링크도 있습니다 그리고 이것들은 Kotlin의 이러한 라이브러리에 대한 견해입니다 그래서 여러분이 말하길, 조각을 볼 때 패키지를 사용하면 조각에 대한 확장 프로그램을 볼 수 있습니다

문서 안에 있습니다 더 이상 완전히 분리되지 않습니다 한 가지 당장 실종 됐어 우리가 너에게 실제로 말하지 않는다는거야 이것들이 유래 한 인공물의 좌표

곧 올거야 또한 Core-KTX의 확장, 플랫폼 유형을 확장하고 아직 플랫폼 문서에 표시됩니다 그러나 이것은 우리가 원했던 것이다 나가서 일하고 있다는 것을 보여 주려고 그리고 두 가지가 곧 나올 것으로 기대합니다

괜찮아 나는 안드로이드 KTX에 대해 이야기하기 위해왔다 그러나 Kotlin 확장 기능은 없습니다 Android 관련 정보 우리가하고있는 일은 건물 확장입니다

이 도서관을 좀 더 Kotlin에게 친숙하게 만들기 위해 그리고 그것은 모든 도서관이 할 수있는 것입니다 그래서 저는 그 방법들에 대해서 이야기하고 싶습니다 우리는 도서관을 어떻게 더 많이 만들 수 있을지에 대해 생각합니다 Android 라이브러리 모두에 적용되는 Kotlin에 친숙하고, 당신이 쓰고있는 도서관에도 적용됩니다

또는 당신이 사용하고있을 수도 있습니다 도서관을 만드는 첫 번째 방법은 실제로 Kotlin-friendly입니다 Kotlin에서 모든 것을 다시 쓰는 것입니다 분명히 이것은 모든 도서관에서 가능하지 않다 그러나 그것은 확실히 어떤 사람들에게는 선택 사항입니다

앱 전용 비공개 라이브러리 인 경우 귀하의 저장소에 있거나 귀하의 회사 내부에 있습니다 이미 Kotlin을 사용하고 있습니다이 옵션은 실행 가능합니다 그것은, 말하자면 완전히 실용적 인 것처럼 보이지 않습니다 안드로이드 프레임 워크

그리고 나는 우리가 무대에 있다는 것을 확신하지 못한다 안드로이드 X 라이브러리가이를 수행 할 수 있습니다 아마 미래의 안드로이드 X 라이브러리가 Kotlin에 쓰여질 수 있습니다 그럴 가능성이 높습니다 대부분의 것들로 우리가 선택한 것은 무엇입니까? 우리가 출판하는 것은 형제 유물이다

그래서 메인 도서관은 쓰여지고있다 Java 언어를 사용합니다 그리고 우리는 형제 유물로 Kotlin 언어 기능을 제공합니다 이것에 대해 대단한 점은 당신이하지 않는다는 것입니다 소비자에게 Kotlin 표준 라이브러리 강제 적용 그들이 명시 적으로 그것을 원하지 않는 한

확장 프로그램을 관리 할 수 ​​있습니다 API를 보강하는 데 필요한 것이 정확히 무엇인지, Kotlin 특정 기능을 사용할 수 있습니다 이것에 대해 정말 멋진 점은 확장하려는 라이브러리를 제어 할 필요가 없습니다 그래서 도서관을 이용하고 있다면 당신은 그것의 일부를 더 만들고 싶습니다 Kotlin-friendly, 당신은 그것을 할 수 있습니다

자신의 앱에서 또는 라이브러리에 대한 확장 집합을 게시 할 수 있습니다 다른 누군가가 발행하는 그러나 이들이 유일한 두 가지 옵션입니까? 나는 뭔가를보고 싶다 나는 제 3의 약간 잡종의 옵션으로 이끌 것이다라고 생각한다 그리고이 간단한 별칭 확장으로 돌아갑니다 우리는 자바 언어로 정의 된 정적 메서드를 사용했다 Kotlin 언어로 확장 메소드로 바꿨습니다

Java 측에서이 클래스의 구현을 살펴보면, 첫 줄을 포함 시켰습니다 왜냐하면 우리는 즉시 역 참조하는 것을 볼 수있다 우리가 전달하는 논쟁 문자열을 전달하자마자, 최대 문자 수는 얼마입니까? 내가 반복 할 수있는 순서대로 숫자가 있는지 여부를 확인하려면? 따라서 Java API로 Kotlin을 사용한다면, 이 매개 변수가 다음과 같은 것을 알 수 있습니다 플랫폼 유형이라고 불리는 것으로 노출 될 것입니다

null 허용 여부를 알 수 없습니다 그러나 구현을 통해 우리는이 사실을 즉시 알 수 있습니다 메서드는 null 값을 받아 들일 수 없습니다 우리가이 문제를 해결할 수있는 방법 null이 아닌 주석을 추가하는 것입니다 따라서이 주석은 Kotlin 컴파일러에게 알려주는 것입니다

거기에는 제한이있다 특수한 행동이 있다는 것을 계정을 고려해야합니다 아무도 통과하지 못하도록해야합니다 null 가능성이있는 값, 또는 null를이 메소드에 추가합니다 그래서 이것은 Kotlin의 언어 기능을 가능하게합니다

Java에는 단순히 존재하지 않습니다 이제이 시행을 허용 할 도구를 사용할 수 있습니다 Java에서 작동합니다 그러나 언어 자체가 본질적인 것은 아닙니다 그래서 우리가 무효를 위해서 그런 것을 할 수 있다면 – 이 주석을 nullness에 추가 할 수 있으면 Kotlin 컴파일러에게 필요한 것을 알리기 위해 이 메소드를 호출 할 때 동작을 변경하려면, 우리가 다른 것을 위해 이것을 할 수 있습니까? 말하자면,이 정적 메서드를 사용하려면 첫 번째 인수 정말 수신기입니다

그리고 이것이 실제로 확장 기능이 될 때 Kotlin에서 호출? 그리고 이것이 우리로 하여금 잠재적으로, 이것을 명시 적으로 정의 할 필요성을 제거합니다 확장 이 확장은 호출 규칙을 변경하기 위해서만 존재하며, 컴파일러에게 우리가 당신이 그것을 호출하도록 허용하고 싶다는 것을 알리기 위해 다른 방법으로 그리고 지금은, 우리는 이것 만 남았습니다 Kotlin 컴파일러는 주석, 마치 null이 아닌 주석을 본 것처럼, 그것으로부터 무언가를 유추하고 너는 그걸 더 많이 말하는거야

그 언어에 관용적 인 바이트 코드에서, 우리는 그렇지 않으면 쓰려고했던 것을 얻는다 우리는 여전히 static 메소드를 호출합니다 수신기가 첫 번째 인수가됩니다 이 예제는 어떻습니까? 당신이 알아챈 한 가지는 이 확장의 이름은 setPadding이 아니라 updatePadding입니다

이제이 확장을 setPadding이라고 부를 수 있습니다 그러나 문제는 그것이 단지 인수의 하위 집합에 대한 작업 그래서이 경우, 우리는 단지 어디에 왼쪽 및 오른쪽 값을 전달하면 setPadding을 호출 할 수 있습니다 그리고 그것은 잘 작동합니다 그러나 우리가 왼쪽에서 오른쪽으로, 그리고 나서 맨 아래에서 통과한다면, 우리는 네 가지 주장을 제시 할 것입니다

그리고 Kotlin 컴파일러는 실제 패딩 패딩은 네 개의 인수를 받아들입니다 그리고 그것은 진짜 것을 부르는 것을 선호 할 것입니다 그리고 실제 매개 변수에는 명명 된 매개 변수가 없습니다 컴파일 오류가 발생합니다 그것이 바로이 updatePadding의 이름입니다

우리가 진짜 setpadding을 보면 – 4 개의 정수를 취하는 간단한 방법 – 우리가 Kotlin 컴파일러에게 알릴 수 있다면 어떨까요? 이 매개 변수에는 그와 관련된 이름이 있습니까? 자, 매개 변수 이름에서 이것을 추측하는 것이 좋을 것입니다 중복을 지정하지 않아도됩니다 하지만 나는 그것을 주장한다 주석에있는 이들 이름에 대해 명시 적으로 잘 설명합니다 Java 8 바이트 코드에서 실제로 매개 변수 이름을 유지할 수있는 방법입니다

그래서 Kotlin 컴파일러는 이론적으로 그것들을 사용할 수 있습니다 그러나 한 가지 문제는 모든 것이 든 없든 이 행동을 선택해야합니다 갑자기 모든 매개 변수 이름 귀하의 도서관을 가로 질러 돌로 설정되어 있습니다 반면 특수 효과를 사용하면 점진적으로 마이그레이션 할 수있는 기능 따라서 이것은 명명 부분을 해결할 잠재력을 가지고 있습니다

지금, 우리는 Kotlin에서 진짜 방법을 부를 수 있습니다 우리가 원하는 순서대로 4 개의 인수를 지정하면, 우리가 제공하는 이름을 기반으로합니다 기본 값은 어떻습니까? 코 틀린 표정을 지정할 수 있다면 어떨까요? 컴파일러는 컴파일러가 하나는 당신이 공급하지 않았습니까? 이렇게하면 원래의 확장 호출 규칙이 변경됩니다 확장 기능을 호출하는 것에서 실제로 사용하는 것까지 진짜 방법 그런 다음 바이트 코드에서 우리는 우리가 시작한 것, 우리의 명백한 확장 인라인 할 것이다

하지만 지금은 확장이 존재하지 않아도됩니다 특수 효과 형식으로 추가 한 메타 데이터 Kotlin 컴파일러에게 우리에게 우리의 전화 능력을 향상시키고 자했다 이 기능은 코 틀린 특정 방식으로, Kotlin 기능을 활용합니다 그래서 우리는 그렇게 할 수 있습니다 그래서 Kotlin은 KEEP이라고하는이 과정을 가지고 있습니다

Kotlin 진화 및 향상 프로세스입니다 오늘 아침 우리는 이러한 주석을 제안했습니다 KEEP-110으로 이것이 우리가 제안하는 것입니다 Kotlin 컴파일러에 추가하여 이러한 주석을 이해하십시오 우리는 ExtensionFunction과 ExtensionProperty를 가지고 있습니다

정적 메소드 용; 기본값, 매개 변수에 대한 공급 및 기본값을 허용합니다 KtName을 사용하면 메소드, 필드 또는 매개 변수의 대체 이름을 제공합니다 이제는 매우 빠릅니다 이러한 이름은 변경 될 수 있습니다 의미가 변경 될 수 있습니다

이것은 실제로 받아 들여지지 않을 수도 있습니다 Kotlin 컴파일러에 넣습니다 우리는 JetBrains 팀과 협력 해 왔습니다 이것에 대해 꽤 오랫동안 그리고이 중 일부는 이미 프로토 타입 화되어 있습니다

Kotlin 컴파일러 내부 우리는 이것이 이것이 우리가 향상시킬 수있는 방법이라고 생각합니다 Kotlin 발신자 용 Android 프레임 워크, 실제로 Android를 다시 작성하지 않고도 프레임 워크, 또는 적어도 API, Kotlin에서 실행할 수 있는 그리고 이것이 중요한 선택 임에도 불구하고, 실제로 그것을 Kotlin 컴파일러로 만든다고 가정합니다 모든 문제를 완전히 해결하지는 못한다

기존 확장이 해결되고 있음을 KEEP-110에서 제안한 이러한 주석을 결정했습니다 수많은 오픈 소스 라이브러리를 살펴보고, 우리 자신의 도서관을보고, 우리가 가장 유용한 확장이라고 생각했던 것을 보았습니다 자바 메소드의 패턴이 원하는대로 확장으로 변환 될 수 있습니다 그리고 후자의 두 가지는 실제로 보완 적입니다 특수 효과의 큰 장점 당신이 진리의 유일한 원천을 유지한다는 것입니다

당신은 정말로 Kotlin을 알 필요가 없습니다 빌드 시스템에 Kotlin 컴파일러를 추가 할 필요가 없습니다 형제 유물을 게시 할 필요가 없습니다 순수한 자바 라이브러리 일지라도, 이러한 특수 효과를 추가하고 API를 향상시킬 수 있으므로 Kotlin 호출자는 더 관용적 인 구문을 사용합니다 괜찮아

요약하자면, Core-KTX는 이제 Android Jetpack의 일부입니다 Android Jetpack과 함께 출시 된 Android Jetpack으로 버전이 지정되었습니다 화면에 표시되는 것처럼 몇 가지 새로운 아티팩트가 있습니다 확실히 더 많은 것이 있습니다 우리가 생각하는 주목할만한 것들 조각 및보기 모델입니다

그래서 나는 유물을보고 놀랄 것입니다 앞으로 몇 개월 안에 Kotlin 버전을 확인하십시오 참조 문서의 이것은 매우 빠릅니다 이것은 [? 도카?] 우리가 어떻게 문서를 생산하는지 그래서 우리는 단지 거기에 나가서 당신을 미리보기로 보여주고 싶었습니다

이것은 분명히 적극적으로 노력하고 있습니다 Android 버그에 새로운 구성 요소가 있습니다 안드로이드 KTX에 대한 추적기 Core-KTX와 모든 KTX 라이브러리 진실의 원천 인 제트 팩의 일부가되었습니다 Android 지원 리포지토리로 이동했습니다

GitHub 문제를 GitHub로 마이그레이션 할 것입니다 앞으로 몇 주 안에이 버그 트래커에 프로젝트를 맡기십시오 하지만 우리는 여전히 GitHub 레포에 대한 요청을 받아 들일 것입니다 GitHub 저장소로 다시 동기화합니다 문제가 더 이상 나타나지 않을 것입니다

GitHub에서 진실의 근원 Android 버그 추적기에 표시됩니다 [? KEEP?]이 제안되었습니다 한 시간 전에 풀 요청을 만들었습니다 가서 확인해 봐

이 문서에는 예제에 대해 더 자세히 설명되어 있습니다 그리고 내가 말했듯이, 선택된 주석 우리가 가장 큰 영향을 줄 것이라고 생각하는 것들이었습니다 그러나 문서의 맨 아래에, 당신은 그것을 볼 것입니다, 만약 이와 같은 것이 받아 들여지면, 미래의 더 많은 향상을위한 잠재력이 있습니다 그 링크가 이것이어야합니다 어제 밤 제가 제출하기 전에이 링크를 만들었어요

잘하면, 정확합니다 그리고 그게 다야 고맙습니다 [박수 갈채] [음악 재생]

Test-Driven Development on Android with the Android Testing Support Library (Google I/O ’17)

[음악 재생] JONATHAN GERRISH : 안녕하세요 오늘 아침 테스트 중심 개발에 오신 것을 환영합니다

Android 플랫폼 용 내 이름은 Jonathan Gerrish이며 모바일 닌자의 일부입니다 Google은 Google 내에서 소규모 팀입니다 소프트웨어 테스팅에 열정적입니다 청중에게 손을 빨리 보여줄 수 있습니까? 실제로 얼마나 많은 사람들이 테스트를 작성하고 있습니까? 일반적인 소프트웨어 개발 연습의 일환으로? 환상적입니다

승인 따라서 이전에 Android 용 테스트를 작성했다면, 아마도 우리 도구 중 일부를 사용했을 것입니다 우리는 Android 테스팅 지원 라이브러리를 개발했습니다 테스트 러너 용 JUnit 및 규칙, 에스프레소 UI 테스트 프레임 워크, 우리는 또한 적극적으로 기여합니다 Roboelectric, 오픈 소스 안드로이드 유닛 테스트 프레임 워크

그래서 모두가 테스트를 작성하라고 말하고 있습니다 그러나 당신은 왜 그것을 정말로해야합니까? 테스트를 작성하는 데 시간이 걸리는 것은 사실입니다 그들은 코드 기반에 코드를 추가하고 있습니다 그리고 아마도 당신은이 상황에 처했을 것입니다 전에 귀하의 관리자 또는 고객이 귀하에게 그들이 당신을 늦추고 있다고

그러나 테스트를 작성해야하는 많은 이유가 있습니다 테스트를 통해 장애에 대한 신속한 피드백을 얻을 수 있습니다 따라서 개발 초기에 발견 된 오류 사이클은 생존 한 것보다 해결하기가 훨씬 쉽습니다 둘째, 테스트는 안전망을 제공합니다 훌륭한 일련의 테스트를 통해 리팩토링하고, 정리하고, 최적화 할 수 있습니다

당신의 코드, 당신이 가지 않을 것이라는 지식에서 안전함 기존 행동을 어기는 것 테스트는 실제로 지속 가능한 소프트웨어의 백본입니다 개발 안정된 속도를 유지할 수 있습니다 프로젝트의 평생 동안, 그리고 당신은 위기의 붐 – 파산 사이클을 피하려고합니다

특징 시간 및 기술적 빚의 집합 따라서 소프트웨어 테스트에는 개념이 존재합니다 테스트 피라미드의 그리고 이것은 많은 층들로 이루어져 있습니다 그리고 각 계층은 당신이 가지고있는 트레이드 오프를 가져옵니다 무게를 달아야 할 것입니다

가장 낮은 계층에는 작은 테스트 또는 단위 테스트가 있습니다 그리고 이것들은 매우 빠르고 집중적 일 필요가 있습니다 그렇기 때문에 이러한 종류의 테스트를 실행하는 것이 좋습니다 로컬 단위 테스트라고합니다 그리고 이것들은 로컬 데스크탑 컴퓨터에서 실행될 것입니다

이런 종류의 테스트를 통해 얻는 트레이드 오프 네가 뛰지 않아서 불륜이야 현실적인 환경에서 당신은 아마도 많은 가짜와 가짜로 우리가 피라미드 위로 올라감에 따라, 이제 우리는 통합 테스팅 및 엔드 – 투 – 엔드 테스팅의 영역으로 그리고 이런 종류의 테스트를하는 열쇠는 충실 함을 가져 오는 것입니다 그래서 우리는 당신이 실제 장치 또는 에뮬레이터에서의 이러한 종류의 테스트 이것들은 다음과 같은 종류의 테스트입니다 귀하의 소프트웨어가 실제로 작동한다고 당신에게 말할 것입니다

그러나 초점이 덜하므로 실패 이런 종류의 테스트 중 하나에서 조금 더 오래 걸릴 수 있습니다 단위 테스트에서 추적하는 것보다 추적하는 것이 좋습니다 그리고 당신이 만드는 큰 트레이드 오프 중 하나 테스트 실행 속도에 있습니다 여러 구성 요소를 조합하기 때문에, 그들은 모두 만들어 져야하고 포장되어야합니다 테스트가 실행되는 장치로 보내지며, 결과는 다시 수집됩니다

그건 여분의 시간이 걸릴거야 이 테스트 피라미드에는 단일 레이어가 없습니다 그걸로 충분할 수 있습니다 그래서 당신이해야 할 일 각기 다른 계층의 테스트를 혼합하는 것입니다 하나의 카테고리의 강점을 활용 다른 회사의 장단점을 없앤다

여기에 진짜 어렵고 빠른 규칙은 없습니다 그러나 Google 자체 테스트 전문가 엄지의 70-20-10 규칙을 추천하십시오 중소형 테스트와 중형 테스트의 비율로 나타냅니다 우리의 워크 플로우를 살펴 보겠습니다 따라서 테스트 중심 개발을 통해 아이디어 시험을 치르기 시작하면 그런 다음 테스트를 통과시키는 코드를 구현합니다 테스트가 녹색이면 제출할 수 있습니다

다시 한 번 손을 보여줍니다 거기 밖으로 누구가 그들의 코드를 시운전했는지, 과거에 테스트 주도 개발을 시도 했습니까? 승인 시원한 우리는 테스트 중심 개발을 좋아합니다 응용 프로그램의 디자인에 대해 생각하게합니다

API에 대한 적절한 고려 사항 제공 및 코드의 구조 테스트 중심 개발을 통해 또한 코드 작성이 적어지기 때문에 테스트를 만족시키는 데 필요한 코드를 작성하십시오 이렇게하면 일찍하고 자주 발표 할 수 있습니다 네가 끊임없이 초록색 인 것처럼 순간에 작동하는 애플리케이션을 배치 할 수 있어야한다 주의

테스트 피라미드를 따르고 있다면, 워크 플로우는 다음과 같이 보입니다 우선, 우리는 더 큰 외부 반복을 가진다 그것은 기능 개발과 관련이 있습니다 여기에서는 UI 테스트에 의해 주도되며, 만트라 테스트 중심 개발은 Red, Green, Refactor입니다 우리는 실패한 시험으로 시작합니다

테스트 통과를위한 코드를 구현합니다 그런 다음 리팩토링합니다 더 큰 반복 내부에는 시리즈가 있습니다 더 작은 반복의 단위 테스트와 관련있다 여기, 필요한 유닛을 구축하고 있습니다

기능을 통과 시키십시오 그리고 다시, 당신은 여기에 같은 진언을 사용합니다 빨강, 녹색, 리펙터 빨강, 녹색, 리펙터 예제 애플리케이션을 살펴 보겠습니다

오늘 구현할 기능 샘플 메모 작성 응용 프로그램에 메모 추가 흐름입니다 우리가 목업을 들여다 보면, 노트 목록 화면에서 시작한다는 것을 알 수 있습니다 기존 음표가 가득합니다 아래쪽에는 플로팅 액션 버튼이 있습니다 사용자가 이것을 클릭하면 새로운 메모 추가 화면에 표시됩니다

여기에서 메모의 제목과 설명을 입력 할 수 있습니다 저장을 클릭하십시오 메모는 지속 된 다음 그들은 그들의 노트 목록 화면으로 돌아갈 것이고, 새로 추가 한 쪽지를 볼 수있는 곳, 이전에 존재했던 다른 모든 음표와 함께 잠시 동안 우리의 워크 플로우로 돌아와서, 실패한 UI 테스트부터 시작한다는 것을 기억하십시오 그럼이 테스트가 에스프레소를 어떻게 사용하는지 살펴 보겠습니다

UI 테스트 프레임 워크 첫 번째 단계는 Add Add (메모 추가) 버튼을 클릭하는 것입니다 그런 다음 제목과 설명을 입력하고 저장을 클릭합니다 메모 목록 화면으로 돌아갑니다 여기서 우리는 단지 우리가 추가 실제로 나타납니다

이제 테스트 중심 개발을 통해, 우리는 아직 코드를 구현하지 않을 것입니다 우리가해야 할 일은 충분히 구현하는 것입니다 우리의 테스트의 명세를 만족시키기 위해 그래서 빈 활동과 우리가 필요로하는 자원들, 충분할 것이다 일단 테스트가 끝나면 테스트를 진행할 수 있습니다 우리는 실패 할 것입니다

이제이 기능을 구현해야합니다 따라서 응용 프로그램은 많은 작은 단위로 구성됩니다 이들은 작고 집중력이 뛰어난 특수 구성 요소입니다 그것은 한 가지 일을 잘 수행합니다 이 작은 단위의 컬렉션은 다음과 같습니다

공동 작업을 통해 우리의 특징을 만족시킨다 잠시 시간을내어 좋은 단위 테스트를 만들어라 정상적인 상태뿐만 아니라, 실패 조건을 테스트하고 싶습니다 유효하지 않습니다 입력 및 경계 조건

당신은 많은 단위 테스트를 작성하게 될 것입니다 단위 테스트는 항상 매번 동일한 결과를 제공해야합니다 변화 할 수있는 것에 의존하지 마십시오 예를 들어, 외부 서버 또는 현재 시간 – 이것은 당신의 단위 테스트에 박편을 가져올 것이기 때문입니다 단위 테스트는 코드의 특정 측면을 실행해야합니다

한 번에 단위 테스트의 실패를보고 싶습니다 매우 신속하게 코드의 자연 버그로 연결됩니다 단위 테스트를 작성할 때 실제 구현에 너무 많은 가정을하고있다 귀하의 코드입니다

당신은 당신의 단위 테스트가 행동을 테스트하기를 원합니다 그렇게하면 테스트를 다시 작성하지 않아도됩니다 구현이 변할 때 단위 테스트의 가장 중요한 측면 중 하나 그들은 당신이 빠르기 때문에 빨리해야합니다 TDD 워크 플로 동안 많은 것을 작성하고 그들도 빠르게 네가 낙심한다면 그것은 끔찍할 것이다 테스트 작성 또는 코드 리팩토링 그 검사의 실행 시간에 통증이 있습니다

그리고 마지막으로 단위 테스트는 훌륭한 출처입니다 문서화와 끊임없는 방식 코드가 바뀌면서 진화하고, 시간이 지남에 따라 정체 될 정적 문서와는 다릅니다 Add Add 활동에 대한 단원 테스트를 해보겠습니다 이 활동은 사용자 입력을 받아 들일 것입니다 그리고 나서 우리는 그것을 지속 할 것입니다

장치의 로컬 저장소에 저장합니다 승인 이제 우리는 Add Note 액티비티 클래스를 만들 것입니다 Android 프레임 워크 인 Activity가 확장됩니다 수업

그것은 레이아웃과 함께 팽창 될 전망을 가지고 있습니다 사용자가 여기에 데이터를 입력합니다 그리고 나서 우리는 그 메모를 안드로이드에 보관할 것입니다 SharedPreferences 메커니즘 우리의 어플리케이션이 진화함에 따라, 그래서 우리의 요구 사항을 않았다

아마도 스토리지 요구 사항 노트를 클라우드 저장소에 저장하도록 발전 우리는 일종의 동기화 메커니즘을 구축해야합니다 오프라인 사용 사례의 로컬 저장소 이 경우에는 추상화의 기회가 있습니다 우리는이 예에서 우리가 노트 저장소를 추출 할 수 있습니다 그러나 테스트 중심 개발의 핵심 측면 중 하나 우리는 가장 간단한 경우를 먼저 작성하는 것부터 시작합니다 그런 다음 반복합니다

그래서 우리는 이것을 일찍하는 유혹에 저항 할 것입니다 이상화 된 단위가 무엇인지에 대한 샘플을 살펴 보겠습니다 테스트는 비슷할 것입니다 일반적으로 3 단계로 구성됩니다 첫 번째 단계는 설정 중입니다

시험 조건, 그리고 환경 준비, 의존성을 필요한 상태로 설정하고, 입력 데이터를 준비합니다 다음으로, 테스트 할 코드를 마지막으로 실행하기 전에, 결과 또는 국가에 단언을합니다 나는이 세 가지를 명확하게 구분하고 싶다 시험 단계와 각 시험의 관련 측면 가져 오기 프론트와 센터는 정말 읽을 수있는 테스트를 만들어줍니다 지금까지 안드로이드 플랫폼으로, 당신은 다음을 사용하여 단위 테스트를 작성하고 있습니다

조롱과 조롱하는 조롱 라이브러리 (예 : Marketo) 그리고 예제를 보자 Marketo로 작성된 테스트 승인 와우 그것은 많은 코드입니다 승인

그래서 우리는 Android와 너무 많은 상호 작용이 있기 때문에 프레임 워크를 제공해야합니다 그저 모든 것을 위해 스터 빙하는 행동만으로 우리 테스트의 실행 경로를 만족시키기 위해서입니다 게다가 Android는 많은 정적 메소드를 사용하기 때문에, 우리는 두 번째 조롱을 소개해야합니다 라이브러리, PowerMock, 처리 할 우리를위한이 특별한 경우 그리고 여기에도 꽤 나쁜 코드 [INAUDIBLE]가 있습니다

한 번 보자 알다시피, 우리는 테스트 활동에 대해 스파이를해야합니다 행동을 수정하려면이 작업을 수행해야합니다 그리고 그걸 밖으로 stubbing 몇 가지 작전을 제공합니다 따라서 우리는 블랙 박스 테스팅의 영역을 벗어나고 있습니다

이리 마지막으로, 결국 우리는 구현 세부 사항에 대한 단언 그리고 이러한 변화가 일어나면 우리의 시험도 바뀔 필요가 있습니다 좋은 단위의 특성을 기억하십시오 테스트,이 특정 테스트에 점수를 매기는 시간을 갖자

그것이 매우 집중된 동안, 우리는 단지 Add Notes 플로우의 행복한 경로 테스트, 로컬 JVM에서 실행되기 때문에 확실히 빠릅니다 그러나 우리는 오히려 많은 것을 만들고있었습니다 이 테스트의 구현에 대한 가정 그리고 이것으로 우리 구현이 바뀌면, 우리가 다시 쓸 필요가있을거야 그 테스트는 실질적으로 그리고 마지막으로, 과도한 보일러 판 stubbing 정말 혼란 스럽네

핵심 측면에서 혼란 스러워요 시험 조건, 시험 조건 당신이 문서화하려고하는 것 그럼 다행히도 도움이되는 도구가 있습니다 이러한 문제 중 일부를 해결하십시오 Robotive 소개

Roboelectric은 안드로이드 유닛 테스트입니다 우리가 적극적으로 기여하고있는 오픈 소스 툴 그리고 어떻게하면 Roboelectric으로 훌륭한 테스트를 작성할 수 있습니다 나는 너를 크리스천 윌리엄스에게 넘기겠다 Roboelectric의 원작자 [박수 갈채] 크리스티안 윌리엄스 : 고마워요, 조나단

너무나 많은 사람들이 Android 테스트 및 TDD 네, 로보 젂은이 끔찍한 작은 오픈 소스입니다 내가 해킹을 시작한 프로젝트 안드로이드 테스팅 초기 내가 배치하는데 얼마나 오래 짜증나는지 알기 때문에 에뮬레이터에서 테스트를 실행합니다 그리고 그것은 부차적 인 프로젝트였습니다 작년까지 다른 사람들의 무리의 나는 친구 인 조나단 (Jonathan)과 구글의 합류 특권을 가졌으며, 그는 이미 Roboelectric을 개선하기 위해 일하고있었습니다 Google 자체 테스트 스위트 그 이후로 우리는 로보 젂을 정말로 강화 해 왔습니다 오픈 소스 프로젝트에 다시 기여할 수 있습니다

오늘날 로보 젂은 공식적으로 지원되는 부분이 아닙니다 안드로이드 테스트 플랫폼의 그것이 올바르게 사용될 때, 그것은 당신의 테스트 전략에서 정말로 유용한 부분이 될 수 있습니다 그리고 저는 여러분에게 어떻게 당신도 그렇게 할 수 있습니다 노트 단위 테스트로 돌아가 보겠습니다 우리가 Roboelectric으로 어떻게 접근 할 수 있는지보십시오

Roboelectric은 로컬 단위 테스트로 실행되므로, 그것은 여전히 ​​당신의 워크 스테이션에서 돌아가고있을 것입니다 에뮬레이터가 아닙니다 그러나 Roboelectric은 작은 Android 샌드 박스를 제공합니다 테스트 옆에서 실제 SDK 코드가 실행되는 곳을 선택합니다 당신은 귀하의 활동, 귀하의 레이아웃, 보기 및 자원

그리고 일반적으로 대부분의 Android 메소드를 호출 할 수 있습니다 그리고 그들은 당신이 기대하는 것처럼 일할 것입니다 Android 프레임 워크의 일부가 있습니다 네이티브 코드 또는 집단 하드웨어에 의존하거나 상호 작용하는 외부 시스템 서비스 Roboelectric은 일종의 테스트 수염을 제공합니다

우리는 그림자라고 부릅니다 그리고 그것들은 대안적인 한계를 제공합니다 단위 테스트에 적합한 코드의 우리가 방금 본 코드에는 20 줄의 코드가 있었지만, 모의 설정 코드에요? Robotive에서 어떻게 보일지 봅시다 그것은 훨씬 적습니다 우리는 모든 상용구를 없앴습니다

테스트의 크기는 약 절반이며 훨씬 간결합니다 우리는 구현 세부 사항에 대해 생각하지 않아도됩니다 우리가 테스트를 작성하는 동안, 그것은 아주 좋습니다 Roboelectric이 응용 프로그램을 설정합니다 당신의 매니 페스트에 따르면

우리가 활동을 시작하라고 요구한다면, 적절한 라이프 사이클을 거치며 실행됩니다 그것을 올바른 상태로 만들 수 있습니다 조회수를 늘리고 기기에서 기대하는 모든 것을 제공합니다 사용자가 기기를 사용하는 것처럼 상호 작용할 수 있습니다 그래서 일부 필드에 텍스트를 추가하고 클릭하십시오

저장소에 메모를 추가한다고 주장합니다 자, 우리가 실제로 우리가 처음에 쓴 UI 테스트까지 올라간다 우리는 새로운 메모가 보기 화면에 나타납니다 그것은 다른 단위 테스트의 일이 될 것입니다 이제 Roboelectric의 그림자에 대해 언급했습니다

그들은 실제로 확장 된 테스트를 제공합니다 Android 클래스에 대한 API 내부 상태를 쿼리하고 때때로 변경합니다 그들의 행동 이 예에서 우리는 응용 프로그램에 어떤 활동이 의도가 테스트 도중 시작되었습니다 우리는 저것을 주장하기 위해 사용할 수 있습니다

저장소에 메모, 우리는 View Notes 활동으로 이동합니다 유사한 테스트 API가 하드웨어 응답 시뮬레이트를 위해 존재합니다 또는 외부 서비스, 그런 것들 이 시점에서 우리는 실패한 단위 테스트를 가지고 있습니다 그리고 이제 우리는

우리는 생산 코드를 작성하면서 쉬운 부분을 준비했습니다 TDD의 정신으로 우리는 테스트 패스를 작성하는 데 필요한만큼 정확하게 작성할 수 있습니다 더 이상, 추측 코딩이 없습니다

그래서 우리는 레이아웃을 팽창시키고, 클릭 핸들러를 부착하고, 클릭이 발생하면 메모가 사라집니다 저장소에 추가하십시오 이제 우리는 테스트를 실행할 수 있습니다 우리가 코드를 개선 할 수 있다면, 우리는 돌아가서 리팩토링을 할 것이고 우리는 반복 할 것입니다 이것은 당신이 철저하게하는 곳입니다

그리고 Robotive는 이것을 위해 매우 편리합니다 그것은 당신에게 좋은, 빠른 시운전을 제공하기 때문입니다 당신은 편한 사이클을 시작할 수 있습니다 우리는 단지 행복의 길을 시험하지 않고 싶습니다 우리 코드의 모든 다른 경우를 테스트 할 것입니다

마주 칠 가능성이있다 예를 들어, 입력 검증 및 외부 조건 네트워크가 다운되는 것과 같은 일이 일어나는 것처럼 말입니다 로봇 전기는 또한 장치 조건을 시뮬레이션하는 데 도움을 줄 수 있습니다 당신이 마주 치게 될 것입니다 예를 들어 한정자를 지정할 수 있습니다

테스트는 함께 실행되어야합니다 여기서 우리는 특정 화면 크기와 방향을 말하고 있습니다 레이아웃을 약간 바꿀 수도 있습니다 Roboelectric에 특정 SDK에서 테스트를 실행하도록 요청할 수 있습니다 그래서 우리는 여기서 Jelly Bean을 말할 것입니다

그리고 실제로는 해당 버전의 SDK 코드를 사용합니다 그리고 당신은 또한 Roboelectric, 모든 SDK에서이 테스트를 실행하고 싶습니다 당신이 지원하거나, 그들 중 일부 범위 당신이 관심을 갖고있는 그리고 지금 O를 통해 Jelly Bean을 지원합니다 Google에서는 Roboelectric에 크게 의존합니다 우리는 더 나은 투자에 투자하고 있습니다

우리는 수십 개의 앱을 보유하고 있습니다 이것들은 수십만 가지가있다 내부에서 실행되는 단위 테스트 따라서 전투 테스트가 잘되었습니다 또한 최근 Android CTS를 실행하기 시작했습니다 Roboelectric에 대한 공식 안드로이드 테스트 모음입니다

그리고 우리는 지금 70 % 가량 나아지고 있습니다 매 릴리스마다 그래서 과거에 로보 틱을 사용했다면 그리고 그것이 짧다고 생각했습니다 또는 이전 버전에 머물렀다면, 나는 당신이 최신 정보를 얻을 것을 분명히 권한다 왜냐하면 그것은 먼 길을 왔기 때문입니다

우리는 마찰을 줄이기 위해 노력해 왔습니다 Roboelectric을 Android 툴 체인과 통합합니다 Gradle과 함께 Android Studio에서 매우 잘 작동합니다 Google의 자체 공개 소스 인 Bazel에 대한 지원도 제공됩니다 조만간 시스템을 구축하십시오

Roboelectric은 하나의 크기에 맞는 테스트 도구가 아닙니다 빠르지 만 Android와 100 % 동일하지는 않습니다 모든면에서, 당신은 현명하게 그것을 사용하고 싶습니다 전에 말했듯이, 링크 된 단위 테스트를 작성하지 마십시오 함께 여러 활동

그것은 단위 테스트가 아닙니다 에스프레소에게는 훨씬 좋습니다 여러 스레드를 처리하는 경우, 동기화 문제, 같은 것들 그것도 아마 단위 테스트를 작성하지 않았을 것입니다 전기에 좋다 특히 Roboelectric을 사용하지 마십시오

Android API 및 사물과의 통합을 테스트하는 방법 Google Play 서비스와 같은 당신은 당신에게 더 높은 수준의 테스트를 제공해야합니다 그것이 작동하고 있다는 자신감 이제 우리는 지나가는 단위 테스트를 얻었습니다 너를 내 동료 스테판에게 넘겨 줄거야 더 높은 수준의 테스트에 대해 이야기하기

[박수 갈채] 고마워, 크리스천 개발자 워크 플로 다이어그램으로 돌아가 보겠습니다 이 시점에서, 우리는 단위 테스트 톤을 가지길 바랍니다 그들은 우리의 모든 비즈니스 로직을 철저히 테스트합니다 하지만 기어를 바꿔 실제로 어떻게 할 수 있는지 알아 봅시다

일부 통합 테스트를 작성하여 이러한 단위가 통합되는 방식을 확인하고, 실제로 Android와 어떻게 통합되는지 실제 환경에서 어떻게 작동하는지 설명합니다 Android에서 이러한 테스트는 일반적으로 참조됩니다 계측 테스트 그리고 저는 여러분 대부분이 계측을 작성했음을 확신합니다 전에 테스트해라

그리고 비록 그들이 표면에 슈퍼 간단하게 보이지만, 두포의 밑에 실제로 많은 것이 계속하고있다, 당신이 그것에 대해 생각한다면 코드를 컴파일해야합니다 당신의 자원을 처리해야합니다 전체 시스템 이미지를 가져온 다음 테스트를 실행해야합니다 그리고 다양한 수준으로 진행되는 많은 것들이 있습니다

안드로이드 스택의 따라서이 테스트는 높은 충실도를 제공합니다 그러나 요한이 언급 할 때, 그들은 비용으로, 그들은 느린입니다 때때로, 그들은 단위 테스트보다 더 편찮습니다 그럼 실제로 어떻게 작동하는지 보겠습니다 일상적인 개발 과정에서 Android Studio라고 가정 해 보겠습니다

방금 새 에스프레소 테스트를 작성했습니다 실행 버튼을 눌러 테스트를 실행합니다 Android Studio에서 가장 먼저 할 일은 당신을 위해 두 개의 APK를 설치하려고합니다 테스트는 APK와 앱을 테스트합니다 이제 APK 테스트에는 Android JUnit Runner, 그것은 테스트 케이스와 테스트 매니페스트를 포함합니다

그런 다음 테스트를 실행하려면 안드로이드 스튜디오는 ADB Shell AM Instrument를 호출합니다 그런 다음 Android JUnit Runner는 계측 도구를 사용합니다 테스트 할 때 앱을 제어 할 수 있습니다 계측이란 무엇입니까? 나는 너희들이 이것을 알아 차렸을지도 모른다라고 생각한다 매니페스트의 최상위 태그이며 그 이유는 무엇입니까? 계측은 실제로 무엇인가입니다

그것은 안드로이드 프레임 워크 내부 깊숙이 사용됩니다 활동의 라이프 사이클을 제어하는 ​​데 사용됩니다 예를 들면 그래서 당신이 그것에 대해 생각한다면 그것은 완벽한 가로 채기 지점입니다 우리는 테스트 주자를 투입하는데 사용할 수 있습니다

그래서 Android JUnit Runner는 그다지 많지 않습니다 계측보다 조금 더 깊이 들어가 보자 Android Studio가 실제로 테스트를 실행하면 어떻게됩니까? ADB Shell AM Instrument를 실행합니다 활동 관리자에게 전화를 겁니다

그런 다음 활동 관리자는 한 번에 전화를 걸어 onCreate하여 계측하십시오 이제 Android JUnit Runner가 우리의 장비는,이 시점에서, 그것은 runner에서 onCreate를 호출합니다 그러면 주자가 당신을 위해 몇 가지 일을 할 것입니다 모든 검사를 수집 할 것입니다 그런 다음이 모든 테스트를 순차적으로 실행하게됩니다

그런 다음 결과를보고합니다 여기서 주목해야 할 것은 Android JUnit 러너 – 너는 이것을 눈치 채 셨을지도 모른다 응용 프로그램과 동일한 프로세스에서 실행됩니다 그리고 더 중요한 것은, 평소에 Android JUnit Runner를 사용하면 모든 테스트가 실행됩니다 하나의 단일 계기 호출에서

Android JUnit 러너는 Google 내부에서 많이 사용됩니다 매월 수십억 개의 테스트를 실시합니다 Android JUnit 러너를 사용합니다 그렇게하면서 우리는 직면 한 몇 가지 문제를 발견했습니다 우리가 해결해야만하는 것이 었습니다

우리가 많이 볼 수있는 한 가지는 공유 상태입니다 그리고 나는 그런 종류의 공유 ​​된 국가에 관해 말하는 것이 아닙니다 당신이 통제하고 당신이 당신의 앱에 코드를 넣었다 저는 메모리에 축적 된 공유 상태에 대해 말하고 있습니다 디스크에 빌드하고 테스트가 실패하게 만듭니다

이유가 없거나 예기치 않은 상황이 아닐 수도 있습니다 그리고 이것은 다른 것들 사이에서, 어느 시점에서, 충돌로 이어집니다 그러나 방금 전에 보여 드린 이전 모듈에서, 테스트 중 하나가 계측기에 충돌하는 경우, 그것으로 전체 애플 리케이션 프로세스를 취할 것입니다 모든 후속 테스트는 더 이상 실행되지 않습니다 그리고 이것은 분명히 큰 테스트 스위트에 대한 문제입니다 마찬가지로, 디버깅에 대해 생각한다면, 한 번의 호출로 수천 개의 테스트를 실행하면, 너의 자물쇠 머리에 대해 생각 해봐

디버깅을 위해 진행해야 할 때처럼 보일 것입니다 그래서 Google 내부에서 다른 접근 방식을 취했다 Google 내부에서 모든 테스트 방법 자체 계측 및 위치에서 실행됩니다 자, 오늘 할 수 있겠지? 여러 번의 ADB 호출을 할 수 있습니다 러너 호를 사용하고 사용자 정의 스크립트를 유지 관리 할 수 ​​있습니다

그러나 문제는 실제로는 그렇지 않을 수도 있다는 것입니다 개발 환경과 잘 통합하십시오 그래서 오늘 Android Test를 발표하게 된 것을 기쁘게 생각합니다 오케 스트레이터 그리고 Android Test Orchestrator Google에서와 마찬가지로 테스트를 실행할 수있는 방법입니다

백그라운드에서 실행되는 서비스 APK입니다 단일 계측 호출로 테스트를 실행합니다 그리고 이것은 명백하게 이익을 얻습니다 더 이상 공유 된 상태가 없습니다 실제로 Android Test Orchestrator 테스트를 실행하기 전에 PM을 실행합니다

따라서 충돌이 완전히 격리되었습니다 우리는 단일 계기 호출을하기 때문에 충돌이 발생하면 모든 후속 테스트 여전히 실행됩니다 마찬가지로 디버깅을 위해 모든 디버깅 정보 너가 장치를 모으고 떼어내는 이제 특정 테스트의 범위가 지정됩니다 이것은 훌륭하며 Google 내부에서 많은 이점을 얻습니다

그것이 실제로 어떻게 작동하는지 봅시다 테스트 APK 설치 및 테스트에 더하여, 이제 우리 장치에 세 번째 APK를 설치합니다 APK 백그라운드에서 실행중인 서비스입니다 오케 스트레이터 그런 다음 여러 개의 ATB 명령을 실행하는 대신, 우리는 하나의 ATB 명령을 실행합니다 그러나 우리는 테스트중인 앱을 설치하지 않습니다

우리는 오케 스트레이터를 직접 조작합니다 그리고 나서 오케스트라가 가고 있습니다 장치에서 모든 작업을 수행 할 수 있습니다 따라서 Android JUnit Runner를 사용하여 당신의 테스트,하지만 그때는 계속 될 것입니다 각 테스트는 자체 호출로 수행됩니다

그리고 그것은 놀랍습니다 그리고 저는 여러분이 이것을 많이 좋아할 것이라고 확신합니다 그리고 다음 Android 테스팅 지원에서 사용할 수 있습니다 라이브러리 릴리스 더 중요한 것은, 우리는 Android Studio를 사용합니다

Gradle에서 사용할 수 있으며 Firebase Test와의 통합 올해 말에 실험실에 올거야 이제 우리는 테스트를 수행하는 방법을 알고 있으므로, 실제로 이러한 통합을 작성하는 방법을 살펴 보겠습니다 테스트 그리고 대개 Android에서 [INAUDIBLE] 테스트를 작성하면 당신은 에스프레소 테스트 프레임 워크를 사용하고 있습니다 아시다시피 에스프레소에는 이처럼 단순하고 간단한 API가 있습니다

그리고 실제로는 꽤 간단합니다 그것이하는 일은 뷰 매처를 제공하는 것입니다 우리는 계층 구조에서 해당 일치 자와 일치합니다 그런 다음 뷰 작업을 수행합니다 또는 뷰 어설 션을 확인하십시오

이 API는 매우 간단하기 때문에, 빠른 TDD 프로토 타이핑을위한 완벽한 도구이기도합니다 UI 테스트 중 그러나 당신에게 그러한 간단한 API를 제공하기 위해, 후드 아래로 갈 필요가 많은 것들이 있습니다 그럼 실제로 에스프레소가 어떻게 작동하는지 살펴 보겠습니다 따라서 onView를 호출하고 우리에게 당신의 일치자를 주면, 우리가 할 첫 번째 일은 우리는 당신을 위해 뷰 인터랙션을 만들 것입니다

그리고 나서 다음 단계는 우리가 앱이 공회전 상태, 정상 상태 임 우리가 그것과 상호 작용할 준비가되기 전에 그리고 당신은 그것을 생각할 수 있습니다, 이것은 에스프레소의 핵심입니다 Espresso는 동기화 보증으로 잘 알려져 있습니다 그리고 우리가하는 일은 우리가 메시지를 반복하는 것입니다 메시지가 없을 때까지 큐에 넣다

합리적인 시간 동안 우리는 귀하의 모든 유휴 자원을 살펴 봅니다 그들이 유휴 상태인지 확인하십시오 또한 비동기 작업을 확인하여 실행중인 백그라운드 작업 없음 앱이 제정신이고 안정된 상태에 있고 우리는 상호 작용할 준비가되어 있습니다

우리는 계속 전진 할 것입니다 그런 다음 뷰 계층 구조를 탐색합니다 그리고 당신의 일치하는 사람과 일치하는보기를 찾으십시오 일단 우리가 견해를 갖게되면 우리는 뷰 동작 또는 뷰 어설 션을 수행 할 것입니다 그리고 이것은 위대합니다

이제 다시 테스트에 돌입니다 우리가 처음에 보여준 것 에스프레소가 어떻게 작동하는지 이제 알게되었습니다 그래서 첫 번째 줄에는 기억할 수 있듯이, 우리는 Add Add 버튼을 클릭하려고했습니다 그리고 여기에서는 ID 매치러와 함께 사용할 것입니다 보기에서보기와 일치하는 간단한 일치 프로그램입니다

그것의 ID에 따라 계층 구조 다음으로 우리가하고 싶은 일은보기를 클릭하는 것입니다 이를 위해 클릭보기 동작을 사용합니다 이제 흥미로운 부분은 다음 줄입니다 이 행에 제목과 설명을 입력해야하기 때문입니다

그리고 우리는 그것을 위해 타입 텍스트 액션을 사용하고 싶습니다 그러나 여기, 모든 에스프레소 동기화 보장 우리가 우리가 응용 프로그램과 상호 작용할 준비가되었습니다 우리는 타입 테스트 액션을 호출 할 것입니다 그리고 이것은 당신을 해방시켜주기 때문에 위대합니다 추가 상용구 추가에서 코드 및 추가 미끄러짐 코드를 테스트합니다

마찬가지로 메모를 저장합니다 그런 다음 화면에 표시되는지 확인합니다 그리고 이것은 위대합니다 이제 에스프레소가 어떻게 작동하는지 알고 있습니다 테스트 주도 개발을 수행하는 데있어 훌륭한 도구임을 알 수 있습니다

그리고 이제 저는 그것을 닉에게 넘겨 줄 것입니다 UI 테스트를 향상시키는 방법에 대해 조금 더 이야기하기 대규모 및 중급 테스트 전략을 개선하는 방법에 대해 설명합니다 [박수 갈채] 고마워, 스테판 UI 테스트의 좋은 특성 하나 절대 잠들지 않는 시험입니다

예를 들어 설명하기 위해 돌아가 보겠습니다 이 점은 조금 더 나아 갔다 우리의 예에서는 기억하고있는 것처럼 우리는 우리가 기억에 남긴 메모를 가지고, 꽤 빠르고 믿을만합니다 그러나 실제로 앱이 성장함에 따라, 이 기능을 확장하고 싶을 것입니다 메모를 클라우드 또는 Google 드라이브에 저장합니다

따라서 대규모 엔드 – 투 – 엔드 테스트를 실행할 때, 우리는 실제 환경을 사용하고 싶다 우리는 실제 서버를 공격했습니다 그리고 네트워크 연결에 따라, 이 작업에는 시간이 오래 걸릴 수 있으므로 아마도 하고 싶지는 배경에 있습니다 이제 문제는 에스프레소 동기화가 장기간 실행되는 작업에 대해 알고 있어야합니다 이것은 개발자가 아마 스레드에서 코드를 잠자 게하는 것만큼이나 못생긴 일을하십시오

그러나 에스프레소는 실제로는 필요하지 않습니다 Idle Resource를 작성할 수 있기 때문에 공회전 리소스는 간단한 인터페이스입니다 에스프레소를 가르치기 위해 구현하는 개발자로서 사용자 정의 된 장기 실행 태스크의 동기화 앱의 따라서이 유휴 리소스를 사용하여 우리는 대규모 엔드 – 투 – 엔드 테스트를 수행했습니다 더 듬직 해요 이제 중간 크기의 테스트를 몇 가지 추가 할 수있는 방법을 알아 보겠습니다 테스트 스위트에

중형 테스트의 경우 그 (것)들을 작게 유지하고 단 하나 UI 분대에 집중, 곳에 단일 UI 구성 요소는 특정 뷰, 프래그먼트, 또는 활동 이제 예제로 돌아가 봅시다 대규모 엔드 – 투 – 엔드를 더 많이 분리 할 수있는 방법 격리 된 구성 요소 여기이 예제에서 다시, 당신은 주목했을 것입니다 두 가지 활동이있다

왼쪽의 목록 활동 및 추가 오른쪽에 활동을 기록하십시오 지금까지 우리는 대규모 엔드 – 투 – 엔드 테스트를 작성했습니다 그게 우리에게 많은 확신을 주네 코드를 많이 사용하기 때문에 앱에서 큰 엔드 투 엔드 테스트에 적합합니다 그러나 iterative test-driven을 위해 그렇게 좋지는 않습니다

개발주기 그럼 어떻게 이들을 분리 할 수 ​​있는지 봅시다 격리 된 각 활동에 대한 테스트를 격리했습니다 왼편을 격리하기 위해, List 액티비티, Espresso Intent를 사용할 수 있습니다 Espresso Intent는 당신이 가로 챌 수있는 간단한 API 귀하의 진행중인 의도 중 어떤 것도 자신의 콘텐츠를 확인하고, 모의 활동 결과를 제공 할 수 있습니다

큰 API가 실제로 어떻게 보이는지 보도록하겠습니다 보시다시피, 매우 간단합니다 당신은 당신의 성장 의도와 일치하는 의도를 가진 일치자를 가지고 있습니다 활동 결과 버전을 제공 할 수 있습니다

다시 발신자에게 승인 이 API를 사용하여 첫 번째 고립 테스트를 작성해 보겠습니다 이 테스트에서는 첫 번째 행에서 우리는 정확하게 그것을합니다 우리는 우리의 콘텐츠를 가로 채고 우리는 우리 활동 결과의 스텁 버전

이제 두 번째 줄에서 우리가 수행 할 때 새 활동을 시작하는 대신에를 클릭하십시오 에스프레소는이 의도를 가로 챌 것입니다 스텁 액티비티 결과를 제공 할 수 있습니다 마지막 줄에서 UI가 업데이트되었는지 확인하십시오 따라서

이제 격리 된 테스트가 있습니다 승인 이제 예제로 돌아가서 두 번째 부분을 어떻게 분리 할 수 ​​있을까요? 따라서 일반적으로 테스트를 작성할 때 네가 할 수있는 위치에 일부 외부 의존성을 가지고있다 귀하가 통제 할 수없는 곳입니다 앞의 예에서 보았 듯이, 우리는 저장하고 실제 서버에 도달한다는 메모가 있습니다

비록 우리가 지금 다른 자원을 가지고 있지만 지금 그게 더 안정적이게, 당신의 테스트 서버가 어떤 이유로 든 충돌 할 수 있습니다 그래서 당신의 임무는 실패 할 것입니다 우리가 완전히 고립되면 더 좋지 않을까요? 이러한 조건에서 우리의 테스트를 밀폐 된 환경에서? 이것은 당신의 시험을 훨씬 빠르게 할뿐만 아니라, 그러나 그것은 또한 모든 박편을 제거 할 것입니다 그리고이 구체적인 예를 넘어서서, 너 자신을 더 고립시키고 싶어 모든 외부 종속성으로부터

예를 들어 Android 시스템을 테스트하고 싶지는 않습니다 UI 또는 기타 UI 구성 요소 아마 이미 테스트했기 때문에 소유하지 마십시오 그리고 그들은 당신의 알지 못함에도 변화 할 수 있습니다 그래서 당신의 테스트는 실제로 실패 할 것입니다 우리 두 번째 고립 된 방법을 보자

테스트 코드에서 찾을 것입니다 여기에서 핵심은 더 이상 사용하지 않는다는 것입니다 실제 서버 대신, 우리는 밀폐 저장소를 설정했습니다 이제는 여러 가지 방법으로이 작업을 수행 할 수 있습니다

이것은 단지 하나의 방법 일뿐입니다 그럼이 밀폐 저장소를 사용할 수 있습니다 메모가 실제로 있는지 확인하려면 앱 컨텍스트를 벗어나지 않고 저장 됨 또는 네트워크에 타격 그래서이 시점에서, 당신이 그것에 대해 생각한다면, 당신은 더 신뢰할 수있는 두 개의 더 작은 테스트를 가지고 있습니다 훨씬 더 빨리 달릴 수 있습니다

그러나 동시에, 당신은 같은 금액을 유지합니다 귀하의 대규모 엔드 – 투 – 엔드 테스트로 테스트 커버 리지의 그리고 이것이 우리가 더 작은 것들을 더 갖고 싶어하는 이유입니다 대규모 엔드 – 투 – 엔드 테스트에 비해 격리 된 테스트 전에 보여 줬어 승인

이제 개발자 사이클을 반복했습니다 몇 번이고 우리는 모든 검사를 봐야합니다 초록색으로 바뀌면 우리는 자신감을 가져야한다 우리의 특징 그러나 결론을 내리기 전에 미래로 한 순간 도약해라

앱이 성장하고 팀이 성장함에 따라, 앱에 계속해서 더 많은 기능을 추가하게됩니다 그리고 당신은 자신을 어떤 위치에 놓을 수 있습니다 UI가 여러 프로세스에서 실행될 수 있습니다 정확히 Google에서 일어난 일입니다 따라서 Add Notes 예제로 가면, 이것은 다음과 같이 보일 수 있습니다

주 프로세스에서 실행되는 첫 번째 활동이 있습니다 왼쪽에 이제 두 번째 활동이 개인 프로세스에서 실행됩니다 이 경우에는 메모 추가라고합니다 그럼 어떻게 테스트할까요? 음, Android O 이전에는 테스트가 불가능했습니다

하지만 Android O에는 새로운 계측 도구가 있습니다 속성을 정의하기 위해 사용할 수있는 속성 당신이 계측하고자하는 프로세스 테스트를 실행하고 실행하는 동안, 각각의 프로세스는 분리되어 좋은 아이디어입니다 그리고 너는 그것을해야만한다 하나의 테스트에서 경계를 교차 처리하려는 곳

그래서 당신은 아마 에스프레소를 쓰고 싶을 것입니다 시험은 이렇게 보입니다 이것이 프레임 워크 레벨에서 불가능한 것은 아니었지만 Android O 이전에는 에스프레소 수준에서도 불가능했습니다 이 특정 예에서, 에스프레소는 당신의 2 차 과정을 알고 있지도 않습니다 동기화 보증을 유지할 수도 없습니다

우리 모두는 알고 있고 사랑합니다 오늘은 멀티 프로세스 에스프레소 (Multiprocess Espresso) 지원을 발표하게되어 기쁩니다 테스트 코드 나 앱 코드를 변경하지 않고 이렇게하면 UI와 원활하게 상호 작용할 수 있습니다 모든 프로세스를 유지하면서 우리 모두를 유지합니다 에스프레소 동기화 보장

Android Test의 차기 버전에서 사용할 수 있습니다 라이브러리 릴리스 지원 그럼 실제로 어떻게 작동하는지 간략하게 살펴 보겠습니다 전통적으로, 아시다시피,이 예에서는, 우리는 하나의 프로세스에서 시작합니다 Android JUnit Runner 및 Espresso의 인스턴스가 있고, 이 경우에

이제, 우리의 예를 기억한다면, Add Add (메모 추가) 버튼을 클릭하면 새로운 활동이 생겨 이제는 새로운 과정이 생깁니다 이제 문제는 우리가 Android JUnit의 두 가지 인스턴스를 사용하는 두 개의 프로세스 러너와 에스프레소는 서로에 대해 알지 못합니다 그래서 우리가하고 싶은 첫 번째 일 우리는 두 사람 사이의 의사 소통을 만들고 싶습니까? Android JUnit Runners 그리고 이제 우리는이 대화를 나눕니다 우리는 그것을 사용하여 의사 소통을 할 수 있습니다

에스프레소 예 우리가하는 일은 Android JUnit Runner에서 테스트를 등록하는 기능 Android JUnit Runner가있는 Espresso와 같은 프레임 워크 그러면 주자가 모든 핸드 쉐이킹을 용이하게합니다 두 사람 사이의 의사 소통을 위해 필요한 에스프레소 예 이제 두 개의 에스프레소 인스턴스 서로 이야기 할 수 있으면 프로세스 간 테스트를 가능하게하기 위해 그것을 사용하라

모든 동기화 보장을 유지한다 우리가 전에 가지고 있었던 승인 이를 통해 개발자 워크 플로우가 끝났습니다 우리는 당신에게 모든 도구를 보여주었습니다

길의 각 단계에서 사용할 수있다 TDD가 Android에서 발생하도록하기 위해 그리고 그 말로는, 당신이이 흐름을 정확하게 따르지 않더라도, 잘하면, 모든 단일 도구를 사용하는 방법을 알고 있습니다 앱을 가져 오기 위해 우수한 테스트를 작성하는 방법 품질을 한 단계 높여줍니다 따라서 테스트를 작성하고 쓰기 및 실행하려는 경우 Google에서하는 것처럼 테스트합니다 여기에 몇 가지 리소스가 있습니다

너를 시작하게 고마워 우리 생각 엔 질문에 시간을 보내십시오 그렇지 않은 경우 오늘 3시 30 분에 근무 시간이 있습니다

다행히도, 우리는 거기서 만날 것입니다 고맙습니다 [박수 갈채] [음악 재생]

Update production devices in the field with the Android Things Console (Google I/O ’18)

[음악 재생] ADAM RODRIGUEZ : 안녕하세요 Android Things에 대한이 이야기에 오신 것을 환영합니다

우리와 함께 계셔서 다행입니다 나는 아담이야 저는 Google의 제품 관리자입니다 AMY JANG : 저는 Amy입니다 Android Things Console 용 엔지니어링을 이끌고 있습니다

ADAM RODRIGUEZ : 오늘 우리는 Android Things 콘솔을 사용하는 방법에 대해 이야기하고 싶습니다 필드에서 생산 장치를 업데이트하십시오 IO에서 몇 가지 다른 회담을 통해 잘 배웠으므로, 안드로이드 것들은 훌륭한 플랫폼입니다 자기 자신을 만들기 위해서 그러나 실제로 둘 이상을 만드는 것에 관해서는 무언가, 어떻게 유지합니까? 그 장치는 평생 동안? 기기를 사용하면 어떻게 지원하나요? 고객의 손에? 그게 오늘 우리가 너와 얘기 할 때 온거야 승인

그럼 정말 빠른 리뷰를 해봅시다 Android Things는 무엇이고 왜 당신이 그것을 원할 수도 있습니다 우선, 그것은 안드로이드의 힘을 가지고 있습니다 당신이 알고 사랑하는 것과 동일한 도구로 개발 된, Android 개발자 인 경우 결국 안드로이드이기 때문에 쉽습니다 둘째, 프로토 타입에서 생산으로 확장됩니다

하드웨어 엔지니어 또는 펌웨어 엔지니어 일 필요는 없습니다 이것을하기 위해 우리는 완벽하게 인증 된 SoM을 제공합니다 Android는 AOSP가 아니기 때문에 우리가 사용하는 것을 사용합니다 당신이 필요로하는이 이야기에 대해 이야기하기

Android Things SoM을 사용합니다 이점은이 SoM 플랫폼 용으로 제작되었습니다 따라서 Android 코드를 작성하면됩니다 저수준 펌웨어에 대해 걱정할 필요가 없습니다 해당 하드웨어를 구동합니다

마지막으로 자동 업데이트로 보안 기능이 내장됩니다 인증 된 SoM으로 개발하고 있으므로, Google에서 기기의 보안을 관리 할 수 ​​있습니다 Google은 업데이트 및 보안 픽스를 제공합니다 평생 동안 구현할 수있는 귀하의 제품의 Android Things의 목표는 사용자가 쉽게 작업 할 수 있도록하는 것입니다

쉽고 안전하며 관리가 쉽습니다 그러나 이것은 질문을 제기합니다 IoT는 왜 그렇게 열심히일까요? 이 문제에 대해 정말로 걱정할 필요가 있습니까? 그래서 그것에 대해 조금 생각해보십시오 몇 천 명이나되는 사람을 배로 데려다 줄거야 IoT 장치를 보호하십시오

건물의 어려운 일을해야 할 것입니다 장치, 하드웨어 설계, 소프트웨어 작성 어렵지만 특별한 소스이기도합니다 그것은 당신의 장치를 독특하게 만듭니다 하지만 그 외에는 다른 것들이 많이 있습니다 당신도해야합니다

다른 엔지니어들과 어떻게 개발을 공유합니까? 장치를 안전하게하려면, 최신 보안 패치를 항상 최신 상태로 유지해야합니다 해당 패치를 발견하면 장치가 해당 패치를 가져올 수있는 방법을 구축해야합니다 그런 다음 어떻게 안전하게 업데이트합니까? 업데이트가 나 빠지면 어떻게 할 수 있습니까? 고객의 기기를 손상시키지 않았는지 확인하십시오 델타 업데이트, 부분 롤아웃, A / B 설계를 상상해보십시오 파티션, 채널 관리

성공적인 IoT를 위해 필요한 모든 것 그러나 모든 인프라를 유지 관리하고 업데이트해야합니다 방대한 직업이다 우리가 앞서 말했던 것처럼, 우리의 목표 Android Things를 사용하면 더 쉽게 사용할 수 있습니다 하드웨어와 소프트웨어 디자인은 여전히 ​​당신에게 달렸습니다

그것이 있어야하는 것처럼 그것은 당신의 제품을 특별하게 만드는 것입니다 그러나 우리는 당신이 Android Studio와 같은 모든 친숙한 도구를 사용할 수 있습니다 그리고 그것을하는 [INAUDIBLE] 그러나 펌웨어 코드를 신경 쓰지 않아도됩니다

Android Things의 SoM 모델을 관리합니다 그런 다음 보안 업데이트와 관련하여, Android 팀 전체를 활용할 수 있습니다 보안 구멍을 찾아 수정하십시오 자동 업데이트와 함께 문자 그대로 0이 붙은 보안 패치 당신과 당신의 관계 마지막 장치를 보내십시오 또한 업데이트를 위해 동일한 기술을 활용하고 있습니다

매일 수백만 개의 장치를 업데이트하는 데 사용되었습니다 강화되고 검증되었으며 최적화되었습니다 따라서 실제로 차별화되는 부분에 집중할 수 있습니다 귀하의 제품 – 작성한 기능 및 응용 프로그램 AMY JANG : 예를 들어 보겠습니다 Android Things가 어떻게 도움이되는지 확인해보십시오

아담과 내가 세탁물 접기를하고 있다고 상상해보십시오 로봇, 솔직히 말하자면, 아무도 양말 접기를 좋아하지 않기 때문에, 권리? 그래서이 로봇은 많은 물체 인식, 비전을 사용합니다 기계 학습, 완벽한 사용법 Android 관련 항목입니다 프로토 타입에서 어떻게 가져 옵니까? 내가 집에서 지어서 모든 사람이 사용할 수있게 만들었습니까? 이것은 우리 콘솔의 마술이 들어오는 곳입니다 Android Things는 의도적으로 설계되었습니다

하드웨어를 쉽게 개발할 수 있도록 그것을 시장에 선적하십시오 그리고 Android Things 콘솔을 사용할 수 있습니다 당신의 모든 필요를 돌보아야합니다 첫 번째 구성 – 장치 관리를 정의합니다 우리가 제품이라고 부르는 그룹과 Android Studio와 같은 편집기를 사용하여 작성한 앱, [INAUDIBLE] 콘솔을 사용하여 앱을 관리 할 수 ​​있습니다

빌드 기능을 사용하면 앱으로 안전한 Android Things 이미지를 만들 수 있습니다 당신이 방금 썼던, 그리고 릴리스 단계에서, 원활한 업데이트를 장치로 푸시 할 수 있습니다 분석을 사용하여 출시가 완료되었는지 확인하십시오 부드럽게 그럼 어떻게 작동하는지 자세히 살펴 보겠습니다

ADAM RODRIGUEZ : 좋습니다 프로토 타입에서 생산에 이르는 첫 번째 단계 제품 콘솔에 세부 정보를 설정하는 것입니다 당신이 지을 계획입니다 세탁 로봇을 구성 해 봅시다 먼저 제품 이름을 설정하고 모델을 만듭니다

몇 가지 SKU가 있다고 상상해보십시오 어쩌면 영국 SKU와 US SKU가 있습니다 모델로 제품을 분해 할 수 있습니다 다른 버전으로 다음으로 SoM 유형을 선택하려고합니다

필요한 기능과 가격을 기반으로 SoM을 선택하십시오 당신이 치고 싶은 지점 SoM을 선택하는 것은 중요합니다 나중에 만들려는 이미지에 대해 많은 것을 제어합니다 하나의 메모

하나의 SoM으로 빌드를 시작한 다음이를 변경하려는 경우, 많은 코드를 다시 작성하지 않고도 쉽습니다 그것은 내가 개인적으로 실제로하는 것들 중 하나입니다 우리가 관리하는 SoM 모델에 대한 사랑 정말 비싼 물건으로 시작할 수 있습니다 일단 생산 단계에서 비용을 절감하려면 다운 그레이드하십시오

아니면 정말 싼 것을 함께 해킹 할 수 있습니다 공연이 당신의 필요를 충족시키지 못한다면, 보다 강력한 SoM으로 업그레이드 할 수 있습니다 마지막으로 제품 공유도 설정하십시오 Amy와 나는이 laundroid를 함께 만들고 있기 때문에, 우리는 콘솔을 통해이 제품에 대한 액세스를 공유합니다 그래서 우리 중 누구도 앱을 업로드하고 빌드를 만들 수 없습니다

제품 구성이 완료되면, 다음 단계는 앱을 작성하는 것입니다 앱은 Android의 핵심이며 Android Android 예외는 아닙니다 그들은 내부의 모든 기능을 정의합니다 Android Things의 Amy가 양말 접기 기능을 작성했을 때, 그녀는 [INAUDIBLE] APK에서 그렇게했습니다 친숙한 모든 도구를 Android로 사용할 수 있습니다

개발자– Android Studio, Kotlin, Google Play 서비스, Firebase 이 모든 것은 단지 다시 작동하기 때문에 결국 안드로이드 일뿐입니다 앱이 작성되면 앱 라이브러리에 업로드합니다 빌드에 추가 할 수 있습니다 여기에서 볼 수 있듯이 4 가지 앱이 있습니다 우리의 세탁 로봇의 기능이 깨졌습니다

또한 앱 라이브러리는 버전 관리, 그래서 새로운 버전의 앱을 가지고있을 때, 도서관은 당신에게 가장 최근의 것을 보여주기 위해주의를 기울입니다 내가 정말 좋아하는 한 곡은 앱 공유입니다 공동 작업자와 제품을 공유 할 수있는 것처럼, 당신도 애플 리케이션을 공유 할 수 있습니다 Android 자체는 앱을 만드는 데 필요한 모든 것입니다 다른 사람들이 사용할 수있는 Android 환경 여기도 예외는 아닙니다

다른 사람들과 귀하의 앱을 공유하십시오 팀 또는 유사한 제품을 만드는 다른 사람들에게 오늘은 아마 너만 갈거야 더 많은 사람들이 빌드하면서 자신이 쓴 앱을 사용하려면 Android 관련 항목에서 앱을 사용하고 있음을 알 수 있습니다 다른 사람들이 유틸리티와 공통 기능에 대해 썼다 AMY JANG : 이제 이미지를 빌드 할 차례입니다

너희들이 쓴 안드로이드 것들 애플 리케이션으로 우리의 경우에는 새로운 양말을 썼습니다 APK 우리 로봇에게 몇 가지 멋진 양말 접기 기능을 제공합니다 Adam이 방금 앱 라이브러리에 업로드했습니다 콘솔에서도 나와 공유했습니다

이제 우리는이 기능을 추가했습니다 그것을 패키지에 담을 때입니다 귀하의 장치에 빌드 및 플래시 그래서 Build는 모든 재료가 모이는 곳입니다 앱, Google Apps, 하드웨어 구성 장치에 맞게 사용자 지정할 수 있습니다

여기에서 선택한 옵션 세트 우리가 빌드 구성이라고 부르는 것입니다 빌드 구성은 비밀스런 소스와 규칙과 같습니다 장치의 내용을 지정하는 구성 영상 그리고 장치 이미지에 따르면, 나는 이미지 기기로 플래시하고 페이로드를 만드는 이미지 over the air update 따라서이 빌드 단계에서 새롭고 많은 것을 만들 수 있습니다

구성을 작성하고 관리하십시오 대부분의 사람들은 방금 구입했을 것입니다 또는이 I / O에서 개발자 키트를받습니다 시작하려면 시작 키트 사용 설정을 선택하고, 모든 빌드 세부 정보가 미리 채워집니다 이 예제에서는 예제를 살펴 보겠습니다

처음부터 시작하는 것 첫째, 가장 중요한 것들 중 하나 Android Things OS 버전을 선택하는 것입니다 최신 버전을 선택하십시오 그 (것)들은 최신 버그가 있기 때문에 편안함 수정 및 보안 업데이트 최신 버전을 사용해야하는 것은 아닙니다

하지만 이런 이유로 추천합니다 다음 단계에서는이 단계에서 앱 목록을 볼 수 있습니다 앱 라이브러리에 업로드 한 빌드에 포함 할 앱을 선택하십시오 Google에서 제공하는 앱을 포함하는 것을 잊지 마십시오 Google Play 서비스와 같은 그리고 왜 Google Play 서비스를 원하십니까? Google Play 서비스를 사용하면 앱 Nearby와 같은 최신 Google API를 활용할 수 있습니다

지도, Firebase, 새로운 [INAUDIBLE] 키트 포함 Google Play 서비스 패키지에 포함되어 있습니다 대화 상자에 표시된 확인란을 클릭하기 만하면됩니다 귀하의 빌드에 포함될 것입니다 ADAM RODRIGUEZ : 좋습니다 그래서 다시 빌드합니다

앱을 선택하고 나면 해당 앱에서 요청하는 권한 그 (것)들과 당신이 좋다는 것을 확인하십시오 사용자가 권한을 선택할 수 없기 때문에 일반 Android와 마찬가지로 자신에게 달려 있습니다 그들을 위해 그것을 할 수 있습니다 스스로 개발 한 앱만 사용하는 경우, 여기에 어떤 놀라움도 있어서는 안됩니다 하지만 다른 사람들이 공유하는 앱을 사용하는 경우, 봐야 할 가치가있어

이것은 당신이 잘못한 일을 막는 데 도움이됩니다 예상하지 못했고, 좋은 보안 조치였습니다 Android Things가 점점 보편화되면서, 다른 사람들이 건물을 지켜 보는 것이 놀랍지 않을 것입니다 다양한 소스의 공유 응용 프로그램이있는 IoT 제품 따라서 권한을 보는 것이 중요합니다 다음 단계는 추가하는 것입니다

빌드에 리소스를 구축하십시오 장치에 디스플레이가있는 경우 여기에서 보는 것처럼 부팅 애니메이션을 추가 할 수 있습니다 Lenovo 스마트 디스플레이 용 사용자 정의 bootanimationzip을 업로드 할 수 있습니다

이 섹션에서는 또한 글꼴을 포함하려는 경우 이 장치들 중에는 디스플레이가 없기 때문에, 우리는 글꼴로 그들을 부담시키고 싶지 않습니다 이 작은 IoT의 이미지 크기를 줄이는 것이 전부입니다 제작품 이제 Android 기기가별로 흥미롭지 않습니다 그것이 바로 SoM 이었다면

하드웨어 구성은 주변 장치를 추가하는 곳이며, GPIO 및 버스 속도를 제어하십시오 스타터 키트는 사전 설정되어 있습니다 시동기 장비에서 제공하는 하드웨어 구성 짓다 그러나 구성을 멋지게 만들 수 있습니다 다르게

이 UI 도구를 사용하여 조정할 수 있습니다 이 도구는 현재 버스 제어에 국한되어 있지만 속도 및 풀 업 저항이 모든 주변 장치를 구성 할 것이며, 디스플레이, 오디오 버스, 스피커와 같은 우리는 또한 여기서 I / O를 제어 할 계획입니다 그래서 당신은 핀 복싱을 할 수 있고, 어떤 핀들이 어떤 기능에 붙어있다 따라서 더 많은 업데이트를 위해이 공간을 조심하십시오 AMY JANG : 자, 이제 최종 빌드 단계에 있습니다

당신이 만든 구성들 총 예상과 함께 표시됩니다 OEM 파티션 크기 요약에서 예상 크기 검토 원하는대로 OEM 파티션의 전체 크기를 설정하십시오 이 파티션이 무엇인지, 그리고 개발자로서 변화시킬 수 있습니까? 그리고 어느 파티션이 무선으로 업데이트 할 수 있습니까? 최신 정보? 그 대답을하기 위해 Android Things 파티션 레이아웃을 살펴 보겠습니다 잠시 동안

왼쪽에는 IMX7D PICO의 간단한 파티션 레이아웃이 있습니다 이것이 개발자 키트에서 얻은 보드입니다 SOC 벤더 사이에는 작은 차이가 있습니다 보드 하지만 예제를 살펴 보겠습니다 코어 안드로이드 것들에 의해 사용되는 파티션 아키텍처는 모든 SoM에서 동일합니다

시스템, 시스템 및 부팅은 읽기 전용 파티션이므로, Android 용으로 생성되어 사용됩니다 플랫폼 부팅은 커널을위한 것이며 램 디스크는 정상 부팅을위한 것입니다 그리고 시스템은 Android Things OS가로드되는 곳입니다 Vbmeta는 읽기 전용 파티션입니다

그리고 이는 검증 된 부팅 메커니즘에 사용됩니다 이름에서 알 수 있듯이, 이것은 확인 된 부팅에 대한 메타 데이터가 기록됩니다 특히 Google에서 생성 한 단일 해시입니다 부트, 시스템 및 벤더에 대한 정보를 사용하여, Google에 저장된 보안 키로 서명했습니다 장치의 모든 부팅 순서에 대해, 부트 로더가 코드가 진짜임을 확인합니다

알려진 보안 결함이 없었습니다 이 정보를 사용하여 발견되었습니다 임의의 조작이 발견되면 장치가 부팅되지 않습니다 따라서이 파티션으로 주위를 어지럽히고 싶지는 않습니다 공급 업체는 읽기 전용 파티션이기도합니다

이 파티션에서는 SOC 공급 업체의 바이너리 이미지 로드됩니다 SOC 관련 드라이버 라이브러리와 같은 것들 보통 여기에 넣습니다 OEM과 OEM 부트 로더는 Android 용 파티션입니다 개발자, 그게 당신입니다 그것이 생성 된 후에 그것은 의미에서 읽기만합니다, 내가 방금 보안상의 이유로 훼손 될 수는 없어

얘기 했어 그러나 OEM은 콘텐츠가 콘솔을 통해 지정한 빌드 구성 에 기록됩니다 그래서 그 의미에서 재기록이 가능합니다 Android Things 개발자가 콘솔을 통해 관리합니다 이 OEM 파티션도 새로 생성됩니다

구성 4에서 새 빌드를 만들 때 오타에 그리고 OEM 부트 로더는 파티션입니다 어떤 하드웨어 구성을 선택했는지 그 빌드도 작성되었습니다 Android 개발자 인 경우 이 파티션, 사용자 데이터에 익숙 할 수 있습니다 시스템 및 앱이 사용자를 작성하는 곳입니다

런타임시 데이터 그 외에도 ADB 설치를 통해 설치하는 APK, 또는 Android Studio의 재생 버튼 또한이 파티션에 기록됩니다 그래서 이것은 실제로 질문을 제기합니다 패키지 이름은 앱의 고유 식별자입니다 동일한 패키지 이름이 사용자 데이터와 OEM에 모두있는 경우, Android 패키지 관리자는 어떻게했을까요? 어떤 앱을 사용해야하는지 알고 있습니까? OEM은 생성 된 후에 만 ​​읽을 수 있습니다

이미 거기에 쓰여진 APK 있는 그대로 존재해야합니다 당신이 개발할 때, 당신은 ADB 설치를 통해 APK가 변경 될 가능성이 큽니다 이 개발 흐름을 존중하기 위해 ADB 사용자 데이터에 설치된 APK는 항상 OEM 제품보다 영예 롭습니다 이것이 의미하는 바는 APK가있는 경우 사용자 데이터와 OEM 모두에서 APK가 OEM을로드하고 사용자 데이터에서 APK를 삭제합니다 설치시 ADB에 의해

Misc는 플랫폼에서 사용되는 또 다른 읽기 전용 파티션입니다 부트 로더와 같은 기타 요구 사항에 적합합니다 기능에 대한 우리의 시스템 공장과 그 부트 로더 파티션 모든 장치 별 구성을 위해 예약되어 있으며, 같은 일련 번호, 공장에서 작성된 것입니다 이는 서비스 센터에서 나중에 수행 할 수도 있습니다

이 파티션은 개발자와 공장에서 쓰기 가능하며, 배송 된 후에야 읽을 수 있습니다 따라서이 파티션에 쓰기 위해서는 특별한 도구와 권한을 제공합니다 그래서 지금까지 모든 파티션을 살펴 보았습니다 안드로이드 것들 코어 아키텍처가 사용하는 이 테이블의 파티션을 보셨을 것입니다

a와 b의 두 섹션으로 중복됩니다 그게 무슨 뜻이야? 이것은 OTA가 공중 갱신에 오는 곳이다 OTA는 AB 파티션 메커니즘으로 작동하며, 동일한 파티션 종류가 두 개의 중복 메모리에 존재하는 경우 공백 이 아키텍처는 사용자에게 끊김없는 업데이트를 제공합니다 장치는 여전히 활성 파티션에서 활성 상태 일 수 있습니다 업데이트가 다운로드 및 설치되는 위치 비활성 파티션 A에 B

그래서 모든 일이 끝난 후, 보안 부팅 메커니즘으로 재부팅 한 후, 장치가 파티션으로 깨어납니다 업데이트가 설치된 위치 또한 모든 읽기 전용 Android 항목 파티션은 특정 크기로 고정됩니다 그리고 아시다시피, 보드 메모리도 고정되어 있습니다 이것이 의미하는 바는 나머지 고정 된 OEM 파티션과 사용자 데이터간에 분할 될 메모리 분할

그리고 당신은 분할이 둘 사이에 무엇인지 결정할 것입니다 그럼 예제를 살펴 보겠습니다 그래서 LTS OS, 몇 가지 앱을 선택했다고 가정 해보십시오 Google Play 서비스, 맞춤 하드웨어 설정 이 콘솔의 [INAUDIBLE]보기에서, 당신이 마지막 빌드 단계에서 본, 우리는 모든 핵심적인 세부 사항을 없앴습니다

지금까지 본 시스템 파티션 중 따라서 마지막 슬라이드에서주의를 기울이지 않았다면, 괜찮아 당신이 알아야 할 것은 시스템 파티션 고정 크기입니다 따라서 OEM 파티션 크기 입력은 입력을 요청합니다 단일 OEM 파티션의 크기가 될 것입니다 이것이 의미하는 바는 OEM의 크기를 늘리면 100 분할, 사용자 데이터 파티션 200에서 뺍니다

파티션에 대한 가장 중요한 메시지는 다음과 같습니다 이 이야기에서 벗어나야합니다 적합한 OEM 파티션 크기 선택 제작 이미지를 만들 때 중요합니다 장치가 선택된 크기로 구워지면, 그들은 크기 레이아웃으로 고정되어있다 그들이 reflashed 때까지

AB와 OTA 메커니즘의 특성 때문입니다 우리는 방금 이야기했습니다 따라서 이러한 기기는 OTA 업데이트 만 수신합니다 동일한 파티션 크기로 빌드하십시오 크기를 설정할 때 한 가지 권장 사항 미래 성장을위한 완충 공간을 남겨 두는 것입니다

APK에 새로운 기능을 추가하고자 할 수 있습니다 새로운 멋진 부팅 애니메이션처럼 더 추가 할 수도 있습니다 더 많은 메모리가 필요할 수 있습니다 미래에 대한 계획과 예상 앱 성장과 데이터의 차이 성장 다시 말하지만 아직 계획 할 필요가 없습니다

프로토 타이핑 및 개발 단계에있을 때, 올바른 크기를 찾는 것에 대해 걱정할 필요가 없습니다 언제든지 장치를 다시 칠할 수 있기 때문입니다 이 값을 예측하고 마무리해야합니다 당신이 생산 이미지를 만들 때 이제 올바른 크기를 선택하고 빌드를 만들고, 빌드 구성을 작성하면, 두 가지 이미지 옵션 중 하나를 선택할 수 있습니다

개발 및 생산 개발 빌드는 디버깅 기능을 제공합니다 ADB와 마찬가지로 최종 사용자가 안전하고 사용하기를 원한다 디버깅을 제공하지 않습니다 장치가 프로덕션 이미지로 플래시되면, 보안상의 이유로 훼손 될 수 없습니다

따라서 디버깅이 가능하도록 복구해야합니다 다운로드를 클릭하면 이미지가 생성됩니다 브라우저를 통해 다운로드가 시작됩니다 이제 이미지 파일을 다운로드했습니다 파일에서 내 장치로 어떻게 가져 옵니까? 우리는이 모든 슈퍼를 만들기 위해 플래시 스크립트 도구를 제공합니다

쉽고 간단합니다 도구 섹션으로 이동하기 만하면됩니다 스크립트를 다운로드하십시오 스크립트의 지시 사항을 따르십시오 그리고 그것은 모두 꽤 간단해야합니다

기기를 바로 사용할 수 있습니다 스크립트 대신 빠른 부팅을 사용할 수도 있습니다 네가 원한다면 그래서, 우리는 건물을 완성하고 다운로드를합니다 Android Things 기기 준비하기 ADAM RODRIGUEZ : 맞아

이 시점까지는 빌딩에 관한 것이 전부였습니다 기능을 Android Things 기기에 추가 할 수 있습니다 Android Things 덕분에 개발이 쉬워 지지만, 당신은 아마 같은 일을했을 수도 있습니다 거기에 다른 플랫폼이 많이 있습니다 그러나 릴리스는 상황이 실제로 달라지는 곳입니다

새 기능 업데이트, 지원, 푸시, 귀하의 기기뿐만 아니라 수천 개의 기기로 해당 영역에서 이것은 Android Things가 실제로 빛나기 시작하는 곳입니다 나는 왜 두 가지 이유가 있다고 말하고 싶다 운영 체제로 Android Things를 선택할 수 있습니다 첫째, 당신은 안드로이드의 힘을 좋아합니다

당신은 그것에 익숙하고 익숙합니다 또는 두 가지, 하나 이상의 것을 만들 계획입니다 에이미와 나는이 세탁 로봇을 가지고있다 그녀는 양말을 접는 방법을 알고있는 세탁 로봇을 가지고 있습니다 하지만 내 집에있는 빨래 로봇은 양말을 접는 방법을 모른다

우리가 로봇에 얹혀있는 빌드를 어떻게 얻습니까? 안드로이드 것들로 아주 쉽게 먼저 채널을 사용하여 기기 인구를 분산시킵니다 고객이 소유 한 장치가 몇 개있을 수 있습니다 테스터들이 소유 한 몇 가지 다른 것들 그리고 당신은 그들 모두가 동일한 빌드를 얻는 것을 원하지 않습니다

따라서 채널을 논리적으로 구분할 수 있도록 채널에 배치하십시오 또한 맞춤 채널을 만들고, 품질 보증 (QA) 채널을 말하고, 또는 파란색을 좋아하는 사람들을위한 채널 사물을 더 나눕니다 채널을 통해 원하는대로 할 수 있습니다 그러나 당신이 약간의 지침서를 원한다면, 카나리아 일반적으로 빌드를 가져 오는 첫 번째 장치입니다 탄광 관용구의 카나리아에 대한 언급입니다

새로운 빌드에 문제가 있다면, 카나리아 장치가 먼저 그것에 대해 알려줍니다 Dev는 일반적으로 개발자 기기가 앉아있는 곳입니다 많은 새로운 기능, 많은 버그, 하지만 적어도 그들은 부팅 베타는 테스터를위한 것입니다 이들은 실제 사용자입니다

약간의 피드백을줌으로써 새로운 기능을 얻는다 출시되지 않은 소프트웨어에 대해 그리고 사용자의 대량 구매가 안정적입니다 이러한 빌드는 많은 테스트를 거쳤으며 모든 것이 작동합니다 마지막으로, 사용자 정의는 원하는대로 할 수 있습니다

개발자의 미리보기에서 우리는 많은 피드백을 얻었습니다 사람들은 많은 채널을 원했습니다 여러 가지 방법으로 기기 인구를 나눌 수 있습니다 그래서 우리는 그들을 위해 맞춤 채널을 만들었습니다 좋아, 이제 너는이 채널들을 가지고 있고, 어떻게 이러한 채널에 기기를 가져 옵니까? 처음부터? 장치는 안정 채널로 기본 설정됩니다

그러나 채널을 변경하려면 API를 통해 설정하거나 기기를 연결할 수 있습니다 여기에 보이는 것처럼 ADB를 플래시하십시오 명심할 것은 한 가지입니다 에이미가 석방에 대해 어떻게 이야기했는지 기억해 개발 이미지 vs

새로운 채널로 기기를 플래시 할 수 있습니다 그것이 개발 이미지를 실행하고 있다면 하지만 공개 이미지를 실행중인 경우, 깜박이고 ADB가 차단됩니다 따라서 채널을 변경할 수도 없습니다 최종 사용자가 실행되지 않도록하기 위해 원치 않는 코드 또는 악의적 인 코드가 포함될 수 있습니다

승인 이제 채널을 할당 했으므로, 업데이트를 푸시 할 수 있습니다 우리는 이전에 만든 빌드를 가져옵니다 그들로부터 업데이트를 생성 한 다음 장치에 배달됩니다 업데이트는 기본적으로 새로운 기능, 버그 수정 또는 변경

이러한 기기로 푸시하는 것을 OTA라고합니다 또는 over the air 업데이트 장치는이 업데이트를 다운로드하여 B 파티션에로드합니다 재부팅되면 B 파티션으로 부팅됩니다 그러나 문제가있는 경우 다시 A 파티션으로 돌아갑니다

나는 이것을 좋아한다 그것이 즉시 업데이트 느낌을 의미하기 때문에, 하지만 그들은 또한 내결함성이 있습니다 Android Things의 모든 사용자가이를 활용합니다 OTA를위한 옵션 중 하나는 부분 업데이트 (fractional update)라고합니다 채널의 업데이트를 100 %로 푸는 대신, 점차적으로 롤아웃 할 수 있습니다

나쁜 일이 생기면 동시에 모든 사용자에게 영향을 미치지는 않습니다 부분 업데이트 사용을 적극 권장합니다 OTA 접근을 위험에 빠뜨릴 수 있습니다 앞서 말했듯이 거의 모든 기술 동일한 인프라를 사용하고 있습니다 현장에서 수백만 개의 장치를 업데이트하기 위해 매일 사용하십시오

AB 업데이트, 델타 업데이트, 부분 업데이트 같은 것들 이것들은 모두 어렵지만 결정적으로 중요합니다 기기의 안정적인 업데이트를 원한다면 중요합니다 세계적인 AMY JANG : 아담이 언급 한 것처럼, Android Things 기기는 동일한 OTA 아키텍처를 따릅니다

Google이 사용하는 기능이므로 작동 할 것이라고 확신 할 수 있습니다 하지만 궁금해 할 것 같은데, 오타 후드 아래서 일하니? 그것은 꽤 간단한 흐름입니다 Android Things를 통해 지정하면 콘솔에서 정보를 저장하도록 OTA 서버를 업데이트합니다 제품 및 업데이트 채널에 대해 장치가 OTA 서버에보고합니다 5 시간마다 빌드 정보를 제공합니다

그러면 OTA 서버는 장치가 그것을 데리러 업데이 트가 있습니다 기기가 새 업데이트를 다운로드하고 설치합니다 우리가 얘기했던 비활성 AB 파티션을 구축하십시오 사용자는 여전히 기기를 사용할 수 있습니다 이 과정에서

Update Manager API를 사용하면 모든 권한을 가질 수 있습니다 업데이트 정책 (예 : 업데이트주기) 장치가 업데이트 확인을 위해 핑 (ping)하도록 하시겠습니까? 또한 듣는 방법으로 장치 동작을 사용자 정의 할 수 있습니다 이벤트를 업데이트합니다 일반적인 업데이트의 예를 살펴 보겠습니다 시퀀스, 장치 내부에서 발생하는 [INAUDIBLE] 다음과 같은 업데이트 상태 이벤트가 발생합니다

해당 앱 리스너에 게시됩니다 업데이트 엔진이 OTA를 서버에 확인합니다 OTA는 업데이트 엔진 클라이언트가 거기에 있음을 알리게합니다 그것을 데리러 새로운 업데이 트입니다 그러면 업데이트 다운로드가 시작됩니다

이 흐름도에서 볼 수 있듯이, 해당 업데이트 이벤트가 앱 수신기에 게시됩니다 그리고 그것은 당신의 앱입니다 설정 한 정책에 따라 앱 다음과 같은 경우 장치 재부팅을 트리거 할 수 있습니다 당신은 그것이 적절하다고 생각합니다 장치가 부팅되면 업데이트가 기록 될 새 파티션으로 시작하십시오

다시 부팅하면 업데이트를 다시 확인합니다 이미 업데이트되었으므로 다음 업데이트 때까지 유휴 상태로 돌아갑니다 수표가 발행됩니다 따라서 API를 사용하여 정책을 설정하는 방법입니다 관리자 인스턴스를 업데이트 할 수 있습니다

원하는 정책을 설정하십시오 적용 정책 만 사용하여 업데이트 관리자 업데이트를 다운로드하고 설치합니다 새 업데이트가 제공 될 때마다 업데이트 간격을 변경할 수 있습니다 이 API를 사용하는 빈도 – 예를 들어 이틀이라고 해 그러나 전체 흐름을 제어하려고한다고 가정 해보십시오

그런 다음 검사 전용 정책을 사용할 수 있습니다 모든 업데이트 이벤트를 듣고 전체 업데이트를 제어합니다 방법 업데이트 사용 가능 상태를 수신하면, 다운로드를 시작하기 좋은지 여부를 결정할 수 있습니다 설치하십시오

그리고 좋은 시간이라고 생각할 때, 지금 업데이트를 실행할 수 있습니다 메서드를 호출합니다 그리고 완료되면 업데이트 된 요구 사항을 다시 부팅하게됩니다 지위 그리고 또한 좋은 시간이라고 생각할 때, 장치를 다시 시작하도록 트리거 할 수 있습니다

그리고 그것은 모두 당신의 통제하에 있습니다 기기가 제로 데이 업데이트가 필요합니다 어떤 선반 시간 후에 고객이 제품을 구입하면, 이미 새 소프트웨어를 업그레이드했을 수도 있습니다 다음 가장 시원한 것 그리고 당신은 그것들을 시작하기를 원합니다, 그렇죠? 사용자가 몇 기가 바이트를 다운로드하는 것을 원하지 않습니다

새로운 소프트웨어가 귀하의 제품을 사용하기 전에 델타 업데이트는이 페이로드 업데이트가 가능한 한 작다는 것을 의미합니다 기본적으로 공장 이미지 옵션에 따라, 이전 OTA가 푸시하면 Android Things 콘솔 돌보아주고 자동으로 생성합니다 빌드 사이의 델타 페이로드, 그래서 장치는 더 작은 페이로드 패킷을 수신 할 수 있습니다 그들의 현재 빌드와 새로운 가장 멋진 것 사이 당신의 친구가 크리스마스 선물을 풀 었다고 상상해보십시오 그리고 그들은 최신 버전을 다운로드하기 위해 20 분을 기다려야했습니다

정말 끔찍한 경험 이었죠? 델타 업데이트를 통해 훨씬 개선되었습니다 ADAM RODRIGUEZ :이 시점에서 우리는 아마 조금 지출해야한다 보안에 대해 이야기하는 시간 XKCD가 매우 우아하게 지적했듯이, 단순히 안전한 장치를 만드십시오 안전한 IoT를 유지한다는 것은 지속적으로 유지된다는 것을 의미합니다

업데이트 및 취약성 찾기, 제품 수명주기 동안 변화를 추진합니다 우리는 Android Things가 얼마나 훌륭한 지에 대해 많이 이야기했습니다 많은 것을 만들고 싶을 때 그러나 당신이 무언가를 많이 만들 때, 너는 정말로 밀고하는 책임이 있니? 해당 제품의 평생 동안 새로운 업데이트가 있습니까? 에이미와 나는 이제 멋진 세탁 로봇을 가지고있다 하지만 몇 년 후에 우리는 다른 일을 계속합니다

어쩌면 우리는 다른 일자리를 얻을 수 있습니다 그 다음엔? 새로운 취약점에 대해 알게되었을 때, 커널 및 라이브러리 픽스를 조사합니까? 어쩌면 우리는 모든 엔지니어들과 다시 만날 수 있습니다 새 빌드를 컴파일하여 사용자에게 제공 할 수 있습니까? 아니 그게 무슨 일이 아니야 실제로 이러한 고아 장비, 그들은 인터넷에 연결되어 있습니다

아마 사용되지 않았을 것입니다 하지만 정말 취약합니다 고맙게도 Android Things를 사용하여 우리는이 문제에 대한 해결책을 가지고 있습니다 자동 갱신 플래그 Google의 SoM 전략 덕분에 Google은 자신있게 SoM을 실행하는 모든 IoT 장치에 보안 수정 사항을 적용하고, 세탁 접이식 로봇 또는 웹 캠 일 수 있습니다

채널에서이 깃발을 뒤집기 만하면됩니다 모든 장치가 정기적 인 보안 업데이트를 받게됩니다 귀하의 개입없이 Google로부터 메모하는 것이 중요합니다 이 깃발을 뒤집기 위해 필요합니다 자동 업데이트를 활성화하지 않은 경우, Google은 여전히 ​​보안 문제를 해결할 것입니다 그러나 언제 어떻게 구현할 것인지 선택할 수 있습니다

그것은 당신에게 달려 있습니다 Google에서 귀하의 업데이트 또는 관리를 관리하게하십시오 그들이 너 자신을 굴릴 때 Android Things 업데이트 방법에 대해 조금 이야기 해 보겠습니다 및 버전 관리 작업

대략 Android 버전의 주요 버전 일반 Android의 디저트 출시에 해당합니다 이들은 장기간 지원되는 대형 릴리즈입니다 Android API 프레임 워크 변경 사항을 나타냅니다 해당 채널의 자동 업데이트 플래그 주요 버전에서 업데이트되지 않습니다 따라서 메이저 버전 1에서 시작한다면, 주요 버전 2가 출시 되더라도, 주요 버전을 기반으로 보안 업데이트를 계속받을 수 있습니다

1을 선택하면됩니다 두 번째 숫자는 부 버전입니다 이들은 상대적으로 위험도가 낮은 업데이트입니다 그들은 안드로이드 API 프레임 워크의 변경이 없으며, 하지만 Android Things API가 추가되었습니다 자동 업데이트 플래그를 반전하면 당신은 새로운 주요 버전에 걸쳐 업데이트를 얻을 것으로 기대할 수 있습니다

따라서 12에서 시작하면 다음 부 버전이 나올 때, 13으로 마이그레이션 할 것입니다 마지막 번호는 보안 업데이트입니다 대략 매달 착륙 할 것으로 예상됩니다

API를 변경할 필요가 없습니다 그리고 이러한 업데이트는 자동 업데이트로 확실히 증가합니다 에 플래그 주요 버전 업데이트는 선택 사항이지만 교환하는 동안 Google을 통해 무료 업데이트를 얻으려면, 우리는 당신이 당신의 버전을 업데이트 할 것을 기대한다 각 부 버전 및 보안 패치에 걸쳐

그러나 당신이하는 일은 당신에게 달려 있습니다 자동 업데이트 플래그를 뒤집거나, 또는 직접 업데이트를 푸시하십시오 Android Things를 가장 쉽고 재미있게 만드는 것이 우리의 목표입니다 밖에 IoT 플랫폼을 확보하십시오 – 빌드가 가장 쉽고, 평생 동안 가장 안전하고 최신입니다 귀하의 제품의

그렇다면 SoM 및 주요 버전에서 어떻게 작동합니까? 그리고 년? 각 SoM은 Google에서 최소 3 년 동안 지원합니다 처음 사용 가능하게 된 때부터 모든 주요 버전에서 그래서 당신이 IMX8 SoM을 구입한다면 주요 버전 1에서 건물 시작 향후 3 년 동안 업데이트를 기대할 수 있습니다 모두 주요 버전 1에 남아 있습니다 주 버전을 업데이트 할 필요가 없습니다

2 전체 지원 시간을 얻으십시오 물론, 우리는 많은 장치들이 3 년보다 훨씬 더 많은 지원이 필요할 것입니다 따라서 SoM에서 지원하는 경우 다음 주 버전으로 업데이트하고 더 긴 지원을 받으십시오 창문 당신은 물론 항상 자신의 업데이트를 푸시 할 수 있습니다

전체 평생 동안 기기에서 사용할 수 있습니다 마지막으로, 더 긴 지원을 원한다면 시간, 확장 된 지원을위한 몇 가지 옵션에 대해 이야기 해주십시오 AMY JANG : 좋습니다 그래서 우리는 업데이트를 추진했습니다 우리의 로봇은 이제 양말을 접을 수 있습니다

마지막으로해야 할 일은 뒤로 물러서는 것입니다 우리 로봇이 현장에서 어떻게하고 있는지 모니터링하십시오 얼마나 많은 사용자가 있는지 확인하고 싶을 것입니다 그들은 매일 내 장치를 사용하고 있습니까? 그들이 방금 들었던 업데이트를 받고 있습니까? 아니면 미국의 로봇이 한국의 로봇과 비교하면 어떨까요? Android Things 콘솔이 제공합니다 엔드 투 엔드 솔루션을 통해 장치 분석에 이르기까지 다양한 솔루션을 제공합니다

매일 활성화 및 활성 그래프, 제품 전반에서 장치가 작동하는 방식을 모니터링 할 수 있습니다 시간 범위와 필터를 사용하여보다 심층적 인 분석을 수행 할 수 있습니다 IP 국가별로 기기를 필터링 할 수 있으며, ID를 만들고 채널을 업데이트하는 등의 작업을 수행합니다 당신이 콘솔을 통해 OTA를 밀고 나서 한 시간 안에, 이 모니터 화면으로 올 수 있습니다 업데이트가 어떻게 진행되고 있는지, 오류가 있는지, 귀하의 기기는 어떤 단계에 있습니다

그리고 우리가 제공하는 세분성은 매 순간까지입니다 업데이트 확인과 같은 다양한 업데이트 이벤트를 모니터링 할 수 있습니다 다양한 다운로드 상태 이벤트, 마지막으로 재부팅 이벤트, 장치가 새 파티션으로 재부팅되었음을 알립니다 여기에 표시되는 상태 이벤트에 매핑 된 이러한 이벤트 이전에 Update Manager API에서 보았습니다 그리고 업데이트에 오류가있는 경우, 당신은 업데이트 오류 그래프를 모니터링 할 수 있습니다

업데이트 오류를 ​​드릴 다운합니다 코드를보고 무슨 일이 일어나는지 확인하십시오 이것은 내가 OTA를 강요 한 직후에 굉장합니다 이 그래프를보고 장치가 잘 작동하는지 확인할 수 있습니다 내가 푸시 한 릴리스가 부드럽게 끝나면 ADAM RODRIGUEZ : 좋습니다

따라서 제작을 업데이트하는 방법을 안내해 드렸습니다 필드에있는 장치 그러나 왜 당신이 신경 써야하는지에 대해 정말로 재촉 해 봅시다 Android 작업으로 IoT를 쉽고 안전하게 만드는 것이 우리의 목표입니다 우리는이 일에 많은 시간을 할애 할 필요가 없습니다

우리는 당신이 중요하게 생각하는 것들에 집중하기를 바랍니다 당신의 하드웨어와 소프트웨어, 그 것 귀하의 제품을 차별화합니다 그리고 펌웨어, 보안 패치에 대해 우리를 의지 할 수 있습니다 업데이트 인프라 Android Things를 사용하면 일반 Android를 사용할 수 있습니다

개발자는 물론 Kotlin 및 Android와 같은 친숙한 도구를 사용할 수 있습니다 사진관 동일한 기술을 활용하게됩니다 수백만 대의 장치를 업데이트하는 데 사용하는 매일 현장에서 델타 업데이트, 부분 업데이트, AB 파티션 및 향상된 모니터링

이 모든 것을 스스로 구축하는 것을 상상할 수 있습니까? 네가 할 수있을거야 하지만 무언가는 당신이 오히려 발전하고 있다고 말할 수 있습니다 업데이트 재 작성보다 새로운 기능 및 기능 하부 구조 중요한 보안 업데이트도 있습니다 Google의 제품 유지를위한 이상적인 방법입니다

당신의 개입없이 안전하게 지키십시오 몇 년 동안 길을 결국 우리는 정말로 업데이트가 가능한 안전한 IoT를 쉽게 구축 할 수 있습니다 신제품에 대한 많은 기회가 있다고 생각하십시오 이 공간에서의 아이디어

AMY JANG : 그리고 그걸로 우리는 당신에게 감사의 말을 전하고 싶습니다 프로덕션 업데이트 방법에 대한 우리의 강연에 참석 한 분 Android Things 콘솔이있는 현장의 기기 전에 말했듯이, 거기에는 많은 옵션이 있습니다 IoT의 경우 어떤 OS 및 하드웨어를 선택할 수 있습니다 하지만 안드로이드 코드 작성에 익숙하다면, Android 환경을 사용하면 쉽게 시작할 수 있습니다

많은 장치를 만들고 판매하려는 경우, 보안에 관심이 있다면, 필요한대로, 그리고 원하는 생산 장치를 쉽게 관리 할 수 ​​있으며, Android는 당신을위한 훌륭한 솔루션입니다 고맙습니다 [음악 재생]