블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

안드로이드 스튜디오는 약 1G크기에 설치하면 몇G로 크기가 커지고,
컴파일러 실행하는데도 시간이 많이 걸리고,
느린 PC에서는 그야말로 속터질 지경.
그래서, 작고 빠른, 컴파일만 가능한 환경을 찾았다.
100M도 안되는 크기. 안드로이드 스튜디오에 비하면 기본 1/10크기(다른거 포함하면, 그게 그거)
자바 jdk는 별도 설치 필요.



- Command line tools only 다운로드

- sdkmanager로 NDK 다운로드(약3.5G)
  sdkmanager는 Command line tools 압축풀면 D:\Android\cmdline-tools\bin 에 있습니다. DOS창에서 실행.
sdkmanager --install "ndk;21.3.6528147" --channel=3 --sdk_root=D:\Android

- sdkmanager로 AAPT2(Android Asset Packaging Tool)
sdkmanager "build-tools;build-tools-version" --sdk_root=D:\Android
=> Warning: Failed to find package 'build-tools'
안되네? 어렵다. 그냥 안드로이드 스튜디오 사용하자

- sdkmanager로 cmake 다운로드
sdkmanager --install "cmake;10.24988404" --sdk_root=D:\Android

=> 이것도 안되네?



apkanalyzer빌드 프로세스가 완료된 후 APK의 구성에 관한 유용한 정보를 제공합니다.
avdmanager명령줄에서 Android Virtual Device(AVD)를 만들고 관리할 수 있습니다.
lint코드의 구조적 품질 문제를 식별하고 수정할 수 있는 코드 스캔 도구입니다.
retraceR8으로 컴파일된 애플리케이션의 경우 retrace는 원본 소스 코드에 다시 매핑되는 난독화된 스택 트레이스를 디코딩합니다.
sdkmanagerAndroid SDK용 패키지를 확인 및 설치, 업데이트, 제거할 수 있습니다.


Android SDK 빌드 도구

위치: android_sdk/build-tools/version/
SDK 빌드 도구 출시 노트도 참조하세요.

이 패키지는 Android 앱을 빌드하기 위해 필요합니다. 여기에 있는 대부분의 도구는 빌드 도구에 의해 호출되며 사용자가 호출하는 것이 아닙니다. 하지만 다음과 같은 명령줄 도구가 유용할 수도 있습니다.

aapt2Android 리소스를 Android 플랫폼에 최적화된 바이너리 형식으로 파싱하고 색인을 생성하며 컴파일한 후 컴파일된 리소스를 단일 출력으로 패키징합니다.
apksignerAPK에 서명하고 APK 서명이 주어진 APK에서 지원하는 모든 플랫폼 버전에서 성공적으로 인증되는지 확인합니다.
zipalign압축되지 않은 모든 데이터가 파일 시작 부분을 기준으로 특정 정렬이 적용된 상태로 시작되도록 하여 APK 파일을 최적화합니다.

 

R8 retrace  |  Android 개발자  |  Android Developers

참고: R8 retrace는 명령줄 도구 패키지 버전 4.0에 포함된 독립형 도구로, 현재 Canary 출시 채널에 있는 Android 스튜디오 4.2와 함께 출시되었습니다.SDK Manager로 명령줄 도구 패키지를 다운로드하려면

developer.android.com

Google Maven에서 AAPT2 다운로드
https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar



 

AAPT2

AAPT2(Android Asset Packaging Tool)는 Android 스튜디오 및 Android Gradle 플러그인이 앱의 리소스를 컴파일하고 패키징하는 데 사용하는 빌드 도구입니다. AAPT2는 리소스를 Android 플랫폼에 최적화된 바이너리 형식으로 파싱하고 색인을 생성하며 컴파일합니다.

Android Gradle 플러그인 3.0.0 이상에서는 기본적으로 AAPT2를 사용 설정하므로 일반적으로 aapt2를 직접 호출할 필요가 없습니다. 그러나 Android 스튜디오보다 터미널 및 자체 빌드 시스템 사용을 선호한다면 명령줄에서 AAPT2를 사용할 수 있습니다. 명령줄에서 AAPT2와 관련된 빌드 오류를 디버그할 수도 있습니다. 이렇게 하려면 Android SDK 빌드 도구 26.0.2 이상에서 AAPT2를 독립형 도구로 찾을 수 있습니다.

명령줄에서 Android SDK 빌드 도구를 다운로드하려면 sdkmanager를 사용하여 다음 명령어를 실행합니다.

 

sdkmanager "build-tools;build-tools-version"
sdkmanager "build-tools;build-tools-version"  --sdk_root=D:\Android

SDK 빌드 도구를 다운로드하고 나면 android_sdk/build-tools/version/에 있는 AAPT2를 찾을 수 있습니다. Android SDK 빌드 도구의 최신 버전은 자주 출시되지 않으므로 SDK 빌드 도구에 포함된 AAPT2가 최신 버전이 아닐 수 있습니다. AAPT2의 최신 버전을 받으려면 Google Maven에서 AAPT2 다운로드를 참조하세요.

Linux 또는 Mac의 명령줄에서 AAPT2를 사용하려면 aapt2 명령어를 실행합니다. Windows의 경우 aapt2.exe 명령어를 실행합니다. AAPT2에서는 증분 컴파일을 사용 설정하여 리소스를 더 빨리 컴파일할 수 있습니다. 이렇게 하려면 리소스 처리를 두 단계로 나누어 실행합니다.

  • 컴파일: 리소스 파일을 바이너리 형식으로 컴파일합니다.
  • 링크: 컴파일된 모든 파일을 병합하여 단일 패키지로 패키징합니다.

이렇게 분할하면 증분 빌드의 성능 향상에 도움이 됩니다. 예를 들어 파일 하나가 변경된 경우 그 파일만 다시 컴파일하면 됩니다.

Google Maven에서 AAPT2 다운로드

빌드 도구에 번들로 포함되지 않은 AAPT2의 최신 버전이 필요한 경우 다음과 같이 Google Maven 저장소에서 AAPT2를 다운로드하면 됩니다.

  1. 저장소 색인에서 com.android.tools.build > aapt2로 이동합니다.
  2. AAPT2 최신 버전의 이름을 복사합니다.
  3. 복사한 버전 이름을 다음 URL에 삽입하고 타겟 운영체제를 지정합니다. https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version/aapt2-aapt2-version-[windows | linux | osx].jar

    예를 들어 Windows용 버전 3.2.0-alpha18-4804415를 다운로드하려면 다음을 사용합니다. https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar

  4. 브라우저에서 URL로 이동하면 곧 AAPT2 다운로드가 시작됩니다.

  5. 방금 다운로드한 JAR 파일의 패키지를 해제합니다. JAR 파일에는 aapt2 실행 파일과 실행 파일에서 사용하는 라이브러리가 포함되어야 합니다.

컴파일

AAPT2는 모든 Android 리소스 유형(예: 드로어블 및 XML 파일)의 컴파일을 지원합니다. 컴파일을 위해 AAPT2를 호출할 경우 호출당 입력으로 단일 리소스 파일을 전달해야 합니다. 그런 다음 AAPT2는 파일을 파싱하고 확장자가 .flat인 중간 바이너리 파일을 생성합니다.

--dir 플래그를 사용하여 리소스 파일이 두 개 이상 포함된 리소스 디렉터리를 AAPT2에 전달할 수 있지만, 그렇게 하면 증분 리소스 컴파일의 이점을 얻지 못합니다. 즉, 전체 디렉터리를 전달하면 AAPT2는 리소스가 하나만 변경되었더라도 디렉터리의 모든 파일을 다시 컴파일합니다.

출력 파일 형식은 컴파일용으로 제공한 입력에 따라 다를 수 있습니다. 이에 관한 설명은 다음 표에 나와 있습니다.

입력출력

문자열  스타일과 같은 res/values/ 디렉터리의 XML 리소스 파일 확장자가 *.arsc.flat인 리소스 테이블
다른 모든 리소스 파일 res/values/ 디렉터리에 있는 파일 이외의 모든 파일은 확장자가 *.flat인 바이너리 XML 파일로 변환됩니다. 또한 기본적으로 모든 PNG 파일이 크런치되며 *.png.flat 확장자를 채택합니다. PNG를 압축하지 않도록 선택하면 컴파일하는 동안 --no-crunch 옵션을 사용할 수 있습니다.

AAPT2 출력 파일은 실행 파일이 아니므로 APK를 생성하려면 나중에 링크 단계에서 이러한 바이너리 파일을 입력으로 포함해야 합니다. 그러나 생성된 APK 파일은 Android 기기에 즉시 배포할 수 있는 실행 파일이 아닙니다. DEX 파일(컴파일된 바이트 코드)이 포함되어 있지 않고 서명되지 않았기 때문입니다.

컴파일 구문

compile을 사용하는 일반적인 구문은 다음과 같습니다.

 

aapt2 compile path-to-input-files [options] -o output-directory/ 참고: 리소스 파일의 경우 입력 파일 경로는 다음 구조와 일치해야 합니다. path/resource-type[-config]/file

다음 예에서 AAPT2는 이름이 각각 values.xml  myImage.png인 리소스 파일을 컴파일합니다.

 

aapt2 compile project_root/module_root/src/main/res/values-en/ strings.xml -o compiled/ aapt2 compile project_root/module_root/src/main/res/drawable /myImage.png -o compiled/

위 표와 같이 출력 파일의 이름은 입력 파일 이름 및 그 상위 디렉터리의 이름(리소스 유형 및 구성)에 따라 달라집니다. strings.xml이 입력인 위 예의 경우 aapt2는 자동으로 출력 파일의 이름을 values-en_strings.arsc.flat으로 지정합니다. 반면 드로어블 디렉터리에 저장되는 컴파일된 드로어블 파일의 파일 이름은 drawable_img.png.flat이 됩니다.

컴파일 옵션

아래 표와 같이 compile 명령어와 함께 사용할 수 있는 여러 옵션이 있습니다.

옵션설명

-o path 컴파일된 리소스의 출력 경로를 지정합니다.

AAPT2가 컴파일된 리소스를 출력 및 저장할 수 있는 디렉터리의 경로를 지정해야 하므로 이 옵션은 필수 플래그입니다.

--dir directory 리소스를 검색할 디렉터리를 지정합니다.

이 플래그를 사용하면 하나의 명령어로 여러 리소스 파일을 컴파일할 수 있지만, 이 경우 증분 컴파일의 이점을 활용할 수 없으므로 대규모 프로젝트에는 사용하면 안 됩니다.

--pseudo-localize en-XA 및 en-XB 같은 기본 문자열의 pseudo-localized 버전을 생성합니다.
--no-crunch PNG 처리를 사용 중지합니다.

PNG 파일을 이미 처리했거나 파일 크기 축소가 필요 없는 디버그 빌드를 만드는 중인 경우 이 옵션을 사용합니다. 그러면 실행 속도는 빨라지지만 출력 파일 크기가 커집니다.

--legacy 이전 버전의 AAPT를 사용할 때 허용되는 오류를 경고로 처리합니다.

이 플래그는 예기치 않은 컴파일 시간 오류에 사용해야 합니다. AAPT2를 사용하는 동안 발생할 수 있는 알려진 동작 변경사항을 해결하려면 AAPT2의 동작 변경사항을 읽어보세요.

-v 상세 로깅을 사용 설정합니다.

링크 단계에서 AAPT2는 컴파일 단계에서 생성된 모든 중간 파일(예: 리소스 테이블, 바이너리 XML 파일, 처리된 PNG 파일)을 병합하여 단일 APK로 패키징합니다. R.java 및 ProGuard 규칙 파일과 같은 기타 보조 파일도 이 단계에서 생성될 수 있습니다. 그러나 생성된 APK는 DEX 바이트 코드를 포함하지 않으며 서명되어 있지 않습니다. 즉, 이 APK를 기기에 배포할 수 없습니다. Android Gradle 플러그인을 사용하여 명령줄에서 앱을 빌드하지 않는 경우 d8과 같은 다른 명령줄 도구를 사용하여 자바 바이트 코드를 DEX 바이트 코드로 컴파일하고 apksigner를 사용하여 APK에 서명할 수 있습니다.

link를 사용하는 일반적인 구문은 다음과 같습니다.

 

aapt2 link path-to-input-files [options] -o outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

다음 예에서 AAPT2는 drawable_Image.flat과 values_values.arsc.flat이라는 중간 파일 두 개와 AndroidManifest.xml 파일을 병합합니다. AAPT2는 Android 패키지에 정의된 리소스를 보유한 android.jar 파일을 기준으로 결과를 연결합니다.

 

aapt2 link -o output.apk -I android_sdk/platforms/android_version/android.jar compiled/res/values_values.arsc.flat compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

link 명령어와 함께 다음 옵션을 사용할 수 있습니다.

옵션설명

-o path 연결된 리소스 APK의 출력 경로를 지정합니다.

연결된 리소스를 포함할 수 있는 출력 APK의 경로를 지정해야 하므로 이 옵션은 필수 플래그입니다.

--manifest file 빌드할 Android 매니페스트 파일의 경로를 지정합니다.

매니페스트 파일은 패키지 이름 및 애플리케이션 ID와 같은 앱 관련 필수 정보를 포함하므로 이 옵션은 필수 플래그입니다.

-I 플랫폼의 android.jar 경로 또는 기능을 빌드하는 동안 유용할 수 있는 framework-res.apk와 같은 다른 APK의 경로를 제공합니다.리소스 파일에서 android 네임스페이스가 있는 속성(예: android:id)을 사용하는 경우 이 플래그는 필수입니다.
-A directory APK에 포함할 assets 디렉터리를 지정합니다.

처리되지 않은 원본 파일을 저장하는 데 이 디렉터리를 사용할 수 있습니다. 자세한 내용은 원본 파일 액세스를 참조하세요.

-R file <add-resource> 태그를 사용하지 않고 overlay 의미 체계를 사용하여 연결할 개별 .flat 파일을 전달합니다.

기존 파일을 오버레이(확장 또는 수정)하는 리소스 파일을 제공하면, 지정된 마지막 충돌 리소스가 사용됩니다.

--package-id package-id 앱에 사용할 패키지 ID를 지정합니다.

지정한 패키지 ID는 0x7f보다 크거나 같아야 합니다. 단 --allow-reserved-package-id와 함께 사용되는 경우는 예외입니다.

--allow-reserved-package-id 예약된 패키지 ID를 사용할 수 있습니다.

예약된 패키지 ID는 일반적으로 공유 라이브러리에 할당되며 0x02~0x7e 범위(포함)에 속하는 ID입니다. --allow-reserved-package-id을 사용하여 예약된 패키지 ID의 범위에 속하는 ID를 할당할 수 있습니다.

최소 SDK 버전이 26 이하인 패키지에만 사용해야 합니다.

--java directory R.java를 생성할 디렉터리를 지정합니다.
--proguard proguard_options ProGuard 규칙의 출력 파일을 생성합니다.
--proguard-conditional-keep-rules 기본 dex에 관한 ProGuard 규칙의 출력 파일을 생성합니다.
--no-auto-version 자동 스타일 및 레이아웃 SDK 버전 관리를 사용 중지합니다.
--no-version-vectors 벡터 드로어블의 자동 버전 관리를 사용 중지합니다. Vector Drawable 라이브러리로 APK를 빌드할 경우에만 사용하세요.
--no-version-transitions 전환 리소스의 자동 버전 관리를 사용 중지합니다. Transition Support 라이브러리로 APK를 빌드할 경우에만 사용하세요.
--no-resource-deduping 호환 가능한 구성 전체에서 동일한 값을 가진 리소스의 자동 중복 제거를 사용 중지합니다.
--enable-sparse-encoding 바이너리 검색 트리를 사용하여 희소 항목의 인코딩을 사용 설정합니다. 이는 APK 크기를 최적화하는 데에는 유용하지만, 리소스 검색 성능이 저하됩니다.
-z 'suggested'로 표시된 문자열의 현지화가 필요합니다.
-c config 쉼표로 구분된 구성 목록을 제공합니다.

예를 들어, 여러 언어의 번역이 포함되어 있는 지원 라이브러리의 종속 항목이 있는 경우 영어 또는 스페인어와 같은 특정 언어 구성에 대해서만 리소스를 필터링할 수 있습니다.

두 글자로 된 ISO 639-1 언어 코드 및 원하는 경우 두 글자로 된 ISO 3166-1-alpha-2 지역 코드(앞에 소문자 'r' 표시, 예: en-rUS)로 언어 구성을 정의해야 합니다.

--preferred-density density AAPT2가 가장 근접한 일치 밀도를 선택하고 다른 모든 밀도를 제거하도록 허용합니다.

ldpi, hdpi 및 xhdpi와 같이 앱에서 사용할 수 있는 몇 가지 픽셀 밀도 한정자가 있습니다. 원하는 밀도를 지정하면 AAPT2는 리소스 테이블에서 가장 근접한 일치 밀도를 선택하여 저장하고 다른 밀도는 모두 삭제합니다.

--output-to-dir -o로 지정된 디렉터리에 APK 콘텐츠를 출력합니다.

이 플래그 사용 시 오류가 발생하면 Android SDK 빌드 도구 28.0.0 이상으로 업그레이드하여 문제를 해결할 수 있습니다.

--min-sdk-version min-sdk-version AndroidManifest.xml에 사용할 기본 최소 SDK 버전을 설정합니다.
--target-sdk-version target-sdk-version AndroidManifest.xml에 사용할 기본 타겟 SDK 버전을 설정합니다.
--version-code version-code 존재하지 않는 경우 AndroidManifest.xml에 삽입할 버전 코드(정수)를 지정합니다.
--compile-sdk-version-name compile-sdk-version-name 존재하지 않는 경우 AndroidManifest.xml에 삽입할 버전 이름을 지정합니다.
--proto-format 컴파일된 리소스를 Protobuf 형식으로 생성합니다.

Android App Bundle 생성용 번들 도구에 입력으로 사용하기에 적합합니다.

--non-final-ids 최종이 아닌 리소스 ID로 R.java를 생성합니다. 앱 코드의 ID 참조는 kotlinc/javac 컴파일 중에 인라인되지 않습니다.
--emit-ids path 리소스 유형 이름과 각 ID 매핑의 목록을 사용하여 지정된 경로에서 파일을 생성합니다. --stable-ids와 함께 사용하는 것이 좋습니다.
--stable-ids outputfilename.ext 리소스 유형 이름과 각 이름에 할당된 ID의 목록이 포함된 --emit-ids로 생성된 파일을 사용합니다.

이 옵션을 사용하면 연결하는 동안 새 리소스를 삭제하거나 추가할 때도 할당된 ID가 안정적으로 유지됩니다.

--custom-package package_name R.java를 생성할 맞춤 자바 패키지를 지정합니다.
--extra-packages package_name 동일한 R.java 파일을 생성하지만 패키지 이름은 다릅니다.
--add-javadoc-annotation annotation 생성된 모든 자바 클래스에 JavaDoc 주석을 추가합니다.
--output-text-symbols path 지정된 파일에서 R 클래스의 리소스 기호를 포함하는 텍스트 파일을 생성합니다.

출력 파일의 경로를 지정해야 합니다.

--auto-add-overlay <add-resource> 태그를 사용하지 않고 오버레이에서 새 리소스를 추가할 수 있습니다.
--rename-manifest-package manifest-package AndroidManifest.xml에서 패키지 이름을 다시 지정합니다.
--rename-instrumentation-target-package instrumentation- target-package 계측을 위한 타겟 패키지의 이름을 변경합니다.

--rename-manifest-package와 함께 사용해야 합니다.

-0 extension

압축하지 않을 파일의 확장자를 지정합니다.

--split path:config[,config[..]] 구성 집합을 기반으로 리소스를 분할하여 다른 버전의 APK를 생성합니다.

구성 집합과 함께 출력 APK의 경로를 지정해야 합니다.

-v 출력을 훨씬 자세히 표시할 수 있습니다.

덤프

dump는 link 명령어를 사용하여 생성한 APK 관련 정보를 출력하는 데 사용됩니다. 예를 들어 다음 명령어는 특정 APK의 리소스 테이블에서 콘텐츠를 출력합니다.

 

aapt2 dump resources output.apk

덤프 구문

dump를 사용하는 일반적인 구문은 다음과 같습니다.

 

aapt2 dump sub-command filename.apk [options]

덤프 하위 명령어

dump 명령어로 다음 하위 명령어 중 하나를 지정해야 합니다.

하위 명령어설명

apc 컴파일 중에 생성된 AAPT2 컨테이너(APC)의 콘텐츠를 출력합니다.
badging APK의 매니페스트에서 추출한 정보를 출력합니다.
configurations APK의 리소스에서 사용하는 모든 구성을 출력합니다.
packagename APK의 패키지 이름을 출력합니다.
permissions APK의 매니페스트에서 추출한 권한을 출력합니다.
strings APK의 리소스 테이블 문자열 풀에 있는 콘텐츠를 출력합니다.
styleparents APK에 사용된 스타일의 상위 요소를 출력합니다.
resources APK 리소스 테이블의 콘텐츠를 출력합니다.
xmlstrings APK의 컴파일된 xml에서 문자열을 출력합니다.
xmltree APK의 컴파일된 xml에서 트리를 출력합니다.

덤프 옵션

dump와 함께 다음 옵션을 사용할 수 있습니다.

옵션설명

--no-values 리소스를 표시할 때 값의 출력을 억제합니다.
--file file 파일을 APK에서 덤프할 인수로 지정합니다.
-v 결과가 더욱 상세하게 출력됩니다.

AAPT2 사용 시 동작 변경사항

AAPT2 이전에는 AAPT가 Android Asset Packaging Tool의 기본 버전이었으며 지금은 지원이 중단되었습니다. AAPT2를 이전 프로젝트에서 즉시 사용할 수 있지만 이 섹션에서는 반드시 알아야 할 몇 가지 동작 변경사항을 설명합니다.

Android 매니페스트의 요소 계층 구조

이전 버전의 AAPT에서는 Android 매니페스트의 잘못된 노드에 요소가 중첩되어 있으면 이를 무시하거나 경고를 보냈습니다. 예를 들어 다음 샘플을 살펴보겠습니다.

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
package="com.example.myname.myapplication">
   <application
       ...
       
<activity android:name=".MainActivity">
           
<intent-filter>
               
<action android:name="android.intent.action.MAIN" />
               
<category android:name="android.intent.category.LAUNCHER" />
           
</intent-filter>
           
<action android:name="android.intent.action.CUSTOM" />
       
</activity>
   
</application>
</manifest>

이전 버전의 AAPT에서는 위치가 잘못된 <action> 태그를 간단히 무시했습니다. 그러나 AAPT2에서는 다음과 같은 오류가 발생합니다.

 

AndroidManifest.xml:15: error: unknown element <action> found.

문제를 해결하려면 매니페스트 요소를 올바르게 중첩해야 합니다. 자세한 내용은 매니페스트 파일 구조를 참조하세요.

리소스 선언

더 이상 name 속성에서 리소스 유형을 표시할 수 없습니다. 예를 들어 다음 샘플은 attr 리소스 항목을 잘못 선언합니다.

 

<style name="foo" parent="bar">
   
<item name="attr/my_attr">@color/pink</item>
</style>

이렇게 리소스 유형을 선언하면 다음과 같은 빌드 오류가 발생합니다.

 

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)' not found.

이 오류를 해결하려면 type="attr"을 사용하여 유형을 명시적으로 선언합니다.

 

<style name="foo" parent="bar">
 
<item type="attr" name="my_attr">@color/pink</item>
</style>

또한 <style> 요소를 선언할 때 그 상위 요소도 스타일 리소스 유형이어야 합니다. 그렇지 않으면 다음과 비슷한 오류가 발생합니다.

 

Error: (...) invalid resource type 'attr' for parent of style

ForegroundLinearLayout이 포함된 Android 네임스페이스

ForegroundLinearLayout에는 foregroundInsidePadding, android:foreground, android:foregroundGravity라는 세 가지 속성이 포함됩니다. foregroundInsidePadding은 다른 두 개의 속성과 달리 android 네임스페이스에 포함되지 않습니다.

이전 버전의 AAPT에서는 foregroundInsidePadding 속성을 android 네임스페이스로 정의하면 컴파일러가 자동으로 이를 무시했습니다. AAPT2를 사용하면 컴파일러가 이 문제를 조기에 발견하고 다음과 같은 빌드 오류를 발생시킵니다.

 

Error: (...) resource android:attr/foregroundInsidePadding is private

이 문제를 해결하려면 android:foregroundInsidePadding을 foregroundInsidePadding으로 교체하세요.

리소스 참조 기호 @의 잘못된 사용

AAPT2에서는 리소스 참조 기호(@)를 생략하거나 잘못된 위치에 배치하면 빌드 오류가 발생합니다. 예를 들어 다음은 스타일 속성을 지정할 때 참조 기호를 생략한 경우입니다.

 

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
 
...
 
<!-- Note the missing '@' symbol when specifying the resource type. -->
 
<item name="colorPrimary">color/colorPrimary</item>
</style>

AAPT2에서는 모듈을 빌드할 때 다음과 같은 빌드 오류가 발생합니다.

 

ERROR: expected color but got (raw string) color/colorPrimary

그리고 다음은 android 네임스페이스에서 리소스에 액세스할 때 참조 기호를 잘못 포함한 경우입니다.

 

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

AAPT2에서는 모듈을 빌드할 때 다음과 같은 빌드 오류가 발생합니다.

 

Error: style attribute '@android:attr/windowEnterAnimation' not found

라이브러리의 잘못된 구성

앱에 Android SDK 빌드 도구의 이전 버전을 사용하여 빌드된 타사 라이브러리의 종속 항목이 있는 경우, 런타임 시 오류나 경고를 표시하지 않고 앱이 비정상 종료될 수 있습니다. 라이브러리를 만드는 동안 R.java 필드가 final로 선언되어 모든 리소스 ID가 라이브러리의 클래스에서 인라인 처리되므로 이러한 비정상 종료가 발생할 수 있습니다.

AAPT2는 앱을 빌드할 때 ID를 라이브러리 리소스에 다시 할당할 수 있는 기능에 의존합니다. 라이브러리가 ID를 final로 가정하고 라이브러리 dex에서 인라인 처리하면 런타임 불일치가 발생합니다.

이 오류를 해결하려면 라이브러리 작성자에게 문의하여 최신 버전의 Android SDK 빌드 도구를 사용하는 라이브러리를 다시 빌드하여 라이브러리를 다시 게시합니다.



Windows x64 Installer 159.69 MB

jdk-15.0.1_windows-x64_bin.exe

Windows x64 Compressed Archive 179.27 MB

jdk-15.0.1_windows-x64_bin.zip

developer.android.com/studio?hl=ko#downloads

 

Download Android Studio and SDK tools  |  Android 스튜디오

developer.android.com

Command line tools only

If you do not need Android Studio, you can download the basic Android command line tools below. You can use the included sdkmanager to download other SDK packages.

These tools are included in Android Studio.

PlatformSDK tools packageSizeSHA-256 checksum

Windows commandlinetools-win-6858069_latest.zip 83 MB d2f6c9bb7db0362995c0b8dd2fd5949ce23c1dccb7f9392350b5e29b6d5fec7d
Mac commandlinetools-mac-6858069_latest.zip 83 MB 58a55d9c5bcacd7c42170d2cf2c9ae2889c6797a6128307aaf69100636f54a13
Linux commandlinetools-linux-6858069_latest.zip 83 MB 87f6dcf41d4e642e37ba03cb2e387a542aa0bd73cb689a9e7152aad40a6e7a08

 

 

 

 

sdkmanager

jdk먼져 설치하고
sdkmanager는 Android SDK용 패키지를 보고 설치하고 업데이트하고 제거할 수 있는 명령줄 도구입니다. Android 스튜디오를 사용하는 경우 이 도구를 사용할 필요가 없으며 대신 IDE에서 SDK 패키지를 관리할 수 있습니다.

sdkmanager 도구는 Android SDK 도구 패키지(25.2.3 이상)에서 제공되며 android_sdk/tools/bin/에 있습니다.

사용

sdkmanager를 사용하여 다음 작업을 실행할 수 있습니다.

설치된 패키지 또는 사용 가능한 패키지 목록

 

sdkmanager --list [options] \ [--channel=channel_id] // Channels: 0 (stable), 1 (beta), 2 (dev), or 3 (canary)

channel 옵션을 사용하여 channel_id 이하 채널의 패키지를 포함합니다. 예를 들어 카나리아 채널을 지정하여 모든 채널의 패키지를 나열합니다.

참고: 안정적인 패키지만 나열하려면 --channel=0을 사용하거나 --channel 옵션을 완전히 삭제하세요.

패키지 설치

 

sdkmanager packages [options]

packages 인수는 --list 명령어에서 보이는 것과 같이 따옴표로 묶은 SDK 스타일의 경로입니다(예: "build-tools;29.0.2" 또는 "platforms;android-28"). 공백으로 구분된 여러 패키지 경로를 전달할 수 있지만 각각 자체 따옴표로 묶어야 합니다.

예를 들어 다음은 최신 플랫폼 도구(adb  fastboot 포함)  API 수준 28용 SDK 도구를 설치하는 방법입니다.

 

sdkmanager "platform-tools" "platforms;android-28"

또는 모든 패키지를 지정하는 텍스트 파일을 전달할 수 있습니다.

 

sdkmanager --package_file=package_file [options]

package_file 인수는 텍스트 파일의 위치입니다. 여기서 각 줄은 설치할 패키지의 SDK 스타일 경로(따옴표 없음)입니다.

제거하려면 --uninstall 플래그를 추가하면 됩니다.

 

sdkmanager --uninstall packages [options] sdkmanager --uninstall --package_file=package_file [options]

CMake 또는 NDK를 설치하려면 다음 구문을 사용합니다.

 

sdkmanager --install
           
["ndk;major.minor.build[suffix]" | "cmake;major.minor.micro.build"]
           
[--channel=channel_id] // NDK channels: 0 (stable), 1 (beta), or 3 (canary)

예를 들어 다음 명령어를 사용하여 현재 사용하는 채널과 관계없이 지정된 NDK 버전을 설치합니다.

 

sdkmanager --install "ndk;21.3.6528147" --channel=3 // Install the NDK from the canary channel (or below)
sdkmanager --install "ndk;21.3.6528147" --channel=3 --sdk_root=D:\Android

sdkmanager
--install "cmake;10.24988404" // Install a specific version of CMake
sdkmanager --install "cmake;10.24988404" --sdk_root=D:\Android

설치된 모든 패키지 업데이트

 

sdkmanager --update [options]

옵션

다음 표는 위의 명령어와 함께 사용 가능한 옵션입니다.

옵션설명

--sdk_root=path 이 도구를 포함하는 SDK 대신 지정된 SDK 경로를 사용합니다.
--channel=channel_id channel_id 이하 채널에 패키지를 포함합니다. 사용 가능한 채널은 다음과 같습니다.

0(안정적), 1(베타), 2(개발) 및 3(Canary).

--include_obsolete 사용되지 않는 패키지를 패키지 목록 또는 패키지 업데이트에 포함합니다. --list  --update에서만 사용합니다.
--no_https 모든 연결이 HTTPS가 아닌 HTTP를 사용하도록 강제합니다.
--verbose 상세 출력 모드. 오류, 경고 및 정보 메시지가 출력됩니다.
--proxy={http | socks} 지정된 유형의 프록시를 통해 연결합니다. HTTP 또는 FTP와 같은 높은 레벨의 프로토콜에는 http를 사용하고, SOCKS(V4 또는 V5) 프록시에는 socks를 사용합니다.
--proxy_host={IP_address | DNS_address} 사용할 프록시의 IP 또는 DNS 주소입니다.
--proxy_port=port_number 연결할 프록시 포트 번호입니다.

참고: 현재 시스템과 다른 운영체제용 패키지를 설치하려면 REPO_OS_OVERRIDE 환경 변수를 'windows', 'macosx' 또는 'linux'로 설정합니다.

Posted by 안녕1999
, |

안드로이드 프로그램 개발시, 최소 지원 API를 선택하게 되어 있다.

"가장 최신이 좋은거 아니냐?"

맞긴한데, 많은 종류의 핸드폰에서 실행되길 바란다면, 최저 사양으로 개발해야한다.

단, 오래된 API에는 없는 기능도 있다.

예1) API 14는 거의 모든 기기에서 동작이 된다.(2020.5 기준 최소사양)

예2) API 21은 약 95%의 기기에서 동작이 된다.(예시입니다)

Posted by 안녕1999
, |

developer.android.com/studio/install?hl=ko

https://developer.android.com/studio?hl=ko

 

Download Android Studio and SDK tools  |  Android 스튜디오

developer.android.com

 

커스텀 설치를 선택하면,

- 화면 색상을 어두운것을 선택할 수 있다.

- 가상디바이스를 설치하지 않을 수 도 있다.

 

가상디바이스가 약 1G크기를 차지한다.

가상디바이스가 없다면, 핸드폰을 직접 연결하여 테스트해야한다.(불편)

가상디바이스도 PC가 성능이 어느정도 되야, 원활하게 사용이 가능하다.

 

Posted by 안녕1999
, |

NDK에서 화면을 더블 버퍼링하려면?

How to Render Image Buffer in Android NDK Native Code

ANativeWindow* window = ANativeWindow_fromSurface(env, javaSurface);

ANativeWindow_Buffer buffer;
if (ANativeWindow_lock(window, &buffer, NULL) == 0) {
  memcpy(buffer.bits, pixels,  w * h * 2);
  ANativeWindow_unlockAndPost(window);
}

ANativeWindow_release(window);

일반적으로 위의 방법을 사용한다.
그런데, 문제가 좀 있다.
본인이 확인한 화면은 2장이 아니라, 4장이었다.
4장을 내 마음대로 골라서, swap하질 못한다.
무조건 순차적으로 강제 버퍼링(swap)되어 진다.
2장만 있으면, swap할 수 있는데, 4장이니, 메모리 낭비가 발생한다.

또한 swap기능을 사용 하기위해서는
1) 화면 전체를 새로 그리던가,
2) 별도의 화면 메모리를 할당하여, 그리고, 필요한 부분만 업데이트 해주면 되나,
   문제가 많다.

1), 2)번 모두 처리비용이 비싸다. 비효율적이라는 말이다.
왜 일반적인 sawp기능이 왜 없는지 의문스럽다.


Graphics architecture


Posted by 안녕1999
, |

디버깅 정보가 들어가니, apk파일이 3M정도 였는데, 디버깅 안함으로 설정하니, 174k로 줄어드네요.

AndroidManifest.xml 파일에서

android:debuggable="false"

Posted by 안녕1999
, |

화면을 그릴때, 사용되는 픽셀정보 구조체

관련함수 : ANativeWindow_lockANativeWindow_unlockAndPost

native_window.h


typedef struct ANativeWindow_Buffer {

    // The number of pixels that are show horizontally.

    int32_t width;


    // The number of pixels that are shown vertically.

    int32_t height;


    // The number of *pixels* that a line in the buffer takes in

    // memory.  This may be >= width.

    int32_t stride; //1줄당 픽셀수


    // The format of the buffer.  One of WINDOW_FORMAT_*

    int32_t format;//WINDOW_FORMAT_RGB_565


    // The actual bits.

    void* bits;

    

    // Do not touch.

    uint32_t reserved[6];

} ANativeWindow_Buffer;

Posted by 안녕1999
, |

Looper

키보드, 모션(터치) 등을 처리하는 기능.

..\Android\android-ndk-r13b\platforms\android-12\arch-x86\usr\include\android\looper.h

/**

 * For callback-based event loops, this is the prototype of the function

 * that is called when a file descriptor event occurs.

 * It is given the file descriptor it is associated with,

 * a bitmask of the poll events that were triggered (typically ALOOPER_EVENT_INPUT),

 * and the data pointer that was originally supplied.

 *

 * Implementations should return 1 to continue receiving callbacks, or 0

 * to have this file descriptor and callback unregistered from the looper.

 */

typedef int (*ALooper_callbackFunc)(int fd, int events, void* data);


/**

 * Waits for events to be available, with optional timeout in milliseconds.

 * Invokes callbacks for all file descriptors on which an event occurred.

 *

 * If the timeout is zero, returns immediately without blocking.

 * If the timeout is negative, waits indefinitely until an event appears.

 *

 * Returns ALOOPER_POLL_WAKE if the poll was awoken using wake() before

 * the timeout expired and no callbacks were invoked and no other file

 * descriptors were ready.

 *

 * Returns ALOOPER_POLL_CALLBACK if one or more callbacks were invoked.

 *

 * Returns ALOOPER_POLL_TIMEOUT if there was no data before the given

 * timeout expired.

 *

 * Returns ALOOPER_POLL_ERROR if an error occurred.

 *

 * Returns a value >= 0 containing an identifier if its file descriptor has data

 * and it has no callback function (requiring the caller here to handle it).

 * In this (and only this) case outFd, outEvents and outData will contain the poll

 * events and data associated with the fd, otherwise they will be set to NULL.

 *

 * This method does not return until it has finished invoking the appropriate callbacks

 * for all file descriptors that were signalled.

 */

int ALooper_pollOnce(int timeoutMillis, int* outFd, int* outEvents, void** outData);


/**

 * Like ALooper_pollOnce(), but performs all pending callbacks until all

 * data has been consumed or a file descriptor is available with no callback.

 * This function will never return ALOOPER_POLL_CALLBACK.

 */

int ALooper_pollAll(int timeoutMillis, int* outFd, int* outEvents, void** outData);






   // loop waiting for stuff to do.

//on_program_start();

while (1) {

// Read all pending events.

int ident;

int events;

struct android_poll_source* source;


// If not animating, we will block forever waiting for events.

// If animating, we loop until all events are read, then continue

// to draw the next frame of animation.

while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,

(void**)&source)) >= 0) {


// Process this event.

if (source != NULL) {

source->process(state, source);

}


// Check if we are exiting.

if (state->destroyRequested != 0) {

DEBUG_socket_printf("Engine thread destroy requested!\r\n");

//engine_term_display(&engine);

goto end;//return;

}

}


if (engine.animating)

{

engine_draw_frame(&engine);

}

}

Posted by 안녕1999
, |

Android API level XX
레벨 = 추가기능
"사용하고자 하는 기능"이 있는 레벨 이상으로 설정해주어야 한다.
예) 미디어플레이어 제작하려면, 레벨14이상 필요하다.
자세한 내용은 Android NDK Native APIs 에서 확인가능하다.
또한, 각 API레벨을 사용하기 위해서는 Android.mk 파일에 아래와 같은 내용을 추가해주어야 한다. 그러나, 자동으로 링크가 된다고 설명되어 있다. 어느것이 맞는지는 모르겠음.
For all API levels, the build system automatically links the standard C libraries, the standard C++ libraries, real-time extensions, and pthread; you do not need to include them when defining your LOCAL_LDLIBS variable. For more information about the C and C++ libraries, see Android API level 3.
LOCAL_LDLIBS += -lOpenMAXAL        //Android API level 14


Android API level 9
Android native application APIs
Starting from API level 9, you can write an entire Android app with native code, without using any Java.
아래의 경로에 가면, 안드로이드 NDK(JNI)헤더파일이 있다.
..\ANDROID\ANDROID-NDK-R13B\platforms\android-12\arch-x86\usr\include\android

api-level.h
asset_manager.h
asset_manager_jni.h
bitmap.h
configuration.h
dir.bat
input.h
keycodes.h
list.txt
log.h
looper.h
native_activity.h
native_window.h
native_window_jni.h
obb.h
rect.h
sensor.h
storage_manager.h
window.h

Android API level 14

The NDK provides the following APIs for developing native code that runs on Android 4.0 system images and above.

OpenMAX AL






Vulkan - Industry Forged - Khronos Group

https://www.khronos.org/vulkan/
이 페이지 번역하기
Vulkan is a new generation graphics and compute API that provides high-efficiency, cross-platform access to modern GPUs used in a wide variety of devices ...

벌컨 (API) - 위키백과, 우리 모두의 백과사전

https://ko.wikipedia.org/wiki/벌컨_(API)
벌컨(Vulkan)은 오버헤드가 적은 크로스 플랫폼 3D 그래픽스 및 컴퓨팅 API이다. 이는 GDC 2015에서 크로노스 그룹에 의해 처음으로 소개되었다. 초기의 Vulkan ...

Vulkan (API) - Wikipedia

https://en.wikipedia.org/wiki/Vulkan_(API)
이 페이지 번역하기
Vulkan is a low-overhead, cross-platform 3D graphics and compute API first announced at GDC 2015 by the Khronos Group. The Vulkan API was initially ...


Posted by 안녕1999
, |

안드로이드 개발 폴더에 보면, assets 폴더가 있다.

assets에 파일을 넣으면, apk파일에 포함이 되어, AssetManager로 접근할 수 있다.

- 파일크기는 (기본) 1M이하(압축안된 상태. 큰파일도 된다.)

- jpg,png,mp3,wav,. ... 이외의 확장자 파일은 자동으로 압축되어진다.




ㅈㅅㄹ :: 안드로이드 Asset 사용에 있어 몇가지...

zeph1e.tistory.com/49
2011. 8. 5. - 아시는 분들은 다 아시겠지만 asset을 패키지에 포함시키는 방법은 쉽다. ... 안드로이드 SDK에서 apk를 묶을 때, aapt는 몇 가지 확장자를 제외하고 ...

APK Expansion Files | Android Developers

https://developer.android.com/google/play/expansion-files.html
이 페이지 번역하기
Google Play currently requires that your APK file be no more than 100MB. For most applications, this is plenty of space for all the application's code and assets.


Posted by 안녕1999
, |

NDK 샘플소스 빌드는 예전처럼 잘안되다.(gradle용으로 변경되었다.)


 ant로 안드로이드 앱을 자동으로 빌드하자


Android Ant 설정및 Build


다운로드



Android\test-code>D:\Android\ant\bin\ant release

Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre1.8.0_121\lib\tools.jar

Buildfile: D:\Android\test-code\build.xml


XP에 "jdk-8u121-windows-i586.exe"을 설치하니, jdk1.8.0_121, jre1.8.0_121 2개의 폴더가 생기고,

jre1.8.0_121\lib\tools.jar를 jdk1.8.0_121\lib\tools.jar로 복사함.


..\Android\ant\bin\ant release

-build-setup:

[getbuildtools] Using latest Build Tools: 25.0.2

     [echo] Resolving Build Target for project_name...

[gettarget] Project Target:   Android 6.0

[gettarget] API level:        23

[gettarget] WARNING: No minSdkVersion value set. Application will install on all Android versions. 


minSdkVersion와 targetSdkVersion 정확하게 사용하기


ant debug

[aapt] invalid resource directory name : ....

=>ant clean 실행하고, ant debug하면 됨. 



>ndk-build

Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk


..Android/android-ndk-r13b/build//../build/core/add-application.mk:198: *** And

roid NDK: Aborting...    .  Stop.

NDK 빌드
걸리는게 머가 이리 많나...

이전 샘플소스에서 jni 폴더를 찾아서, 복사하니, 컴파일됨.


ndk-build는 jni폴더의 c파일을 찾고,

ant debug/release는 src폴더의 c파일을 찾는다.


android-sdks\tools\ant\build.xml파일에 소스파일 경로가 src로 되어 있다.

<property name="source.dir" value="src" />


최근 소스가 src로 되어 있다.

android-ndk-r13b\build\core\build-local.mk에는 jni폴더안에 c소스파일과 Android.mk파일이 존재해야한다.

그러나, 최신 소스에는 cpp폴더안에 c소스가 있고, CMakeLists.txt 파일이 존재한다.(Android.mk파일없음.
최신 샘플 소스는 gradle방식으로 수정된듯 싶다.

(NDK는 왜 안바뀌었냐고....)

최신 소스를 버리고, 예전 jni 방식을 사용해야할듯 싶다. 



test-code>ndk-build

[arm64-v8a] Compile        : native-media-jni <= native-media-jni.c

[arm64-v8a] SharedLibrary  : libnative-media-jni.so

[arm64-v8a] Install        : libnative-media-jni.so => libs/arm64-v8a/libnative-

media-jni.so

[x86_64] Compile        : native-media-jni <= native-media-jni.c

[x86_64] SharedLibrary  : libnative-media-jni.so

[x86_64] Install        : libnative-media-jni.so => libs/x86_64/libnative-media-

jni.so

[mips64] Compile        : native-media-jni <= native-media-jni.c

[mips64] SharedLibrary  : libnative-media-jni.so

[mips64] Install        : libnative-media-jni.so => libs/mips64/libnative-media-

jni.so

[armeabi-v7a] Compile thumb  : native-media-jni <= native-media-jni.c

[armeabi-v7a] SharedLibrary  : libnative-media-jni.so

[armeabi-v7a] Install        : libnative-media-jni.so => libs/armeabi-v7a/libnat

ive-media-jni.so

[armeabi] Compile thumb  : native-media-jni <= native-media-jni.c

[armeabi] SharedLibrary  : libnative-media-jni.so

[armeabi] Install        : libnative-media-jni.so => libs/armeabi/libnative-medi

a-jni.so

[x86] Compile        : native-media-jni <= native-media-jni.c

[x86] SharedLibrary  : libnative-media-jni.so

[x86] Install        : libnative-media-jni.so => libs/x86/libnative-media-jni.so


[mips] Compile        : native-media-jni <= native-media-jni.c

[mips] SharedLibrary  : libnative-media-jni.so

[mips] Install        : libnative-media-jni.so => libs/mips/libnative-media-jni.

so



set path=%path%;D:\Android\ant\bin;D:\Android\android-ndk-r13b\build;"C:\Program Files\Java\jdk1.8.0_121\bin"


d:

cd D:\Android\test


del /s/q obj\*.*

rd /s/q obj


ant clean




ndk-build

ant debug

ant release


obj,bin,gen 폴더 생성됨



source value 1.5 is obsolete and will be removed in a future release

stackoverflow.com/.../source-value-1-5-is-obsolete-a...
이 페이지 번역하기
2014. 6. 20. - Another possibility (which will fix it for all Android builds made with Ant), is to tweak ... [options] source value 1.5 is obsolete and will be removed in a future release [javac] warning: [options] target value 1.5 is obsolete and ...



NDK 컴파일(빌드)시 error: unable to rename temporary

=> clean 해주면 됨.


warning: implicit declaration of function 'close' is invalid in C99

=> #include <unistd.h>

'안드로이드' 카테고리의 다른 글

안드로이드 - NDK 사용법  (0) 2017.02.18
안드로이드 - assets 폴더  (0) 2017.02.05
안드로이드 - keystore 파일  (0) 2017.02.04
안드로이드 NDK 컴파일 환경 구축2  (0) 2017.01.28
안드로이드 AssetManager  (0) 2016.11.29
Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함