Google I/O 2013 – The New Android SDK Build System

XAVIER DUCROHET : 안녕하세요 내 이름은 Xavier Ducrohet입니다

저는 Android SDK 개발자 도구의 선두 주자입니다 그리고 저는 새 빌드의 주된 기여자입니다 SDK에 대한 시스템입니다 왜 새로운 빌드 시스템인가? 음, 현재 상황을 보면 우리는 다소 최종 스크립트를 가지고 있습니다 맞춤 설정할 수 있지만 공개 API는 없지만 SDK를 업데이트 할 때마다 중단 될 가능성이 있습니다

반면에 ADT 커스터머 빌더는 매우 엄격합니다 적어도 IDE에서는 작동합니다 그리고 나서 우리는 [부적절한] 그 자신의 건축자가 있습니다 조금 더 유연하지만 많은 시간을 단축하지는 않습니다 병합, 일부 문제

그래서 우리는 그것을 고치고 싶습니다 우리는 하나의 빌드 시스템을 만들고 싶었습니다 유연한 방식으로 모든 이유가있다 그리고 우리는 여러분이 지속적인 통합 서버에서 구축 또는 IDE 내에서 IDE에서 사용자 정의가 작동하지 않는다면, 작동하지 않습니다

그것은 당신의 워크 플로우를 해치워 의존성과 같은 몇 가지 기능을 추가하고 싶었습니다 관리, 테스트 배포 및 실행 기능뿐만 아니라 개발자가 요청한 Android 관련 기능 우리는 처음부터 시작하고 싶지 않았습니다 그래서 우리는 주변을 둘러 보았다

많은 빌드 시스템이 있습니다 그들은 플러그인 생태계, Jenkins, TeamCity, 우리는 그 모든 것을 활용하고 싶었습니다 그래서 둘러 보았고 우리는 Gradle에 정착했습니다 왜 Gradle 이죠? 음, 사용자로서, 그것은 매우 강력합니다 위대한 선언적 구문

그러나 당신은 당신의 필요에 맞게 사용자 정의 할 수 있으며, IDE 통합을위한 툴링 API 우리의 관점에서, 우리가 플러그인을 개발할 때, 우리는 새로운 도메인 관련 언어를 만들어서 빌드 시스템의 구성 Android와 매우 관련이 있습니다 Google은 귀하에게 훌륭한 API를 제공 할 수 있습니다 빌드 시스템을 확장하십시오 또한 IDE 통합을 사용자 정의하여 IDE 정말로 알지 못합니다

헤이, 일종의 빌드입니다 시스템이지만 실제로는 Android 빌드 시스템입니다 또한 Gradleware라는 회사에서 개발했습니다 디자인 된 오픈 소스 아파치이기 때문에 우리에게 좋습니다

그리고 우리는 함께 협력하여 시스템 Gradle 자체는 기능을 추가합니다 최상의 경험을 줄 수 있어야합니다 당신에게 개발자 그래서 저는 많은 사람들이 Gradle을 알지 못한다고 생각합니다 어쩌면 조금만 시도해 보셨을 것입니다

그래서 몇 가지 기본 사항부터 시작하여 간단한 프로젝트 따라서 매우 간단한 Java 프로젝트를 살펴보면 먼저 구성은 buildgradle이라는 파일에 있습니다 프로젝트 루트에서 찾을 수있는 buildxml 또는 pom

xml을 빌드하면 그것은 Ant 또는 Maven과 함께합니다 간단한 선을 사용하면 할 수있는 일은 기본을 구축하는 것입니다 코드를 생성하고 JAR 파일을 생성하고, 테스트 코드를 작성하고, 테스트를 실행하고 XML 파일을 출력하십시오 Jenkins 서버에 피드를 보내 일부 추세를 얻을 수 있습니다 대시 보드 및 로컬 HTML 보고서를 사용하여 동일한 결과 얻기 워크 스테이션에서 테스트를 실행할 때

동일한 Android 프로젝트는 좀 더 복잡합니다 하지만 그렇게 나쁘지는 않습니다 정말로 따라서 빌드 스크립트의 첫 번째 섹션은 플러그인이있는 곳의 Gradle 우리가 여기서 말하고있는 중이 야

여기에 유물이 있습니다 그냥 수업 경로에 올려 놓으십시오 Gradle 개발자가 미래, 그래서 조금 덜 장황하다 그래서 우리는 우리가했던 것처럼 플러그인을 적용합니다 Java 플러그인 용

그리고 세 번째 블록은 실제로 안드로이드 플러그인의 구성 여기에는 두 가지 속성이 있습니다 첫 번째로, compileSdkVersion은 무엇입니까? 당신은 projectproperties에서 target으로 사용할 것입니다 타겟, 타겟 SDK 버전이 있기 때문에 이름을 변경했습니다

거기에 약간의 혼란 그리고 나서 나중에 이야기 할 두 번째 속성입니다 그럼 그걸로 뭘 할 수 있니? APK를 만들 수 있습니다 테스트 APK를 구축 할 수 있습니다 이전에는 별도의 테스트 프로젝트를 사용 했었습니다

그것은 단지 유연하지 않습니다 우리는 그것을 찾아야한다 관계를 찾기가 너무 어렵습니다 두 프로젝트 사이 그래서 메인 프로젝트로 돌아 왔습니다

이 두 APK를 배포하고 모든 번호에서 테스트를 실행할 수 있습니다 연결된 장치의 그것들을 병행하여 실행할 것이고, 당신은 똑같은 두 가지를 얻을 것입니다 출력 – XML과 HTML 이미 Ant 스크립트보다 더 많은 작업을 수행합니다 당신이 알아 차렸 듯이, 나는 아무것도 구성하지 않았습니다

구성에 대한 규칙입니다 원본 폴더의 경우 규칙적인 규칙입니다 메인 코드를 가지고 있기 때문에 Java 프로젝트 및 테스트 코드 소스 및 소스 테스트에 있습니다 Android에서는 동일한 규칙을 다시 사용합니다

우리는 그것을 조금 확장합니다 더 많은 파일이 있습니다 그래서 소스 메인, 우리는 안드로이드 매니페스트, XML을 추가합니다 자원과 자산을 추가합니다 AID를 이동하고 스크립트 파일을 실행합니다

자신의 폴더 아래에 그런 다음 테스트 측에서 해당 계측기 테스트를 호출합니다 우리는 실제 실제 지역에 대한 테스트를 계속하고 싶었습니다 [? JUnit?] 테스트 우리는 거기에 명단이 없습니다 자동으로 생성됩니다

나중에 얘기하겠습니다 좋아, 너의 구조 야 자, 어떻게 그걸 달리는거야? 오, 기다려 그래서 낡은 프로젝트가 있다면 아마도 그 모든 것들로 돌아가서 당신의 것을 바꾸고 싶지는 않습니다 그냥 Gradle을 시험해보기위한 프로젝트입니다

그래서 이것은 현재 프로젝트를 구성하는 방법입니다 Gradle에게 내 구조라고 말해야 해 여기 아주 간단합니다 다시 말하지만 Android 블록에는 sourceSet이 있습니다 그리고 그것은 sourceSet의 컨테이너입니다

그리고 내부에서는 메인과 장비 테스트 따라서 우리 악기 테스트에서 우리가하는 일은 setRoot입니다 우리는 모든 것을 테스트 할 소스 / 악기 테스트 그래서 / Java, 테스트 / res 등등 주요 소스 세트에 대해 res

srcDirs 그리고 그것은 사실 대괄호로 [비 숙련 된] 것입니다 실제로 우리가 현재 지원할 수 있기 때문입니다 여러 res 폴더 그래서 원한다면 원천을 정리할 수 있습니다

그리고 나서 우리는 그것들을 병합하고, 중복을 탐지하고, 그리고 옳은 일을하십시오 좋아요, 그래서 Gradle을 실행하십시오 일단 Gradle을 설치하면 프로젝트로 이동합니다 루트, 그리고 당신은 단지 Gradle과 일부 작업 이름을 수행합니다 작업을 얻으려면 작업이라는 태스크가 있습니다

작업 목록 대시 대시를하면 모든 것을 얻을 수 있습니다 당신이 아마 신경 쓰지 않는 중간 작업 그리고 정말로 복잡한 프로젝트에서, 그것은 50이 될 것입니다 작업, 또는 그와 비슷한 것

당신은 그 모든 것을 신경 쓰지 않습니다 당신은 그들 중 4 명을 돌 봅니다 assemble은 프로젝트 결과물을 만듭니다 수표가 귀하의 모든 수표 및 테스트를 실행합니다 Build는 조립 및 테스트를 모두 수행합니다

이것은 제품을 만드는 것이입니다 그것은 그것을 구축하고 테스트하는 것입니다 그런 다음 깨끗하게 청소합니다 여기서 재미있는 점은 작업은 실제로 아무 것도하지 않습니다 저는 그것들을 앵커 작업이라고 부릅니다

플러그인은 갈 것이고 그 밑에 플러그를 꽂는 것과 같은 종류 일 것입니다 사용자가 조립한다고 말하면 다음과 같은 작업이 있습니다 너는 실제로 전화해야한다 예를 들어 자바 프로젝트는 다른 작업을하고 있습니다 JAR을 빌드하고 테스트를 실행하려면 테스트하십시오

즉, 다른 플러그인을 적용 할 때 [INAUDIBLE], FindBug 플러그인이 있습니다 그것의 일이 무엇인지 신경 써야합니다 방금 check를 호출하면 test, FindBugs main이 호출됩니다 및 FindBugs 테스트 따라서 매우 강력하고 확장 성이 뛰어납니다

무슨 일이 일어나고 있는지 알고 싶다 그래서 안드로이드에 대해서도 똑같은 일을합니다 우리는 모여서 수표를 가지고있다 connectedCheck 및 deviceCheck 그리고 이것이없는 이유는 장치, 장치로 테스트

나중에 얘기하겠습니다 차이점 중 하나는 실제로 조립할 것입니다 두 가지 버전 [INAUDIBLE] 릴리스의 디버그가 있습니다 앤트 릴리스와 디버그

여기를 제외하고 실제로 두 가지를 모두 빌드 할 수 있습니다 Ant가 실행되는 동안 병렬로 만들어야합니다 서로 무시하십시오 좋아, 그럼 사용자 정의에 대해 조금 이야기 해보자 그래서 우리는이 새로운 빌드 시스템을 구축하고 있습니다

가장 기본적인 맞춤 설정은 일부 속성을 재정의하려고합니다 예를 들어 여기에는 defaultConfig 객체가 있습니다 헤이라고하는 안드로이드 개체, 나는 버전을 할거야 코드 및 minSdkVersion 등이 있습니다 따라서 빌드 할 때 해당 값이 당신의 매니 페스트와 그 위대한입니다

당신은 아마도 궁금해 할 것입니다, 음, 왜 제가 그 일을하고 싶습니까? 실제로 그 값들을 내 매니페스트에 넣을 수 있습니까? 자, 당신이 야간에 건축을하고 싶다고 상상해보십시오 점진적으로 버전 코드를 늘리고 싶습니다 그래서 들어가는 스크립트를 만들 수 있습니다 어떻게 든 해킹 할 수 있습니다 주위에 당신의 매니 페스트, 그리고 뭔가, 그리고 아마 아주 좋은하지

여기 Gradle을 사용하면 우리가 뭔가를 할 수 있습니다 그 버전 코드를 얻을 수있는 새로운 함수를 만든다 Jenkins에서 예를 들어, 시스템 속성 또는 [알아들을 수 없는] 그런 다음 버전 코드에 삽입하면됩니다 그리고 그것은 항상 작용할 것입니다

함수가 실제로 -1을 반환하면 기본값은 바탕 화면에서 실행 중일 때입니다 값은 삽입되지 않습니다 따라서 사용자 정의 로직을 수행 할 수 있지만 여전히 매우 유용합니다 선언적 나는 단지 1 분 전에 언급했다

빌드 된 디버그 및 릴리스 그리고 많은 개발자들이 우리에게 다음과 같은 것을 요청했습니다 ProGaurd를 디버그로 실행하고 싶습니다 제발 할 수 있을까요? 그리고 그것이 같았 기 전에, 우리는 그것을 다시 할 수 없습니다 그래서 우리는 그것을 보았고 우리는 우리가 할 것이라고 말했습니다 정말 유연한 무언가

그래서 우리는 빌드 유형의 개념을 도입했습니다 빌드 유형은 애플리케이션을 패키지하는 방법과 어떤 옵션은 디버그 가능하고, 어떻게 서명되며, ProGaurd를 실행합니까? 그리고 내장 디버그 및 내장 릴리스부터 시작합니다 하나,하지만 새로운 것을 만들 수 있습니다 여기에 DSL이 있습니다 Android 객체 내부에는 매우 유형 객체를 빌드하십시오

그것은 또한 컨테이너입니다 우린 그걸 봤어 우리는 세트를 보았다 우리는 그것을 다시 사용할 것입니다 우리가 가지고있는 전형적인 패턴입니다

그리고 그 안에 우리는 디버그 속성을 구성합니다 그리고 우리는 디버그 빌드 유형의 일부 속성을 설정합니다 그리고 우리는 몇 가지 속성을 설정했습니다 그리고 그 중 하나는 패키지 이름 접미사입니다 따라서 디버그로 빌드 할 때마다 패키지가 무엇이든간에 귀하의 응용 프로그램의 이름입니다,에서 디버그를 추가합니다 패키지의 끝 부분을 사용하여 나란히 공부할 수 있습니다

귀하의 릴리스 응용 프로그램 그리고 접미사 이름은 접미사 확장을 위해서만 사용됩니다 그것은 많은 개발자들이 우리에게 요청한 것입니다 그런 다음 Play Console에서이 새로운 기능을 사용할 수 있습니다 베타 버전을 가질 수 있습니다

그리고 실제로 특정 베타 버전을 구축하려고합니다 그 테스터들에게 따라서 새로운 베타 테스트를 만들 수 있습니다 여기에서는 몇 가지 속성을 추가하고 있습니다 그리고 그것은 훌륭합니다

그러나 그것은 충분하지 않습니다 베타 버전을 맞춤 설정해야합니다 따라서 각 빌드 유형에 대해 사용자 지정 원본 폴더 예를 들어 베타 버전에서는 베타 테스트이므로 사용자의 통계에 대한 통계를 수집하려고합니다 귀하의 신청서를 사용하고 있습니다

그러면 어떻게해야합니까? 음, 소스 / 베타 / 자바에서, 당신은 단지 몇 가지 코드를 넣어 이 코드는 베타 버전과 함께 제공됩니다 베타 버전 만 빌드 할 때마다 릴리스 및 디버그 버전이 아닙니다 보낼 수 있으려면 인터넷 권한이 필요합니다 그 데이터

어쩌면 일반 응용 프로그램에 인터넷 허가 따라서 매니페스트에서 수동으로 가져 오는 대신 시간과 그것을 제거하는 것을 잊어 버리는 것은 위대하지 않다 베타, 안드로이드 매니페스트에 넣으십시오 빌드 할 때 메인 매니페스트에 병합됩니다 베타 버전

그리고 당신이 가진 것들과 같은 것들에 대해서도 그것을 사용할 수 있습니다 MapView API 키 및 출시시 다른 API 키가 필요함 디버깅은 구성에 서명하는 것과 관련되어 있기 때문에, 글쎄, 당신은 단지 그 폴더의 res 폴더에 넣을 수 있습니다 다른 빌드 유형 그리고 물론, 당신은 할 수 있어야합니다 베타 버전을 빌드하십시오

그래서 어셈블 및 디버그 어셈블 링은 다음과 같습니다 에서 오는 추가 할 때마다 자동으로 생성됩니다 새로운 빌드 유형 따라서 실제로 세 가지 버전을 모두 동일하게 사용할 수 있습니다

시간을 갖고 그들을 구축하십시오 괜찮아 그래서 서명은 빌드 유형의 일부라고 말했어 구성 그래서 우리는 여기서 일을 매우 유연하게 만들고 싶었습니다

서명 구성 컨테이너가 있습니다 서명 설정은 KeyStore의 위치에 있으며, 암호, 알다시피, 열쇠의 이름 디버그라는 기본 버전이 있습니다 여기 간단한 예제에서 우리가하는 일은 우리가하는 것입니다 Gradle에게 디버그 서명 구성하기 구성 및 루트에있는 KeyStore 사용 그렇게해서 내 프로젝트, 팀원 모두 또는 빌드 서버는 항상 다음과 같이 빌드됩니다

같은 디버그 KeyStore 그리고 귀하의 품질 관리가 시도 할 때 문제가되지 않습니다 다른 빌드에서 오는 것을 설치하십시오 그게 당신이해야 할 전부입니다 디버그 빌드 유형은 다음으로 자동 구성됩니다 특정 서명 구성을 사용하십시오

조금 더 복잡한 예제를 보도록하겠습니다 애플리케이션의 출시 버전이 있다고 가정 해 보겠습니다 어쩌면 당신이 가지고 있기 때문에 당신의 디버그와 다릅니다 그것을 말해주는 일부 속성, 이봐, 내 일부 테스트 서버 대신 프로덕션 서버 ProGuard를 사용하고 있습니다

나는 모호하고 많은 일을하고 있습니다 그리고 그 버전을 테스트하고 싶습니다 디버깅하고 싶습니다 어떻게해야합니까? 글쎄, 당신이 할 것이고, 당신은 새로운 빌드 타입을 만들 것이고, 예를 들어, 디버그 릴리스라고 부릅니다 InitWith는 릴리스 빌드 유형으로 초기화합니다

따라서 릴리스 빌드를 변경하고 갈 때마다 유형의 경우 디버그 릴리스로 복사됩니다 그리고 우리는 뭔가를 사용자 정의합니다 그래서 우리는 디버깅이 가능하다고 말합니다 패키지 이름에 접미어를 추가하여 설정할 수 있는지 확인합니다 그것은 귀하의 릴리스 버전과 병렬로

그런 다음 디버그 서명 구성을 지정하여 그것을 구축 할 수 있습니다 그런 다음 sourceSet을 변경하여 source / release, 당신이 거기에 넣는 것과 마찬가지로, 디버그 릴리스를 빌드하십시오 그리고이 몇 줄을 사용하면 갑자기 새로운 정확하고 항상 응용 프로그램의 버전 정확히 귀하의 릴리즈와 동일하지만, 그것을 디버깅 할 수 있습니다 ProGuard 사용자 정의가 필요하다면, 또한 해당 버전의 경우 일부 규칙을 사용하지 않거나 사용 설정하거나, 너 그렇게 할 수있어 하지만 기본적으로 모든 규칙을 선택합니다

버전이 사용합니다 나는 그 예에 대해서 정말로 좋아한다 선언적이라고 보여주지 않습니다 하지만 init은 여기에 원시 타입을받지 못한다 실제로 buildtypes

release를받습니다 실제로는 유형 빌드 유형의 객체입니다 따라서 빌드 유형 내부에서 매번 컨테이너, 릴리스 사용 또는 디버그 또는 베타, if 그 특정 객체가 존재하지 않으면, 우리는 빌드 유형 인스턴스 그리고 우리는 그것을 용기에 담았습니다 그래서 여기서 정말로하고있는 것은 단지 나중에 읽을 속성 모음과 그 파일을 파싱하고 무언가를 만드는 무언가

모든 라인은 실제로 실제 모델을 조작합니다 그리고 그것은 매우 중요하고 매우 강력합니다 즉, 릴리스, 베타, 디버그, 디버그 릴리스 그것은 그들 중 많은 것입니다 그리고 아마도 패키지의 접미사를 넣고 싶지 않을 것입니다

그들 모두에 수동으로 이름을 붙이십시오 프로그래밍 방식으로 할 수 있다면 어떨까요? 글쎄, 그냥 그렇게해라 모든 빌드를 구성한 Android 블록 이후 유형을 만들고, 그냥 빌드 유형을 반복하고 자동으로 패키지 이름 정말 흥미로운 점은 기본적으로 그 모델을 구축하십시오 그리고 구성 된 모델은 다음 중 IDE로 전송됩니다

프로젝트를보고 할 때 IDE 통합 따라서 패키지 이름 접미사를 설정하는지 여부 수동으로 또는 일부 논리, 루프 또는 어쩌면 당신은 말합니다, 이봐 요, 우리는 단지 월요일에 그것들을 추가하고 싶습니다, 당신이하고있는 일이 무엇이든간에 그것은 단지 일할 것입니다 IDE는 현재 진행중인 작업을 인식합니다 최종 구성된 모델을 얻습니다 그리고 그것은 매우 강력합니다

그렇게하면 IDE에서 모든 것을 알 수있게됩니다 해당 모델을 기반으로하는 프로젝트 그러나, 당신이 사용하는 논리가 무엇이든간에 실제로 구성하십시오 좋아, 의존성을 살펴 보자 그것은 많은 개발자들이 요구 한 것입니다

그래서 Gradle은 기본적으로이를 지원하므로 그로부터 이익을 얻으십시오 따라서 의존성에 대한 네 가지 범위가 있습니다 컴파일, 런타임, 그것은 당신의 주요 소스 코드를위한 것입니다 그리고 런타임은 항상 컴파일을 확장합니다 컴파일 할 때 의존성이 있다면 런타임 자동으로 가져옵니다

그리고 테스트에도 똑같습니다 지금까지 안드로이드는 약간 다릅니다 런타임이 패키지로 바뀌 었습니다 정말로 우리가하는 일 APK에 모든 의존성을 패키징합니다

그런 다음 기기 테스트를 테스트하여 항상 계측 테스트 그럼 베타 버전으로 돌아가 죠? 우리는 통계를 사용자에게 보내려고합니다 몇 가지 라이브러리를 사용하여 도움을 원한다고 가정 해 봅시다 음, 컴파일시에 추가하면, 릴리스에는 해당 라이브러리도 있습니다 그리고 당신은 그렇게하고 싶지 않습니다

그래서 우리는 당신의 빌드 타입을위한 스코프를 가지고 있습니다 그래서 여기에서는 빌드 유형 컴파일 범위에서만 말하자면, 저는 [INAUDIBLE]을 사용합니다 또는 그런 것 그리고 그 빌드 유형에만 해당됩니다 그래서 당신이 Gradle에 의존하는 방법입니다

종속성 개체가 있습니다 컴파일은 범위입니다 그런 다음 당신이 가지고있는 의존성이 무엇이든간에 그것을 제공하십시오 여기서 우리는 오래된 프로젝트를 가지고 있고 내 libs 프로젝트에서 JAR 파일링, 그건 당신이하는 일입니다 [알아들을 수 없는] lib에있는 모든 JAR 파일 현재 프로젝트를 마이그레이션하는 데 매우 유용합니다

따라서 원격 종속성을 사용하려는 경우, 이것이 당신이하는 일입니다 먼저, 사용할 저장소를 지정하십시오 그래서 여기에 우리는 mavenCentral을 말합니다 그러나 만약 당신이 말할 수 있습니다 사용자 정의 내부 이슈 저장소, 거기에 URL을 넣을 수 있습니다

메이븐 (Maven)이든 아이비 (Ivy)이든 관계없이 지원합니다 문제가 아니다 그런 다음 의존성 블록에서 계측기 테스트 컴파일하면 이슈 주소를 알 수 있습니다 그리고 여기 우리는 광장에서 페스트 안드로이드를 사용합니다 좋은 주장과 테스트 결과를 얻을 수 있습니다

그런 다음 베타 컴파일이 로컬 JAR을 사용하는 방법에 주목하십시오 따라서 종속성 관리를 사용하고 싶지 않습니다 Maven 또는 로컬 JAR 파일을 사용하면 네가 가진 것에 따라 Gradle은 매우 유연합니다 네가 원하는대로 쓸거야

그래서 다른 사람의 코드를 사용하는 것입니다 자신 만의 코드를 사용하려면 약간 다릅니다 첫째, 다중 프로젝트 설정이 필요합니다 우리가 전에는 갖지 못한 것이 었습니다 Eclipse는 실제로이를 지원하지 않으며 [INAUDIBLE] 당연하지

그래서 여기에, 우리가 가진 것은, 우리는 세 가지가 있습니다 다른 패키지 모듈 app, lib1, lib2가 있습니다 그들은 모두 자신 만의 buildgradle을 가진 자신의 프로젝트입니다

그리고 settingsgradle이 있습니다, 여기에 모든 것이 있습니다 다른 모듈 그리고 의존성에 대해서, 당신은 단지, 이봐, 나는 프로젝트와 프로젝트 경로를 포함하십시오 그래서 매우 유사하고 매우 쉽습니다

따라서 도서관 1은 도서관 프로젝트가 될 수 있습니다 그리고 나서 lib2는 JAR 파일과 같을 수 있습니다 그리고 lib1이 lib2에 의존한다면 물론, 앱은 transitively 당신의 의존성 그래서 lib1이 라이브러리 프로젝트라면, 이것은 여러분이 도서관 프로젝트를 선포하십시오 일반 프로젝트와 정확히 동일합니다

그것은 같은 플러그인입니다 하나의 플러그인 만 있으면됩니다 그것은 오직 하나의 메이븐 인공물을 가지고 있습니다 내부에는 두 개의 플러그인이 있습니다 그리고 플러그인 이름은 다르지만 정확하게는 일반 프로젝트와 동일합니다

DSL은 약간 다릅니다 제한 그러나 나는 그것에 대해 자세하게 설명하지 않을 것입니다 그렇다면 도서관 프로젝트는 무엇을합니까? 현재 그들이하는 것과 매우 유사합니다 우리에게는 새로운 것들이 있습니다

첫 번째로, 마침내 우리는 바이너리를가집니다 그들 포장 그래서 우리는 모든 것을 AAR 형식으로 포장합니다 단지 Zip 파일 일뿐입니다 번들입니다

그리고 그것을 저장소에 업로드 할 수 있습니다 [박수 갈채] XAVIER DUCROHET : 오랜 시간이 다가왔다 우리가 지원하는 다른 것, 우리는 자산에 대한 지원을했습니다 라이브러리에 자산 만 넣으면됩니다 응용 프로그램에 병합됩니다

ProGuard 규칙이 있습니다 예를 들어, 라이브러리에 특정 난독 화해서는 안되는 클래스 ProGuard 특정 파일을 유지하라는 파일 그리고 해당 라이브러리를 사용하는 응용 프로그램이 실행될 때마다 ProGuard는 또한 ProGuard 규칙을 활성화하여 예를 들어 클래스가 난독 화되지 않습니다 우리는 아직 린트 (Lint) 통합이 없지만 추가하자 마자 우리는 사용자 정의 린트 (Lint) 규칙과 같은 일을하고 싶다면 if 당신은 당신이 확신하고 싶어하는 맞춤형 API를 가지고있다

사람들이 제대로 사용하면 몇 가지 규칙을 가질 수 있습니다 다른 메타 데이터를 추가하여 라이브러리를 사용하면 툴에서 더 나은 경험을 할 수 있습니다 체인에서 IDE를 사용하는 것이 좋습니다 좋아요, 그래서 도서관 프로젝트는 무료 대 지불과 같은 일을하고 싶습니다 그리고 훌륭합니다

이제 Google Play에서 여러 APK 지원을 통해 예를 들어 다른 APK를 타겟팅하는 경우 이전 버전의 Android 또는 최신 버전의 Android ARM을 MIPS 대 x86을 타겟으로한다면 그러나 세 가지 또는 모든 조합을 사용하려면 도서관 프로젝트를 처리 할 수 ​​없게된다 그래서 우리는 변종을 만들었습니다 따라서 제품 향미의 개념은 귀하의 신청? 그래서 다른 응용 프로그램을 지원할 것입니다 패키지 이름이 같은지 아닌지에 따라 다릅니다

무료 대 지불 여부 그리고 그것은 맞춤식 것들을 할 것입니다 그래서 그것은 정말 다른 것과 같습니다 빌드 유형에서 차원 빌드 유형과 결합됩니다

그래서 여기에 그것들을 만드는 방법이 있습니다 우리는 풍미 컨테이너 제품을 가지고 있습니다 그리고 새로 만들 수 있습니다 그래서 여기에 두 가지 flavor, flavor1, flavor2를 만듭니다 일부 패키지를 지정합니다

그들 중 하나는 말합니다, 이봐, 나는 다른 minSDK 버전을 원한다 다른 하나는 minSDK 버전을 자동으로 나타납니다 그리고 물론 당신은 다른 것을 가지고 싶습니다 그 안에있는 코드, 맞죠? 무료 버전에는 특정 코드가 있습니다 무료 및 유료 버전을 지불해야합니다

따라서 각각의 경우에 새로운 소스 폴더도 생깁니다 별도로 테스트하기 때문에 별도의 테스트 폴더 광고에 의해 지원되는 무료 버전이있는 경우 AdMob SDK에 대한 의존성을 추가하고 싶습니다 예를 들어, 유료화에 넣고 싶지는 않습니다 버전도 있으므로 범위가 다릅니다

여기에서 우리는 모든 범위에 대해 많은 범위를 가질 것입니다 응용 프로그램 기본적으로 빌드를 기반으로 그들과 함께 모든 당신의 의존성을 넣어 중요한 부분은, 만약 당신이 맛, 그리고 당신이 디버그 및 릴리스 빌드 유형을 가지고, 당신은 디버그 및 릴리스 응용 프로그램 맛이 있다면, 그것은 실제로 행렬이며, 우리는 모든 것의 조합

그래서 flavor1과 flavor2가 있다면, 당신은 가질 수 없습니다 그냥 디버그 빌드 더 이상 아무 의미가 없습니다 flavor1 debug 또는 flavor2 debug 중 하나입니다 그래서 당신은 맛이 있다면 그것은 매우 유용합니다 [? 보내

?] 이제 x86과 MIPS를 결합하려는 경우 ARM과 비교해 볼 때 실제로 작동하지 않는 것은 맞습니까? 그래서 우리는 풍미 차원을 ​​가지고 있습니다 그러나 DSL에서 그룹을 호출했습니다 우리는 이름을 변경해야 할 수도 있습니다 그래서 이것은 정말로 다른 차원입니다 – 그래서 한 차원은 ABI, x86 대 ARM입니다 그리고 다른 하나는 버전입니다

유료 또는 무료입니다 그리고 여기에서는 두 개의 ARM을 생성하고이를 두 개의 ARM에 할당합니다 특정 차원 따라서 ARM1이 패키지 이름을 사용자 정의하지 않는 방법에 유의하십시오 그것은 당신과 같은 버전이기 때문입니다

응용 프로그램, 유료 버전은 자체 패키지 이름 그래서 모든 것을 조합 할 것입니다 첫째, 결국 패키지가 많이 생깁니다 그리고 당신은 그것들을 자동으로 얻습니다 새로운 차원을 추가하거나 무언가를 추가하면 그 모든 것을 당신을 위해 생성하십시오

복잡한 작업이기 때문에 우리가 모든 것을 결합한 모든 다른 방법을 이해하십시오 치수– 빌드 유형 및 제품 풍미의 다른 차원 따라서 최대 4 개의 다른 소스 폴더를 만들 수 있습니다 예를 들어, 특정 예제에서 그래서 그들은 모두 마치 마치 존재하는 것처럼 간주 될 것입니다

하나의 원본 폴더 그리고 모든 것을 하나의 SDK에 결합합니다 리소스가 있다면 오버라이드 메커니즘 만 사용합니다 그래서 우리는 귀하의 기본 자원으로 시작합니다 우리는 그 위에 맛을 덮어 씁니다

그런 다음 빌드 유형을 덮어 씁니다 그리고 그것은 입술과 자산을위한 것입니다 그리고 도서관이 있다면, 그들은 주요 도서관 아래에있을 것입니다 하나, 그리고 그것들은 모든 것에 의해 무시 될 것입니다 구성에 서명하면 여기에 약간의 유연성이 있습니다

우선 순위입니다 따라서 가장 우선 순위가 높은 순서는 빌드 유형이며, 그리고 당신의 주요 구성 여기서 흥미로운 점은 디버그 빌드 유형에는 기본 디버그 구성 따라서 모든 디버그 빌드 유형이 서명됩니다 같은 열쇠로 릴리스의 경우 서명 구성을 릴리스 빌드 유형, 모든 릴리스가 함께 서명됩니다

같은 열쇠 하지만 그렇게하고 싶지 않으면 아마 유료 및 무료 서명 키가 필요합니다

그런 다음하지 마세요 빌드 유형에 서명 구성을 지정하고 그것은 대신에 맛 그리고 나서 그것은 선택 될 것입니다 그리고 여러분은 두 가지 다른 서명이 다를 수 있습니다 버전의 앱

패키지 이름 때문에 많은 방법이 있다는 것을 알았습니다 패키지 이름 사용자 정의 그래서 우리는 기본 Android로 시작합니다 매니페스트의 패키지 이름 재정의가 다른 구성이있는 경우 그것, 우리는 대신 이것을 사용합니다 맛이 있다면 이걸 가져 가세요

그리고 나서 우리가 가지고있는 패키지를 알아낼 때, 빌드 유형에 하나가 있으면 접미사를 추가합니다 그러나 R 클래스를 생성 할 때는 항상 src / main / AndroidManifestxml의 패키지 이름 그래서 당신이 어디든 당신의 모든 수입을 항상 같은 것 전환 할 필요가 없습니다 다른 응용 프로그램을 생성 할 수 있습니다

패키지 이름 그러나 모든 수입은 항상 동일합니다 이제 테스트에 대해 이야기 해 봅시다 나는 여기저기서 시험을 언급했다 그래서 빠른 요약을 해봅시다

테스트 용 소스 폴더와 flavor 별 소스 폴더가 있습니다 당신은 풍미를 사용합니다 종속성 범위가 있습니다 종속성 범위는 테스트 및 한 가지 맛 매니페스트를 생성합니다

그리고 지금 우리는 왜 우리가 생성하는지 이해할 것입니다 그 매니페스트는 6 가지 다른 여섯 가지 패키지가있는 응용 프로그램은 테스트를 위해 여섯 가지 매니페스트를 유지하고 싶습니다 신청 테스트 애플리케이션의 매니페스트는 실제로 참조됩니다 테스트중인 패키지

그래서 그것은 유지하는 것이 많을 것입니다 테스트 응용 프로그램의 패키지 이름은 패키지 이름을 기반으로 자동 생성 테스트 된 애플리케이션 테스트 당 하나의 테스트 앱을 갖게 될 것입니다 신청 그래서 지금은 하나의 빌드 유형으로 만 테스트합니다 따라서 기본적으로 디버그를 구성 할 수 있습니다

우리는 아마도 그것을 미래에 바꿀 것입니다 하지만 지금은 단지 하나입니다 그리고 마침내 도서관 프로젝트는 APK가 아닌 AAR 만 출력하면 테스트 할 수 있습니다 도서관 프로젝트 내부에서 outputs은 테스트 APK입니다 그러면 라이브러리가 라이브러리에 포함되므로 라이브러리를 테스트 할 수 있습니다

라이브러리를 별도로 제공하고 원하는 경우 APK 내부에서도 사용할 수 있습니다 알았어 건물에 관한거야 시험을 치는 것은 어떨까요? 그래서 약간 복잡합니다 그리고 우리는 그것을 들여다 보았다

그리고 우리는 실제로 세 가지 시나리오 첫 번째 시나리오는 장치가 없다는 것입니다 나는 단지 뭔가 시험하고 싶다 그리고 우리는 그것을 일반 Gradle에서 작업을 확인하십시오 따라서 당신은 당신이 거기에서 달릴 수있는 것에 국한 될 것입니다

다른 것과 같이 정적 분석을 실행할 수 있습니다 FindBugs와 모든 링크 Robolectric을 사용한다면, 다음과 같이 할 수 있습니다 그들도 거기에 가라 두 번째 시나리오는 제 책상에 앉아있는 개발자입니다

내 전화가 내 워크 스테이션에 연결되어 있습니다 어쩌면 태블릿 일 수도 있습니다 나는 뭔가를하고 싶다 그래서 이것이 연결된 수표입니다 연결된 장치를 찾고 실행합니다

모든 것을 병렬로 처리하여 결과를 얻으십시오 OK, 세 번째 시나리오는 빌드 서버입니다 여기에 실제로 연결된 장치가 없어야합니다 빌드 서버에 직접 연결하십시오 몇 가지 문제

첫째, 잘, 당신은 하나 이상의 빌드 서버를 가질 수 있습니다 그래서 그것은 문제입니다 더 많은 장치를 사용할 수있게 될 것입니다 병렬로 빌드하면 계측을 실행할 수 없습니다 UI를 평행하게 테스트하는 테스트입니다

일하지 않을거야 우린 어떤 종류의 대기열이 필요합니다 맞습니까? 그래서 우리는 주변을 둘러 보았고 실제로는 두 가지가 있습니다 시나리오, 하위 시나리오 첫 번째 것은 장치 랩을 가지고있는 것입니다

그리고 대기열 시스템이 있습니다 그리고 빌드 시스템은 무언가를 만든 다음 대기열에 넣습니다 그리고 당신은 장치를 가지고 있고 그것을 테스트합니다 그리고, 원격 대시 보드를 갖게 될 것입니다 젠킨스 시스템이 될 수는 없어

테스트를 실행합니다 그래서 당신은 다른 대시 보드를 얻을 것입니다 하지만 그렇게 할 수 있습니다 우리가 여기에서 중요하다고 생각하는 한 가지는 당신이 젠킨스가 빌드 한 후에 헤이, 뭐라고 말하고 싶지 않아 출력? 젠킨스 (Jenkins) 때문에 출력물을 가져다가 어딘가에 업로드합니다

내가 만든 빌드 변종에 대해 알지 못한다 얘기 했어 그래서 당신은 그것을 인식하고있는 빌드 시스템을 갖고 싶습니다 실제로 밀어 붙이십시오 따라서 새 빌드 변형을 추가하거나 제거 할 때마다, 돌아가서 구성 할 필요가 없습니다

젠킨스의 인스턴스 그래서 우리는 API를 만들었습니다 그리고 테스트 서버 API라고 부릅니다 그리고 APK를 어딘가에 업로드 할 수 있습니다 구현하기가 매우 쉽습니다

그래서 자신 만의 테스트 랩을 가지고 있다면 그것을 구현할 수 있습니다 테스트 랩을 갖고 있지 않다면 밖에있는 서비스들 Testdroid는 하나입니다 AppThwack은 하나입니다 둘 다 샌드 박스에 있습니다

그래서 가서 그들과 이야기해야합니다 그리고 우리는 그 사람들과 협력하여 그들은 플러그인을 만들고, 우리는 플러그인과 통합합니다 두 번째 시나리오는 글쎄, 만약 당신이 [INAUDIBLE] 장치 또는 에뮬레이터는 일반적으로 에뮬레이터가 될 것입니다 직접적으로 그리고 필요시 실행됩니다 그래서 여기에 또 다른 API가 있습니다

매우 간단합니다 우리는 장치 목록을 얻습니다 그리고 각 장치에 대해 우리는 그들과 연결합니다 에뮬레이터는 실제로 시작하는 것입니다 그런 다음 설치하고 테스트를하고 드롭합니다

실제로 우리는 지역 결과를 가지고 있습니다 그리고 다른 회사들이 그렇게하고 있습니다 그 중 하나가 Manimal입니다 샌드 박스에 있습니다 그래서 당신은 그들에게 가서 이야기 할 수 있습니다

아니면 실제로 보여줄 수 있습니다 우리는 그 사람들과 함께 일했고, 우리는 플러그인을 만들었습니다 그럼 어떻게 생겼는지 보자 여기 샘플 프로젝트가 있습니다 그것은 매우 기본입니다

여기에 buildgradle이 있습니다 그래서 우리는 안드로이드 플러그인을 바로 여기에 적용했습니다 그들의 플러그인 그래서 그것이하는 일은, 기본적으로, 그들의 플러그인입니다

설치되고 자동으로 우리의 플러그인을 찾아 내고, 이 확장 기능을 구현 중입니다 포인트, 그냥가 그리고 더 큰 플러그인이기 때문에, 그것의 자신의 DSL이 있으십시오 그래서 여기에 사용자 정의 DSL이 있습니다 이봐, 나는 테스트하고 싶다

그 두 장치에 하지만 그들은 50 가지 이상의 에뮬레이터를 가지고 있습니다 구성 기기를 제공하지 않으면 말하자면, 나는 그들 모두를 시험하고 싶다 따라서 서버에서 목록을 가져 와서 에 따라 응용 프로그램과 호환되는 것들 귀하의 minSDK 버전 및 그런 것들

음, 지금은 minSDK 버전 만 지원하지만 이후에는 ABI 및 그런 것들 그리고 모든 테스트를 병렬로 실행합니다 여기서는 더 쉽게 테스트하기 위해 테스트 할 것입니다 다른 두 가지 그래서 내가 보여주고 싶은 첫 번째 것은 당신이 우리가 알고있는 일의 목록 이 확장 지점 – 그래서 우리는 여기에 자동으로 더 많은 것을 갖습니다

기기 테스트 방법 따라서 새로운 서비스 제공 업체가 생길 때마다 그것을위한 새로운 과제 그러나 우리는 그것을 부르지 않을 것입니다 빌드 서버에서 직접 Gradle을 수행합니다 장치 검사

나는 여기서 정보를 얻을거야 그래서 응용 프로그램을 빌드 할 것입니다 실제로 지어 질 필요가 없습니다 그래서 그것은 최신이라고, 최신이라고 말하기 위하여려고하고있다, 최신 정보 그리고 여기서 우리는 건물을 짓기 시작합니다

말하자면, 그 에뮬레이터에 연결하십시오 그래서 내 장치가 여기에 에뮬레이터를 시작하지 않습니다 실제로 클라우드에서 연결됩니다 [INAUDIBLE]을 시작합니다 그런 다음 배포 할 예정입니다

이봐, 난 성공한 시험이있어 그리고 지금 그걸 끝내고있어 그리고 나서 나는 또 다른 시험을 통과했습니다 그리고 끝났어 그리고 그게 다야

방금 두 개의 서로 다른 에뮬레이터에서 테스트했습니다 그것은 20, 50 대 병렬 일 수있었습니다 슈퍼 할 쉽게 그리고 나서 그냥 가서 빌드 / 보고서 / 열기를 엽니 다 도구 테스트 / 장치 – 공급자 당 보고서가 있습니다

indexhtml 그리고 시험을 치렀습니다 이 두 장치에서 테스트되었습니다 기기별로 볼 수 있습니다

그리고 거기에 있습니다 슈퍼 할 쉽게 우리는 정말 개선하고 싶었습니다 [박수 갈채] XAVIER DUCROHET : 우리는 정말 경험을 향상시키고 자합니다 Android 용 테스트 그리고 거기에는 많은 것들이 있습니다

테스트를 작성하는 데 도움이됩니다 그리고 우리는 그것에 대해 연구해야합니다 그러나 그들을 실행하는 것은 그것의 큰 부분입니다 Manimal과 같은 회사와 협력하고 있습니다 다시 쇼룸에서, 그들은 실제로 I / O 참석자를위한 특별 제안

따라서 반드시 가서 확인해야합니다 타사 서비스와의 통합 또는 손쉬운 사용 자신의 시스템과 통합 할 수 있도록 내부적으로 매우 중요합니다 그리고 우리는 당신이 사용하기에 아주 쉽도록하고 싶습니다 좋아, 내가 얘기하고 싶은 마지막 일은 건축 환경 따라서 과거에는 정기적으로 업데이트 된 도구와 어떻게 든 귀하의 빌드 파산

새 버전의 ADT를 얻었으므로 더 이상 컴파일 할 필요가 없습니다 그리고 그것은 큰 문제입니다 그리고 우리는 그것을 고치고 싶습니다 우리는 이것이 다시는 일어나지 않도록하고 싶습니다 그리고 Gradle은 우리가 그렇게하도록 도울 것입니다

네 가지 핵심 포인트가 있습니다 첫째, 음, 당신은 Gradle 버전을 담당합니다 그리고 당신은 Ant 버전을 이미 담당했습니다 하지만 실제로 Gradle은 – 그들은 증가했다, 그들은 새로운 특징을 그렇게 빨리 비교했다 개미에게 네가 책임 지는게 좋단다 그리고 그들은 Wrapper 라 불리는이 기능을 가지고 있습니다

당신이 정말로 그 사실을 정말로 통제하기 쉽습니다 모든 개발자, 모두가 서버를 만들고, 같은 것을 가지고있다 Gradle 버전 정말 세련된 도구입니다 정말로 그것을 확인하십시오

두 번째 요점은 당신이 플러그인의 버전 그래서 처음에 DSL에서 보았습니다 제가 어떻게 말합니까, 헤이, Maven Central에서 플러그인을 가져 오면 여기에 있습니다 글쎄, 이슈 주소의 일부는 버전 번호입니다 새 버전을 업데이트 할 때 해당 버전을 제거하지 않을 것입니다

구 버전 따라서 항상 이전 버전을 유지할 수 있습니다 전환 할 준비가되면 전환해야합니다 두 번째 요점은 아마도 내가 말하지 않았을 것입니다 또한 처음에는

그래서 플러그인은 APT와 같은 도구를 사용하여 Dalvik으로 바이트 코드를 컴파일하는 DX 그리고 그것은 SDK라는 컴포넌트 아래에있었습니다 플랫폼 도구 그리고 그것의 단지 하나의 버전이있었습니다 때로는 도구를 업데이트하면 플랫폼 도구를 업데이트하십시오

갑자기, 이봐, 아래 업데이트되며, 선택의 여지가 없습니다 여기서는 SDK 플랫폼 도구에서 구성 요소를 만들고 새 구성 요소를 만들었습니다 빌드 툴 (Build Tools) 그리고 Build Tools에 대한 중요한 점은 SDK의 대부분은 네가 가진 사건을 상상해 보라 [박수 갈채] XAVIER DUCROHET : SDK가있는 경우를 상상해보십시오

이전하지 않으려는 오래된 프로젝트가 있고, 그것이 잘하는 방법이기 때문에 이전 플러그인과 빌드 도구 버전을 사용하고 있습니다 그것은 문제가되지 않습니다 새로운 프로젝트를 시작하고 싶습니다 신선한 시작하고 싶다

새 버전의 플러그인을 사용합니다 새 버전의 빌드 도구를 사용하고 두 가지 서로 다른 두 개의 툴 체인을 사용하는 다른 프로젝트 단일 SDK 마지막으로 4 번째 요점은 IDE I입니다 우리가 수요일 Studio에 관해 이야기했을 때 언급했다 IDE는 더 이상 빌드를 수행하지 않습니다

더 큰 프로젝트를 가져옵니다 빌드 할 때마다 더 큰 프로젝트에 위임합니다 ADT를 업데이트하기 전에 이전에 두 가지를 모두 얻었습니다 동일한 플러그인, 빌더 및 편집자 내부 여기 Studio는 편집에 관한 모든 것입니다

디버깅 및 프로파일 링 더 이상 건물을 짓는 것이 아닙니다 언제든지 새로운 버전을 출시 할 때마다 무료입니다 Studio 또는 ADT의 경우 ADT에 Gradle을 통합 할 때, 새로운 버전을 받으러 오십시오 Gradle 덕분에 그 값을 변경할 때만 빌드 스크립트를 강제로 전환해야합니다

빌드의 새 버전으로 좋아요, 그래서 이것은 매우 짧은 소개입니다 시스템 구축 toolsandroidcom에는 많은 온라인 정보가 있습니다

많은 문서화 및 빌드 구성 앞서 언급 한 것처럼 라이브러리의 DSL은 매우 다릅니다 그래서 당신은 그것을 조사해야합니다 우리는 여러분의 의견이 필요합니다 우리는 그것이 필요로하는만큼 융통성을 지니고 싶습니다

너 모두를 위해서 나는 우리가 이미 많은 사용자 정의를 가지고 있다고 생각한다 그러나 우리가 놓치고있는 것들이있을 것이라고 확신합니다 의견을 보내주세요 특히 Studio에서는 어쨌든 시도해야합니다

그래서 우리는 매우 행복합니다 그리고 우리에게 피드백, FindBug를주고, 우리는 무엇이든 할 것입니다 우리는 사물을 향상시킬 수 있습니다 그래서 사실, 질문을 할 시간이있는 것처럼 보입니다 [박수 갈채] XAVIER DUCROHET : 감사합니다

어쨌든 위층에있는 샌드 박스에서 대답 할거야 어떤 질문이든 하지만 시간이 있기 때문에 우리는 몇 가지 질문을 할 수 있습니다 관객 : 그래서 나는 네가 컴파일했다고 믿는다는 말을했다 의존성 또는 런타임 종속성을 해제합니다

남자들은 그 이름이 다릅니다 androidjar는 어떻게 처리됩니까? XAVIER DUCROHET : 죄송합니다, androidjar? 관객 : 예, 빌드 전용 종속성 때문입니다 XAVIER DUCROHET : 자동으로 완료됩니다

당신은 그것을 할 필요가 없습니다 귀하의 DSL에서 처음에는 SDK를 컴파일 할 때 버전 17에서는 17에서 SDK 버전 만 선택합니다 관객 : 그럼 그걸 갈구 할 수 있니? 너희들이 그걸 갈고리로 넣을 수 있니? XAVIER DUCROHET : 죄송 해요, 뭐라 구요? 관객 : 음, 우리 중 일부는 androidjar XAVIER DUCROHET : 음

글쎄, 아마 그렇게해서는 안된다 [웃음] 관객 : 우리 중 일부는 있습니다 XAVIER DUCROHET : 네

그리고 우리는 뭔가를 알아 내야 할 것입니다 관객 : 고마워 관객 : 첫째, 고마워요 그것은 많은 것들입니다 두 가지 질문이 있습니다

하나는 도서관 프로젝트가 AAR에 관한 것입니다 그들은 각각 자신의 Rjava를 가지고 있습니까, 아니면 전체 실험실을합니까? 자체 Rjava가 있습니까? XAVIER DUCROHET : AAR은 – 죄송 해요 반복 할 수 있니? 관객 : 도서관 프로젝트도 가능합니다

그들 자신의 자원을 가지고 있는가? XAVIER DUCROHET : 예, 자원, 자산 따라서 AAR은 zip 파일입니다 그 안에는 classesjar가 있습니다 그것은 당신의 컴파일 클래스입니다

당신의 활동이있는 경우에 대비하여, 사용 권한 및 그런 것들 리소스 폴더, 자산 폴더가 있으며 ProGuard가 있습니다 파일을 가지고 있습니다 궁극적으로 JNI 라이브러리를 보유하고 있다면 JNI 라이브러리를 갖게 될 것이며, [INAUDIBLE], 뭐든간에 관객 : 네, 고마워요

두 번째 질문은 NDK 통합에 관한 것입니다 XAVIER DUCROHET : 네 관객 : 거기에 몇 가지 일이 있었어 x86 및 JNI에 대해 XAVIER DUCROHET : 전체 x86 및 ARM을 언급하지만, 그리고 그것은 그것의 디자인입니다 그러나 우리는 현재 NDK를지지하지 않습니다

그럼 곧 그렇게 될 것입니다 따라서 직접 구축 할 수 있습니다 Gradle이 NDK에 전화 할 것입니다 빌드 유형으로 구성하는 방법이 있습니다 어떤 ABI를 사용하고 싶은지, 원하는 경우 세 가지 뚱뚱한 패키지 또는 단지 하나만 할 수 있습니다

그리고 나서 그것은 NDK에 전화 할 것입니다, 이봐, 제발 ARM 버전을 빌드하고 빌드 결과를 여기에 입력하십시오 다른 ABI 용으로 제작하고 거기에 넣으십시오 다른 빌드 유형 따라서 이것이 우리가 필터링을 수행하는 방법입니다

관객 : Android Studio에 통합 될 예정입니다 또한, NDK 건물? XAVIER DUCROHET : 예, Gradle의 일부가 될 것입니다 그래서 당신이 Gradle로 건축 할 때마다, 당신이 말한다면, 이봐, 나 원시 재료를 만들고 싶다면, 그것을 만들 것입니다 그리고 Studio는 기술적으로 신경 쓰지 않을 것입니다 어떤 시점에서는 편집 기능을 추가해야합니다

그것은 오래 걸릴 것입니다 하지만 최소한 파일을 편집 할 수는 있습니다 작동하게 만들다 관객 : 어디서 볼 수 있습니까? NDK를 위해 오는 것은 무엇입니까? XAVIER DUCROHET : 로드맵이 없습니다 이번에 계획했다

관객 : OK XAVIER DUCROHET : 우리에게는 몇 가지 계획이 있지만 우리는하지 않습니다 적어 놓은 것이 있으십시오 관객 : 안녕하세요, 제 이름은 마크입니다 나는 그것을 알기를 원한다

좋아, 이제 우리는 많은 폴더를 가지고있다 SRC, JAVA, JNI, RRS, 자산 등이 있습니다 그리고 이들의 합병 과정 폴더, 그들은 다른가요? 또는 내가 정말로 알고 싶은 것은, 우리는 의존성을 가질 수 있는가? 자산이 포함 된 라이브러리 프로세스가있는 경우 이제는 최종 APK에 내장되어 있지 않습니다 새로운 것, Gradle 빌드에 해당되는가요? XAVIER DUCROHET : 예 자산이있는 경우 귀하의 패키지에 포장 될 도서관

당신은 풍미에 따라 자산을 가질 수 있습니다 모든 맛, 모든 빌드 유형에는 고유 한 JAVA 코드가 있으며, 자체 매니페스트, 자체 리소스, 자체 자산 그리고 당신이 만들고있는 향기에 따라, 그것은 단지 선택합니다 모든 것을 자동으로 병합하십시오 라이브러리가 자동으로 선택되어 병합됩니다 그리고 그것은 – 관객 : 고마워, 나는 그 동안 오랜 시간을 기다렸다

XAVIER DUCROHET : 좋습니다 관객 : NDK를 지원하지 않으므로 앤트는 어때요? 여전히 당분간 지원 될 것입니까? XAVIER DUCROHET : 개미가 될 것 같습니다 곧 Gradle로 옮길 것을 권합니다 당신이 할 수있는대로 기능이 누락 된 경우 – 관객 : NDK를 지원하지 않습니다

XAVIER DUCROHET : NDK에 대한 오 지원? 관객 : 방금 NDK를 지원하지 않는다고하셨습니다 이 순간 그래서 그것을 구축하는 유일한 방법은 음, 유일한 방법은 아니지만, XAVIER DUCROHET : 음, 지금은 NDK가 구축되지 않았습니다 개미와도 그냥 파일을 만듭니다 관객 : 네, 그렇지만 통합이 쉽습니다 XAVIER DUCROHET : 그렇습니다

하지만 미래가 아닙니다 [웃음] XAVIER DUCROHET : 그것은 우리가 NDK 안에 파일을 만들 수 있습니다 원하는 경우 수동으로 호출 할 수 있습니다 그것은 Ant와 관련된 문제는 그것이 XML의 일부 스크립팅을 가지고 있습니다 사용자 정의 코드, 왜냐하면 우리가 정말 복잡해지기 때문입니다

논리, 그 모든 sourceSet, 자산, 입술, 이 모든 것을 XML로 할 수 있습니다 그래서 우리는 사용자 정의 작업을합니다 커스텀 태스크에서 빠른 if / else 문을 다시 구현했습니다 내 XML에서 그것을 사용할 수 있습니다 그러나 그것은 마치 믹스입니다

그리고 커스텀 작업에 많은 것을 전달한 다음 다시 XML에, 그리고 다른 커스텀 태스크로 되돌아 가면, 그것은 단지 빌어 먹을 혼란 그것은 단지 유지할 ​​수 없습니다 그리고 그게 무엇이든지간에 그것이 가능할 때 나는 행복하다 Gradle로 전환했으나 개선하지는 않습니다 그것은 IDE에서 작동하지 않을거야

더 이상 사용되지 않습니다 사용되지 않습니다 하지만 오픈 소스입니다 가져 가라 좋은 버전이 있는지 확인하라

정말로 그것을 유지하고 싶다 그러나 우리는 그것을 계속 유지하지 않을 것입니다 이 빌드 시스템의 목표는 어디에서나 작동합니다 그래서 저는 또 하나를 유지할 것입니다 – 지금 당장 나는 그렇다 그러나 1

0으로 전환하면 더 이상 아닙니다 청중 : 안녕하세요, [INAUDIBLE] 내 이름은 윌리엄이야 나는 Maven을 사용하여 지금까지 구축 해왔다 그래서 내가 생각하는 방식을 바꿔야하는 것처럼 보입니다

사물에 대해서 Maven이 정말 잘하는 것 중 하나는 당신이 갈 수 있다는 것입니다 끝에서 APK를 해제하십시오 그리고 모든 버전 관리를 처리하고 모든 것은 괜찮아 그걸 어떻게 Gradle과 함께 사용할 수 있을까요? XAVIER DUCROHET : 잠깐, 죄송합니다, 반복 할 수 있습니까? 관객 : Gradle에는 해제 메커니즘이없는 것 같습니다

Maven은 어디에서, 언제 가서 버전의 APK를 사용하면 버전 관리, 소스 제어 메커니즘과 상호 작용하며 빌드, 소스 컨트롤 업데이트,에 게시 귀하의 artifcat 리포지토리 등 XAVIER DUCROHET : 그래, 아마도 그 질문과 같을거야 Gradle 자체는 플러그인보다 당신은 Gradle을 알고 있습니다 그들이 Sandbox를 가지고 있고, 내가 질문을 받으면 Gradleware의 사람들이있을 것입니다 왜냐하면 그것은 전체와 더 비슷하기 때문에 워크 플로 출시 후

그리고 요람 나는 확실히 그것을지지합니다 위층에서 할거야 위층에서 질문을하겠습니다 관객 : 좋습니다 다른 하나는 APK 라이브러리입니다

꽤 흔한 수입품입니다 XAVIER DUCROHET : 예, Maven 플러그인이 다음으로 전환됩니다 AAR 형식 APK 라이브러리 지원을 찾고 있습니다 그러나 그것이 일어날 지 확신하지 못합니다

그러나 그들은 AAR로 전환하고 있습니다 그리고 몇몇 도서관이 이미 AAR에 게시하십시오 그래서 나는 잭에게 이야기한다 [? 와튼?] [알아들을 수 없는] 어느 시점에서 AAR을 배포하려고합니다 그래서 당신은 그것을 사용할 수 있습니다

관객 : 우리가 계획하고있는 도서관을 위해 게시하면 AAR을 출력물로 만들 수 있습니까? XAVIER DUCROHET : 네 관객 : 알았어 고마워 XAVIER DUCROHET : 알았어, 고마워 그래서 위층에있을거야

더 많은 질문이 있으시면 언제든지 와서 나에게 말하면 [박수 갈채]