Home Arm 아키텍쳐에서 AAPT2 빌드 도구 사용하기
Post
Cancel

Arm 아키텍쳐에서 AAPT2 빌드 도구 사용하기

Arm 아키텍쳐에서 AAPT2 빌드 도구 사용하기

최근 개발서버의 아키텍처를 x86 에서 Arm 으로 변경했다. (더 싸서)

해당 서버에는 gitea, Jenkins, Nexus Repository 가 굴러가고 있었다. 마이그레이션은 그럭저럭 순조롭게 진행했는데 문제는 Jenkins job을 마이그레이션 하던중, 특정 job에서 안드로이드를 빌드하는 과정에서 나타났다.

1
2
3
4
5
6
7
8
9
10
stage('android build') {
    steps {
        script {
            dir('android') {
                sh 'chmod +x gradlew'
                sh './gradlew assembleRelease'
            }
        }
    }
}

그냥 간단한 apk 빌드 명령어다. 근데 아래와 같은 에러 메시지가 발견됐다.

1
2
3
4
5
6
7
8
9
10
AAPT2 aapt2-3.6.1-6040484-linux Daemon #0: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #26: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #23: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #36: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #40: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #38: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #47: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #55: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #85: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file
AAPT2 aapt2-3.6.1-6040484-linux Daemon #84: Unexpected error output: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: /var/lib/jenkins/.gradle/caches/transforms-2/files-2.1/52f8b6df1762ac7006c8d9f8d6d1e0ad/aapt2-3.6.1-6040484-linux/aapt2: cannot execute binary file

서버 아키텍처는 x86인데 바이너리 파일의 아키텍처는 arm 이라서 발생한 문제였다.

그래서 당연히 구글에서 arm용 aapt2 파일을 제공할줄 알고 문서를 뒤져보았는데… 아니 글쎄 아무리 찾아봐도 없는거 아닌가? 심지어 이런 이슈 트래커도 찾아볼 수 있었다.

궁시렁대면서 찾아보니 build-tool 을 arm용으로 컴파일할 수 있는 저장소 를 찾을 수 있었다. 문서에는 직접 빌드하는 방법에 대해 설명하고 있지만 난 그냥 릴리즈 되어있는 결과물을 다운받아 사용했다.

다음과 같은 순서로 적용했다

  1. build-tool 다운받아 aapt2 파일을 원하는 곳에 복사
  2. Jenkins 환경변수에 ANDROID_AAPT2_ROOT:/a/b/c/aapt2 등록
  3. gradle.properties에 aapt2FromMavenOverride 속성 적용

파일 자체에 프로퍼티를 추가할 수 있지만 어짜피 빌드시에만 사용될 것이므로 다음과 같은 stage를 추가했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
stage ('replace aapt2') {
    steps {
        script {
            dir('android') {
                def gradlePropsPath = "${WORKSPACE}/gradle.properties"
                sh """
                    # 기존 AAPT2 설정이 있으면 제거
                    sed -i '/android.aapt2FromMavenOverride/d' ${gradlePropsPath}

                    # 새로운 AAPT2 설정을 개행과 함께 추가
                    echo -e "\\n# Custom AAPT2 configuration for ARM\\nandroid.aapt2FromMavenOverride=${env.ANDROID_AAPT2_ROOT}" >> ${gradlePropsPath}
                """
            }
        }
    }
}

구글이 공식적으로 arm용 aapt2를 출시했으면 좋겠다.

This post is licensed under CC BY 4.0 by the author.