네. 그 창의 Repository URL 칸에는 “클론할 Git 저장소 주소(또는 username/repository)”를 넣으면 됩니다.

JP2ForAndroid를 받으려면 아래 둘 중 하나를 넣으세요.

1) 가장 확실한 입력값(추천)

URL 그대로 붙여넣기

또는 .git 없이도 보통 동작합니다:

2) 짧게 입력

GitHub.com 탭이라면 다음 형식도 됩니다:

  • Tgo1014/JP2ForAndroid

Local path는 지금처럼 G:\AndroidStudioProjects 그대로 두셔도 됩니다. (그러면 G:\AndroidStudioProjects\JP2ForAndroid로 내려받아집니다)


클론 후 “8504954ec0” 버전으로 맞추는 방법(GUI)

동우님은 현재 의존성이 8504954ec0라서, 클론 후 그 커밋으로 체크아웃하는 게 좋습니다.

  1. JP2ForAndroid 프로젝트를 연 상태에서
  2. Git 창(보통 하단) → Log
  3. 검색창에 8504954ec0 붙여넣기
  4. 해당 커밋을 우클릭 → Checkout Revision (또는 비슷한 메뉴)

그러면 소스가 그 커밋 상태로 고정됩니다.


원하시면, 클론이 끝난 뒤 JP2ForAndroid 프로젝트 루트의 파일 목록(스크린샷) 을 한 장만 올려주세요. 그러면 “AAR이 생성되는 모듈 이름”을 제가 정확히 지정해서, 다음에 실행할 Gradle Task와 CMakeLists.txt 수정 위치를 동우님 환경 기준으로 딱 맞춰드리겠습니다.

 

 


이 화면은 GitHub Desktop에서 “이 저장소는 fork인데, 앞으로 어떻게 쓸 건지”를 묻는 선택창입니다.

동우님 목적(= 내 앱에서 쓰기 위해 수정/빌드해서 AAR 만들기)이면 아래처럼 선택하시면 됩니다.

선택: For my own purposes 를 선택하세요

  • 이유: 지금은 원본(ThalesGroup/JP2ForAndroid)에 기여(PR)하려는 게 아니라,
  • 동우님 로컬에서 CMake/NDK 옵션을 수정해서 16KB 정렬로 다시 빌드하고,
  • 그 AAR을 내 앱(app/libs)에 넣어 쓰려는 목적이기 때문입니다.

그 다음 Continue 누르시면 됩니다.

참고

  • 나중에 정말로 원 프로젝트에 PR을 보낼 계획이 생기면 그때 “To contribute…”로 바꿔도 됩니다.
  • 지금 단계에서는 “For my own purposes”가 가장 단순하고 충돌이 적습니다.

Continue 후 다음 단계로, GitHub Desktop에서 History(로그) 에서 커밋 8504954ec0로 체크아웃하는 작업을 진행하시면 됩니다.

 


스크린샷의 핵심 에러는 16KB 정렬 문제가 아니라, JP2ForAndroid 프로젝트에서 Android SDK 경로를 못 찾아서 Gradle 설정 단계에서 바로 실패한 것입니다.

에러 메시지 요약:

  • SDK location not found
  • 해결 방법으로 ANDROID_HOME(또는 ANDROID_SDK_ROOT) 환경변수 설정 또는
  • 프로젝트 루트의 local.properties에 sdk.dir=... 설정을 요구

즉, 지금은 SDK 경로만 잡아주면 gradlew.bat projects / 빌드가 정상 진행됩니다.


1) 가장 쉬운 해결: local.properties 만들기(권장)

G:\AndroidStudioProjects\JP2ForAndroid\ (지금 CMD가 있는 그 폴더)에 local.properties 파일을 만들고 Android SDK 경로를 적으면 됩니다.

1-1) Android SDK 경로 확인

Android Studio에서 확인:

  • File > Settings > Appearance & Behavior > System Settings > Android SDK
  • 상단에 “Android SDK Location”이 나옵니다.
    • 보통 예: C:\Users\<사용자>\AppData\Local\Android\Sdk

1-2) local.properties 내용(예시)

파일 내용은 아래처럼 1줄이면 됩니다. (Windows는 \를 \\로 써야 안전합니다)

sdk.dir=C\:\\Users\\<사용자>\\AppData\\Local\\Android\\Sdk

1-3) CMD에서 바로 생성(예시)

<사용자> 부분만 본인 계정명으로 바꿔서 실행하세요.

cd /d G:\AndroidStudioProjects\JP2ForAndroid
echo sdk.dir=C\:\\Users\\<사용자>\\AppData\\Local\\Android\\Sdk> local.properties

그 다음 다시:

gradlew.bat projects

2) 대안: 환경변수로 잡기(임시/영구 둘 다 가능)

2-1) 현재 CMD 창에서만 임시로

set ANDROID_SDK_ROOT=C:\Users\<사용자>\AppData\Local\Android\Sdk
set ANDROID_HOME=%ANDROID_SDK_ROOT%
gradlew.bat projects

2-2) 영구 설정(Windows)

  • 시스템 환경 변수에 ANDROID_SDK_ROOT를 추가하고 값을 SDK 경로로 설정
  • 새 CMD를 열어서 다시 실행

다만, 프로젝트별로 확실한 건 local.properties 방식입니다.


3) 스크린샷에 보이는 경고들은 무시해도 됩니다

Groovy DSL deprecate 같은 메시지는 경고(warning) 이고, 지금 실패 원인은 SDK 경로 미설정이라 우선 이 부분만 해결하면 됩니다.


4) SDK 설정 후 다음 단계(미리 안내)

gradlew.bat projects가 성공하면, AAR 만들기 단계로 갑니다.

보통 이 레포에서는 library 모듈이 AAR을 만듭니다(스크린샷에도 library\build.gradle이 보임).

그래서 다음을 시도하세요:

gradlew.bat :library:assembleRelease
dir /s /b *.aar

.aar가 나오면 그걸 동우님 앱의:

  • app\libs\JP2ForAndroid.aar
    로 복사하면 됩니다.

우선 local.properties를 만든 뒤 gradlew.bat projects를 다시 실행한 결과 화면을 캡처해서 올려주세요. 그러면 제가 바로 이어서 “AAR 생성 모듈/명령어”를 동우님 레포 구조에 맞춰 정확히 지정해 드리겠습니다.

 

 


 

경로 찾기

 

네, 지금 화면은 정상입니다. 아직 “Android SDK” 항목이 화면에 안 보일 뿐이고, 보통 아래 방법 중 하나로 바로 찾을 수 있습니다.

1) 가장 쉬운 방법: 설정 검색창에 SDK 입력

지금 보이는 Settings 창 맨 위 검색창에 아래 중 하나를 입력하세요.

  • SDK
  • Android SDK
  • SDK Manager

그러면 오른쪽에 Android SDK Location(SDK 경로)이 있는 화면으로 바로 이동됩니다.

2) 메뉴로 들어가기: Tools → SDK Manager

Settings 창을 굳이 안 찾아도 됩니다.

  • 상단 메뉴 Tools → SDK Manager
  • 상단에 Android SDK Location이 표시됩니다.
    예: C:\Users\<사용자>\AppData\Local\Android\Sdk

3) “System Settings” 아래에 없으면, 다른 위치에 있을 수 있습니다

Android Studio 버전/플러그인 구성에 따라 SDK 메뉴가 다음 경로로 보이기도 합니다.

  • Languages & Frameworks → Android SDK

(역시 검색창에 Android SDK 치는 게 가장 빠릅니다.)

 


 

 

지금 뜬 메시지는 정상입니다. sdk.dir=... 는 CMD에서 실행하는 “명령어”가 아니라, local.properties 파일 안에 적어야 하는 설정 값이라서, 콘솔에 그대로 치면 “명령이 아닙니다”가 나옵니다.

아래대로 하시면 바로 해결됩니다.


1) local.properties 파일 만들기 (가장 확실)

지금 폴더가 G:\AndroidStudioProjects\JP2ForAndroid 맞으니, 그 위치에 local.properties 파일을 만들어서 한 줄만 넣으면 됩니다.

방법 A: Notepad로 만들기(가장 쉬움)

CMD에서 아래 입력:

notepad local.properties

메모장이 뜨면 아래 한 줄을 그대로 붙여넣고 저장하세요.
(역슬래시 문제 피하려고 슬래시(/) 로 적는 게 제일 안전합니다.)

sdk.dir=C:/Users/사용자/AppData/Local/Android/Sdk

저장 후 메모장 닫기.

방법 B: CMD에서 한 줄로 생성

cd /d G:\AndroidStudioProjects\JP2ForAndroid
echo sdk.dir=C:/Users/사용자/AppData/Local/Android/Sdk> local.properties

2) 다시 Gradle 실행

이제 아래를 다시 실행하세요.

gradlew.bat projects

여기서 더 이상 SDK location not found가 안 나와야 정상입니다.


3) 다음 단계(바로 이어서)

projects가 정상 출력되면 AAR 빌드를 시도합니다(대부분 library 모듈).

gradlew.bat :library:assembleRelease
dir /s /b *.aar

.aar 경로가 출력되면 그 파일을 동우님 앱 프로젝트의 app\libs\JP2ForAndroid.aar로 복사하면 됩니다.


먼저 local.properties 만든 다음 gradlew.bat projects 실행 결과 화면(또는 마지막 20줄)을 올려주시면, 바로 다음 빌드 단계로 정확히 안내하겠습니다.

 


지금 오류의 의미는 단순합니다.

:library:assembleRelease 를 실행했는데, 이 레포에는 library라는 Gradle 모듈이 없어서 실패한 것입니다.
(메시지: project 'library' not found in root project 'JP2ForAndroid')

스크린샷 상단에 > Configure project :jp2-android가 보이므로, 이 레포의 실제 모듈 이름은 :jp2-android 쪽일 가능성이 매우 큽니다.


1) 지금 CMD에서 먼저 이걸 입력하세요(모듈 이름 확인)

gradlew.bat projects

출력에 보이는 Included projects: 아래에 모듈들이 :jp2-android 같은 형태로 나옵니다.


2) (가장 가능성 큼) 모듈이 :jp2-android 하나라면, 이렇게 빌드하세요

gradlew.bat :jp2-android:assembleRelease

빌드가 끝나면 AAR이 생겼는지 전체 검색:

dir /s /b *.aar

여기서 출력되는 .aar 파일이 “로컬 AAR”로 앱에 넣을 대상입니다.


3) 모듈이 여러 개라면(예: :jp2-android 외에도 있음)

projects 출력에서 AAR 만들 것 같은 모듈명을 골라서 아래처럼 실행합니다.

gradlew.bat :모듈명:assembleRelease

예:

gradlew.bat :jp2-android:assembleRelease

4) 참고: 경고 메시지는 일단 무시해도 됩니다

android.defaults.buildfeatures.buildconfig=true is deprecated 같은 것은 경고이고, 지금 실패 원인은 모듈명이 틀린 것이라서 우선 위 명령으로 해결하면 됩니다.


다음 단계로 넘어가기 위한 요청

gradlew.bat projects 실행 결과에서 Included projects 부분만 그대로 붙여주세요.
제가 그걸 보고 “정확히 어느 모듈을 빌드하면 AAR이 나오는지”를 확정해서, 다음 단계(16KB 정렬 넣는 CMake 수정 위치)까지 바로 이어서 안내드리겠습니다.

 


좋습니다. 로컬 AAR(app/libs) 방식으로 진행할 수 있도록, 동우님 프로젝트에 “로컬 AAR 우선 사용” 구조를 넣은 수정본 ZIP을 만들어 두었습니다.

1) 이 ZIP에서 바뀐 점(핵심만)

app/build.gradle.kts

  • app/libs/JP2ForAndroid.aar 파일이 존재하면 그 AAR을 우선 사용
  • 없으면(임시) 기존 JitPack 의존성을 사용하도록 처리

즉, 앞으로는 재빌드한 AAR만 app/libs에 넣으면 앱 빌드가 그걸 자동으로 사용합니다.

추가된 폴더/파일

  • app/libs/ 폴더 + README_PLACE_JP2_AAR_HERE.txt (여기에 AAR을 넣으라는 표시)
  • LOCAL_AAR_JP2_16KB_GUIDE.md (검증/명령어 요약)

따라서 “app/build.gradle.kts만 교체”로도 최소 동작은 되지만, 로컬 AAR을 넣을 app/libs/ 폴더가 필요하니 ZIP 전체를 적용하는 편이 안전합니다.


2) 동우님이 실제로 해야 할 작업(순서대로)

단계 A) JP2ForAndroid를 16KB 정렬로 “재빌드”해서 AAR 만들기

  1. JP2ForAndroid 소스(현재 쓰는 버전/커밋 기반)를 로컬에 받습니다.
  2. NDK r28 이상으로 빌드하도록 맞춥니다(권장).
  3. (중요) OpenJPEG 쪽 링크 옵션에 16KB 정렬이 반영되도록 합니다. 보편적으로 CMake를 쓴다면 JP2ForAndroid의 CMakeLists.txt(또는 openjpeg 모듈 CMake)에 아래 중 하나를 추가합니다.

권장 예시(링커 옵션 강제):

add_link_options("-Wl,-z,max-page-size=16384")

또는 타겟 기반:

target_link_options(<target_name> PRIVATE "-Wl,-z,max-page-size=16384")
  1. AAR 빌드(프로젝트마다 모듈명이 다르므로, 우선은 보편적으로):
./gradlew assembleRelease
  1. 생성된 AAR 위치 예:
  • */build/outputs/aar/*.aar

단계 B) 동우님 앱 프로젝트에 AAR 배치

재빌드된 AAR 파일을 아래 정확한 경로/이름으로 복사하세요.

  • app/libs/JP2ForAndroid.aar

(이 이름이어야 방금 제가 넣어둔 Gradle 로직이 자동으로 잡습니다.)


단계 C) “정말 16KB 정렬이 되었는지” AAR/앱 번들 검증

이 단계가 매우 중요합니다. AAR만 바꿨는데도 내부 .so가 여전히 4KB 정렬이면 똑같이 막힙니다.

1) AAR 내부 so 정렬 확인 (PowerShell 예시)

ZIP에 포함해둔 LOCAL_AAR_JP2_16KB_GUIDE.md에도 있지만, 요지만 적으면:

  • AAR 압축을 풀고 jni/arm64-v8a/libopenjpeg.so에 대해 llvm-readelf -l로 LOAD Align이 0x4000인지 확인합니다.

2) 최종 산출물 확인 (Release AAB 기준)

./gradlew clean bundleRelease

생성된 .aab를 Analyze 해서:

  • base/lib/arm64-v8a/libopenjpeg.so가 16KB 정렬인지 확인

3) 기대치 정리

  • useLegacyPackaging = true는 유지되어 있습니다(요청하신 옵션 포함).
  • 하지만 이 옵션은 “포장 방식”이고, 동우님 케이스는 .so 자체(ELF)가 4KB 정렬이라서 결국 재빌드된 AAR이 핵심입니다.
  • 로컬 AAR 방식은 재빌드 결과를 가장 빠르게 검증할 수 있는 루트입니다.

원하시면, 동우님이 **JP2ForAndroid 소스 프로젝트 ZIP(또는 해당 repo 폴더)**를 올려주시면, 제가 그 소스의 빌드 시스템(CMake/ndk-build/기타)을 확인한 뒤 “어느 파일에 어떤 줄을 추가해야 16KB 정렬이 실제로 들어가는지”를 정확히 찍어서 수정 패치 형태로 만들어드릴 수 있습니다.

 


전체 정리

 

아래는 동우님이 방금 성공한 작업 전체를 “처음부터 끝까지” 재현 가능한 형태로 정리한 것입니다. (중간에 헷갈렸던 포인트도 같이 바로잡았습니다.)


1) 문제 원인 요약

  • Play Console의 “16KB 페이지 크기(Alignment) 미지원” 오류는 앱 안에 포함된 네이티브 라이브러리(.so) 중 일부가 LOAD 세그먼트 정렬이 16KB가 아닌(대개 4KB) 상태일 때 발생합니다.
  • 동우님 앱에서는 pdfbox-android가 PDF 내부 JPEG2000(JPXDecode)을 처리할 때 쓰는 JP2ForAndroid(OpenJPEG) 의 libopenjpeg.so가 문제였습니다.

2) JP2ForAndroid를 로컬에서 빌드하기 위한 준비(SDK 경로 설정)

JP2ForAndroid 프로젝트를 Gradle로 빌드하려면 Android SDK 경로를 인식해야 합니다.

2-1) Android SDK 설치/확인

  • Android Studio에서 SDK Manager로 SDK가 설치되어 있어야 합니다.

2-2) JP2ForAndroid 폴더에 local.properties 생성

JP2ForAndroid 프로젝트 루트(예: G:\AndroidStudioProjects\JP2ForAndroid\)에 파일 생성:

local.properties

sdk.dir=C:/Users/사용자/AppData/Local/Android/Sdk

주의: sdk.dir=...는 CMD에 치는 명령이 아니라 파일에 적는 설정입니다.


3) JP2ForAndroid 소스 받기(클론)

(선택) 앱에서 쓰는 커밋과 맞추고 싶으면:

  • GitHub Desktop의 History에서 8504954ec0 커밋으로 Checkout

4) JP2ForAndroid에서 AAR 만들기

4-1) 모듈(프로젝트) 이름 확인

CMD에서 JP2ForAndroid 루트로 이동 후:

gradlew.bat projects

4-2) 실제 모듈명으로 Release 빌드

동우님 경우 화면상 모듈이 :jp2-android로 보였으므로:

gradlew.bat :jp2-android:assembleRelease

4-3) 생성된 AAR 찾기

dir /s /b *.aar

여기서 나온 .aar 파일이 최종 산출물입니다.


5) AAR을 앱 프로젝트에 넣기 (중요: lib 폴더가 아니라 app/libs)

동우님 요약에서 “lib 폴더에 넣기”라고 하셨는데, 정확히는:

  • 앱 프로젝트의 app/libs/ 폴더에 넣는 게 맞습니다.
    • 예: <앱프로젝트루트>/app/libs/JP2ForAndroid.aar

6) 앱의 app/build.gradle.kts 설정(로컬 AAR 우선 사용)

동우님이 적용한 형태가 맞고, 핵심은 다음 2가지입니다.

  1. app/libs/JP2ForAndroid.aar가 있으면 그걸 사용
  2. 없으면 임시로 원격(JitPack) 의존성을 사용

또한 안정성을 위해 JP2ForAndroid는 runtimeOnly보다 implementation 권장입니다(릴리즈에서 R8/minify 상황에서 안전).

동우님 파일을 기준으로 “권장 완성 형태”는 아래 같은 구조입니다.

  • app/libs/JP2ForAndroid.aar 존재 시 로컬 AAR 사용
  • 없으면 원격 의존성 사용
  • useLegacyPackaging = true 유지(요청 반영)

7) 최종 검증(Release AAB 기준)

  1. 앱 프로젝트에서:
./gradlew clean bundleRelease
  1. 생성된 app-release.aab를 Analyze 해서
  • base/lib/arm64-v8a/libopenjpeg.so 등에 대해
  • “16KB Alignment 경고가 사라졌는지” 확인

이제 “문제 없이 통과하나요?”

가능성이 매우 높습니다. 다만, 저는 Play Console에 직접 업로드해서 결과를 볼 수는 없기 때문에, 다음 2가지를 만족하면 ‘통과 조건은 충족’했다고 보셔도 됩니다.

통과 체크리스트(이 2개면 충분)

  1. Release AAB를 Analyze 했을 때 “16KB Alignment 경고가 없음”
  2. AAB 안의 모든 ABI(특히 arm64-v8a)에서 문제 라이브러리(libopenjpeg.so)가 더 이상 4KB 정렬 경고를 내지 않음

이 두 조건이 충족되면, Play Console의 해당 정책 검사에서 막힐 이유가 거의 없습니다.


원하시면, 지금 최종 산출된 release AAB를 다시 올려주시면(또는 Analyze 화면 캡처), 제가 “16KB 경고가 완전히 사라졌는지”를 마지막으로 한 번 더 확인해 드리겠습니다.

 


기타 실패 했던 명령어들

 

좋습니다. 지금 화면은 JP2ForAndroid 저장소 루트 폴더( G:\AndroidStudioProjects\JP2ForAndroid> )에 들어와 있는 상태라서, 여기서는 “AAR을 만드는 모듈이 뭔지 확인하고, 그 모듈을 Release로 빌드”하는 순서로 진행하면 됩니다.

아래를 그대로 순서대로 입력하세요(Windows CMD 기준).


1) 먼저 “모듈 목록” 확인

gradlew.bat projects

출력에 :something 형태로 모듈들이 보일 겁니다.
(예: :app, :library, :jp2forandroid 같은 식)


2) “AAR을 만드는 모듈” 찾기 (library 모듈)

다음 명령으로 빌드 태스크 목록을 봅니다:

gradlew.bat tasks

여기서 보통 AAR을 만드는 모듈은 assembleRelease가 있고, 빌드 결과가 build\outputs\aar\로 떨어집니다.


3) 일단 전체 Release 빌드 한 번 돌려서 AAR이 생기는지 확인(가장 단순)

gradlew.bat assembleRelease

성공하면, 저장소 아래 어딘가에 보통 이런 경로로 AAR이 생성됩니다:

  • 모듈이름\build\outputs\aar\*.aar

생성 여부를 빠르게 찾으려면:

dir /s /b *.aar

이 명령은 폴더 전체에서 .aar 파일을 찾아서 경로를 출력합니다.


4) 만약 AAR이 안 나오면(앱만 있는 경우/모듈 지정이 필요한 경우)

  1. gradlew.bat projects 출력에서 라이브러리로 보이는 모듈명을 하나 고르고
  2. 아래처럼 모듈을 지정해서 빌드하세요:
gradlew.bat :모듈명:assembleRelease

예를 들어 모듈명이 jp2forandroid였다면:

gradlew.bat :jp2forandroid:assembleRelease

5) “8504954ec0” 커밋으로 맞추기(필요 시)

Git이 설치되어 있고 PATH에 잡혀 있으면, 현재 커밋을 확인/이동할 수 있습니다.

현재 커밋 확인:

git rev-parse --short HEAD

원하는 커밋으로 이동:

git checkout 8504954ec0

Git 명령이 안 먹으면(“git은 내부/외부 명령이 아닙니다”가 뜨면) GitHub Desktop에서 History에서 해당 커밋을 찾아 Checkout 하시면 됩니다.


중요한 정리: add_link_options(...)는 “여기서 치는 명령”이 아닙니다

동우님이 전에 치셨던
add_link_options("-Wl,-z,max-page-size=16384")
이건 CMD/PowerShell 명령이 아니라 CMakeLists.txt 안에 넣는 코드입니다.

따라서 지금 CMD에서는 위 1~4단계로 AAR이 어디서 생성되는지부터 확인하고, 그 다음에 제가 “어느 CMakeLists에 어떤 줄을 넣을지”를 정확히 안내하는 흐름이 가장 안전합니다.


다음 메시지로 이것만 알려주세요

위에서 dir /s /b *.aar 결과(출력된 경로) 를 그대로 붙여 주세요.
그러면 제가 그 경로를 기준으로:

  1. AAR 생성 모듈이 정확히 무엇인지 확정
  2. 16KB 정렬을 넣어야 하는 CMakeLists.txt 위치를 딱 집어서
  3. 수정 후 다시 빌드 → app/libs/JP2ForAndroid.aar로 복사하는 단계

까지 이어서 정확히 진행시켜 드리겠습니다.

 


https://divheer.tistory.com/585

 

[Flutter] Android 16KB 페이지 크기 지원 대응 방법

구글 플레이 16KB 페이지 크기 요구사항앞으로 Android 15 이상을 타겟팅하는 모든 앱은 16KB 페이지 사이즈를 지원해야 한다.2025년 11월 1일부터는 16KB 페이지 사이즈를 지원하지 않는 앱은 Google Play

divheer.tistory.com

https://developer.android.com/guide/practices/page-sizes?hl=ko#kotlin

 

16KB 페이지 크기 지원  |  Compatibility  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 16KB 페이지 크기 지원 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 16KB Google Play 호환성 요구사항 202

developer.android.com

축하드립니다. 이제 질문하신 것들을 깔끔하게 정리해서 설명드리겠습니다.

AAR이 뭔가요? 앱인가요?

AAR(Android ARchive) 는 “앱”이 아니라 안드로이드 라이브러리 패키지입니다.

  • APK: 설치해서 실행하는 앱 파일
  • AAB: Play Console에 올리는 배포용 번들 파일
  • AAR: 앱에 포함해서 쓰는 라이브러리 묶음(코드, 리소스, 매니페스트, 그리고 jni/*.so 같은 네이티브 라이브러리까지 포함 가능)

즉, 동우님이 만든 AAR은 “JP2ForAndroid라는 기능 부품”을 포장한 것이고, 앱(txt)이 그 부품을 포함해서 빌드되는 구조입니다. AAR 자체를 설치해서 실행하는 건 아닙니다.


“무료 PDF 파일 같은 걸 공식적으로 가져오면 되나요?”

여기서 두 가지 의미가 섞여 있어 보여서 구분해서 답변드릴게요.

1) “PDF 처리 라이브러리”는 공식/무료로 가져오면 되나요?

네. 동우님 앱은 이미:

  • pdfbox-android (오픈소스 라이브러리)
  • JP2ForAndroid (JPEG2000 디코딩 보조 라이브러리)

같은 오픈소스를 Gradle 의존성으로 가져와 쓰는 게 정상적인 방식입니다. 다만 이번처럼 정책/호환성(16KB) 때문에 소스를 직접 빌드해서 AAR로 쓰는 경우가 생긴 겁니다.

2) “테스트용 무료 PDF 파일”을 말하신 거라면?

테스트 자료(PDF)는 저작권이 매우 자주 걸립니다.
가장 안전한 건:

  • 공공기관/정부 공개 문서
  • 표준 문서(PDF 스펙 관련 샘플)
  • 퍼블릭 도메인/CC 라이선스 명시된 자료
    같은 “재배포가 허용된 PDF”를 쓰는 것입니다.

개인적으로 가지고 있는 상용 PDF(책, 논문, 유료 문서)는 테스트에는 써도 되지만, 앱에 포함하거나 배포하면 문제가 될 수 있습니다.


“16KB가 아닌데 뭐가 어떻게 된 건가요?”

핵심은 이겁니다.

1) 16KB는 “파일 크기”가 아니라 메모리 페이지 크기(page size) 입니다

운영체제는 메모리를 “페이지” 단위로 관리하는데,

  • 예전/대부분 기기: 4KB 페이지
  • 일부 Android 15(및 이후) 기기: 16KB 페이지

2) 문제는 libopenjpeg.so 같은 네이티브 라이브러리(.so)의 “정렬(Alignment)”

네이티브 라이브러리는 실행 시 OS가 메모리에 매핑(mapping)하는데, 이때 ELF 파일 내부의 LOAD 세그먼트 정렬 값(p_align) 이 페이지 크기와 맞아야 안전하게 매핑됩니다.

동우님이 겪은 케이스는:

  • JP2ForAndroid 안의 libopenjpeg.so가 4KB 정렬(0x1000) 로 빌드된 상태였고
  • 16KB 페이지 기기에서는 그 정렬이 부족해서 로드가 거부될 수 있어서 Play가 차단한 겁니다.

3) 왜 “AAR을 새로 빌드”하니 해결됐나?

동우님이 JP2ForAndroid를 직접 빌드하면서(또는 새 툴체인/설정으로 빌드하면서) 그 .so가 16KB 페이지 호환 정렬로 만들어진 버전이 되었고, 그 결과:

  • Release AAB에서 16KB 경고가 사라졌고
  • Play 정책 검사도 통과한 것입니다.

짧은 비유

  • AAR: 엔진 부품 상자
  • APK/AAB: 자동차(앱) 완제품/출고용 포장
  • 16KB 문제: 부품(네이티브 .so)의 규격이 새 도로 규격(16KB 페이지)과 안 맞아서 “출고 검사(Play)”에서 걸린 상황
  • 동우님이 한 일: 부품을 새 규격에 맞게 다시 제작(AAR 재빌드)해서 교체

원하시면, 동우님이 만든 AAR이 정말 16KB 정렬로 들어갔는지 확인하는 “검증 명령(Windows 기준)”도 짧게 정리해 드릴까요?

 

 


기타

 

https://krcandan.blogspot.com/2025/12/jp2forandroid.html

 

JP2ForAndroid 찾기 명령어

동우의 블러그 입니다

krcandan.blogspot.com


어떤 녀석이 문제 인지 찾기

 

빌드를 APK로 만든 다음에

실행을 시켜 보면 문제가 되는 에가 나온다

이런 식으로

Build > Analyze APK.

이렇게 해보면 또 나오고..

 

이걸 gpt에게 aab 파일 형태로 주면 해석 해줌..

 

 

스크린샷에 나온 경고만으로도 **“적어도 지금 실행한 debug APK는 16KB 페이지 기기와 호환되지 않는다”**는 것은 확실합니다. 메시지에 정확히:

  • APK app-debug.apk is not compatible with 16 KB devices
  • 문제 라이브러리: lib/x86_64/libopenjpeg.so (LOAD 정렬이 16KB가 아님)

이라고 나오기 때문입니다.

다만, 이 화면만 보고 “Play 업로드용 release(AAB)가 해결됐는지”까지는 단정할 수 없습니다. 이유는 두 가지입니다.

왜 이 화면만으로 “최종 해결 여부”를 확정할 수 없나

  1. 지금 경고 대상이 app-debug.apk 입니다.
    Play에 올리는 것은 보통 release AAB이므로, debug와 결과가 다를 수 있습니다.
  2. 경고가 찍힌 ABI가 x86_64 입니다.
    Android Studio 에뮬레이터는 대개 x86_64라서 debug 빌드에 x86_64 네이티브가 포함되면 이런 경고가 쉽게 뜹니다.

하지만, 현실적으로는 다음이 중요합니다.

현실적인 결론(동우님 프로젝트 기준)

  • 해결 안 됐을 가능성이 매우 큽니다.
  • 특히 이전에 제가 확인했던 동우님 app-release.apk에서는 arm64-v8a 쪽 libopenjpeg.so도 4KB 정렬(0x1000) 이었습니다.
    useLegacyPackaging = true는 “포장 방식”에 영향을 줄 뿐, .so 바이너리의 ELF LOAD 정렬을 4KB→16KB로 바꾸지는 못합니다.
    그래서 이 옵션만으로 근본 해결이 되는 경우는 제한적입니다.

지금 바로 확인해야 할 2가지 (가장 확실)

1) Release AAB를 만들고, AAB를 기준으로 검사

  1. Build > Generate Signed Bundle / APK…
  2. Android App Bundle(AAB) 선택, release 선택
  3. 생성된 .aab를 Analyze 해보세요.

2) “어떤 ABI가 문제인지”를 정확히 보기

Android Studio의 Analyze에서 다음 경로를 확인하세요.

  • lib/arm64-v8a/libopenjpeg.so도 경고가 뜨는지
  • lib/x86_64/libopenjpeg.so만 경고인지

만약 arm64-v8a도 경고면 → Play 업로드는 계속 막힐 확률이 매우 높고, 결국 OpenJPEG를 16KB 정렬로 재빌드해야 합니다.
만약 x86_64만 경고고 arm64는 OK면 → release에서 x86_64를 제외하는 방식으로 통과 가능성이 생깁니다(아래 참고).


참고: “x86_64만” 문제일 때의 우회책(가능한 경우에만)

Play에 올리는 release 빌드에서 굳이 x86/x86_64를 포함하지 않아도 된다면, release에 한해 ABI를 ARM만 포함시키는 방법이 있습니다.

app/build.gradle.kts:

android {
    defaultConfig {
        ndk {
            abiFilters += listOf("arm64-v8a", "armeabi-v7a")
        }
    }
}

단, 이건 arm64-v8a가 이미 16KB 정렬로 정상일 때만 의미가 있습니다.
(동우님은 과거 release에서 arm64도 문제가 있었기 때문에, 이 우회만으로는 부족할 가능성이 큽니다.)


결론

  • 스크린샷 기준: debug APK는 아직 해결 안 됐습니다.
  • 최종 판단: release AAB 기준으로 arm64-v8a의 libopenjpeg.so가 16KB 정렬인지 확인해야 합니다.
  • arm64까지 문제면: 결국 JP2ForAndroid(OpenJPEG) 16KB 대응 재빌드(선택지 B) 로 가야 합니다.

원하시면, 동우님이 release AAB를 Analyze한 화면에서 lib/arm64-v8a/libopenjpeg.so 부분만 캡처해서 올려주시면, “우회 가능(ABI 제외)”인지 “재빌드 필수”인지 바로 확정해서 다음 작업을 정확히 안내드리겠습니다.

 

 

 


해결 지점

 

네. 동우님이 보내주신 app-release.aab를 직접 열어서 확인해보니, 아직 해결되지 않았습니다.

AAB 분석 결과(확정)

app-release.aab 안에 아래 파일들이 포함되어 있고:

  • base/lib/arm64-v8a/libopenjpeg.so
  • base/lib/armeabi-v7a/libopenjpeg.so
  • base/lib/x86/libopenjpeg.so
  • base/lib/x86_64/libopenjpeg.so

네 개 모두 ELF LOAD segment alignment가 0x1000(= 4KB) 입니다.
16KB 대응이 되려면 여기 정렬이 0x4000(=16KB) 로 빌드되어 있어야 합니다.

즉, Android Studio 알림(16KB Alignment 경고)은 debug만의 문제가 아니라, release AAB 자체가 16KB 미지원 상태라는 뜻입니다.

왜 useLegacyPackaging = true로는 해결이 안 되나

useLegacyPackaging은 JNI 라이브러리를 APK/AAB에 “포장(패키징)”하는 방식을 바꾸는 옵션입니다.
하지만 지금 문제는 .so 파일 자체가 4KB 정렬로 링크되어 만들어진 바이너리(ELF) 문제라서, 포장 방식을 바꿔도 .so 내부 정렬이 16KB로 바뀌지 않습니다.

공식 가이드도 “앱이 NDK 라이브러리를 직접/간접으로 사용하면 16KB 기기 대응을 위해 해당 네이티브 라이브러리를 재빌드해야 한다”고 정리합니다. (Android Developers)

다음 액션(현실적으로 2가지)

1) JPEG2000(JPXDecode) 지원이 꼭 필요 없으면: JP2ForAndroid 제거

이 경우 libopenjpeg.so가 사라져서 16KB 이슈도 바로 없어집니다(대부분 PDF는 정상 유지).

2) JPEG2000이 필요하면(동우님 선택): JP2ForAndroid/OpenJPEG를 16KB 정렬로 재빌드한 AAR로 교체

이게 유일하게 확실한 해결책입니다.

권장 빌드 조건(공식 취지):

  • **NDK r28+**로 빌드(16KB 정렬 지원이 기본에 가까움)
  • 또는 링커 옵션으로 강제: -Wl,-z,max-page-size=16384 (일부 환경에서 common-page-size도 함께 사용) (Android Developers)

그리고 앱에서는 JitPack 의존성이면(현재처럼) 포크한 repo를 JitPack으로 빌드해서:
runtimeOnly("com.github.<동우님GitHub>:JP2ForAndroid:<tag>") 형태로 바꾸는 방식이 가장 깔끔합니다. (JP2ForAndroid가 JitPack으로 배포된 전례도 이슈에 남아 있습니다.) (GitHub)


원하시면, 제가 동우님 현재 프로젝트(app/build.gradle.kts, settings.gradle.kts) 기준으로 **“JP2ForAndroid 포크 → NDK r28 고정 → 링크 플래그 추가 → AAR 생성 → JitPack/로컬 AAR로 연결”**까지를 복붙 가능한 단계/파일 위치 단위로 정확히 작성해 드리겠습니다.
다만 진행 전, 동우님이 JP2ForAndroid를 ‘JitPack(포크 repo)’로 교체할지, 아니면 ‘로컬 AAR(app/libs)’로 먼저 테스트할지 중 하나만 선택해서 알려주시면 그 경로로 바로 문서를 드리겠습니다.

 

그래서 JP2ForAndroid를 설치 하게 되었음 결론적으로.. 이걸로 해결.. 나의 경우

반응형

+ Recent posts