리소스 오버레이 프로젝트 폴더 준비: AndroidManifest.xml 파일, res 폴더
안드로이드 스튜디오 프로젝트로 만드는 분들도 있던데, 저는 잘 몰라서 손수 해 보겠습니다.
잘 찾아보면 괜찮은 템플릿 많이 있는 것 같아요. 요런 것도 있고요
프로젝트 폴더로 삼을 폴더 하나를 만들고, 그 안에 아래와 같은 파일 및 폴더를 만드세요.
(1) AndroidManifest.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:compileSdkVersion="28" android:compileSdkVersionCodename="9" package="<오버레이 패키지명>">
<overlay android:priority="<우선순위>" android:targetPackage="<대상 패키지명>"/>
<application android:allowBackup="false" android:hasCode="false"/>
</manifest>
- <오버레이 패키지명>
리소스 오버레이 패키지의 이름을 적당히 지어주시면 됩니다. - <대상 패키지명>
리소스를 수정하려는 대상 앱의 패키지 이름을 적으세요. - <우선순위>
양수 자연수 숫자 값이고요, 같은 대상 패키지에 대해 오버레이가 여러 개 있을 때... 낮은 우선순위 값을 지닌 오버레이가 나중에 적용됩니다. 최후의 승자가 되는 셈이죠.
예를 들어, 쓰고 있는 오버레이의 우선순위가 9인데, 같은 앱을 대상으로 하는 내 오버레이가 꼭 적용되어야 한다면 우선순위를 9보다 작은 8 또는 그 이하 값으로 주면 되겠죠.
(2) res
폴더
요기다 수정하려는 리소스를 넣어두게 됩니다. 하위 폴더 구조는 일반적인 안드로이드 앱 리소스와 같으니 안드로이드 문서, 또는 수정 대상과 똑같이 해 두세요. 아래에서 이어집니다.
수정할 리소스 만들어 넣기
💡 리소스 폴더명 뒤에 옵션이 붙을 수 있습니다:
- 화면 밀도 (
xhdpi
,xxhdpi
, ...), 회전 여부 (land
), API 버전 (v21
), 야간 모드 (dark
), 언어 (ko
) 등등✔ 각각 다 고쳐주셔야 합니다!
- 덮어쓰려는 리소스 파일과 같은 경로, 같은 파일 이름으로 만드세요.
해본 것 위주로 예시를 적어보겠습니다.
숫자, 문자열 값 /res/values/...
원본과 같은 이름의 폴더에 같은 이름의 파일을 만들고 (e.g. dimens.xml
), 파일 내용으로는 덮어쓰려는 키-값 쌍만 나열해 주세요. 원래 파일의 키-값 전체를 반복해서 쓸 필요 없습니다. 파일 내용으로 예를 들면 이렇습니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="operator_text_font_size">0.0dip</dimen>
<dimen name="operator_text_kt_image_width">0.0dip</dimen>
<!-- 몇 개 더 덮어썼지만 생략합니다. -->
</resources>
위험도: 낮음 ✅
다른 곳에서 정의된 ID를 참조하는 형태가 아니므로 _없는 ID 참조 예외_가 발생할 일 없으며, 어지간히 잘못된 값을 주지 않는 한 앱 오류를 발생시킬 가능성도 낮으므로 그럭저럭 실수해도 안전하다 하겠습니다.
그림 리소스: /res/drawable/...
또는 /res/mipmap/...
drawable
폴더에 바로 그림이 있을수도 있고, drawable
폴더에는 상황별 리소스를 참조하는 XML 파일이 있고 mipmap
에 실제 그림 리소스가 있을 수 있습니다. XML 파일을 고치는 것은 위험하다고 생각되니, 대신 이미지 파일을 수정해보세요.
e.g. /res/drawables-xxxhdpi-v4/stat_sys_operator_kt.png
파일을 투명 파일로 교체, xxxhdpi
대신 xxhdpi
, xhdpi
폴더의 그림도 마찬가지.
💡 화면 밀도, 회전 여부 등 폴더명 베리에이션을 잊지 마세요.
위험도: (그림 자체) 낮음 ✅
다른 곳에서 정의된 ID를 참조하는 형태가 아니므로 _없는 ID 참조 예외_가 발생할 일 없으며, 그림이 비정상이 아닌 한 역시 안전하다 하겠습니다.
위험도: (XML 파일) ..? ❔
(안 해봤습니다. 다른 리소스명을 참조하게 되기 때문에 혹시나 새 버전에서 사라지면.. 오류를 일으킬 것 같습니다.)
스타일 /res/values/styles.xml
TODO 스타일 상속 받는 법을 잘 모르겠더라구요.. 그걸 제외하고는 앞과 비슷하게 (1) 같은 이름의 스타일을 적고, (2) 그 안에 덮어쓸 item
을 나열하세요.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TextAppearance.Material.Notification.Emphasis" parent="@*android:style/TextAppearance.Material.Notification.Emphasis">
<item name="android:textColor">#66ffffff</item>
</style>
</resources>
💡 정의된 다른 ID를 참조할 때는 아래와 같이 적으세요.
@*<패키지명>:<리소스 분류>/<리소스 ID>
오버레이 대상 패키지에 속한 ID를 참조할 때, 안드로이드 프레임워크 (위의android
) 안의 내장 ID를 참조할 때 모두 위와 같이@*
기호와 함께 패키지명을 적어 주세요.
(왜 그래야 할까요... :()
위험도: 잘 모름
음... 참조 잘못하면 위험하겠죠.
레이아웃
한 발 나아가서 레이아웃도 굳이 고치려면 고칠 수 있습니다. 그런데 XML 파일에 다른 곳에서 정의된 ID를 참조하거나, 새 ID를 정의하는 내용이 들어갑니다. 앱 업데이트 후 있던 ID가 없어지거나 ID 이름이 바뀌었을 때, 레이아웃에서 또는 소스코드에서 엉뚱한 ID를 참조하려 하면 오류가 발생하겠습니다. 시스템 리소스를 수정한다면 오류 때문에 더 위험하겠죠?
원본 레이아웃 파일을 오버레이 프로젝트 폴더로 복사해 오세요.
파일을 열고, ID 참조 부분을 모두 수정해주세요.
💡 오버레이 프로젝트에는 원래 앱 패키지에 정의된 ID가 없습니다. 그러니 ID 참조가 원래 패키지를 가리키도록 수정해 주어야 정상적으로 리소스 오버레이 프로젝트의 컴파일이 가능합니다.
<리소스 분류>/<리소스 ID>
=>@*<패키지명>:<리소스 분류>/<리소스 ID>
e.g.integers/awesome
=>com.lvlz8.lovelinus:integers/awesome
이제 레이아웃 파일에 원하는 수정 사항을 적용하세요 e.g. 뷰 요소 자리 바꾸기, (TextView 등 안드로이드 기본) 뷰 추가하기, ...
위험도: 높음 ❗
잘못된, 없는 ID 참조 시 예외로 앱이 강제종료됩니다. 시스템UI라면 상황은 더 심각합니다. 삼성 기기는 안전 모드로 재부팅하면 리소스 오버레이가 해제되는 듯 한데, LG 기기는 그렇지도 않아서 어려움이 있습니다.
aapt 툴 통해 프로젝트를 APK 파일로 생성, 서명 후 기기에 잘 설치
수정할 리소스 준비를 모두 마쳤다면, 프로젝트 폴더에서 명령줄 창을 띄우고 aapt
도구로 APK 컴파일이 가능합니다. aapt
는 안드로이드 SDK에 들어있는 패키징 도구입니다.
아래 명령은 Pie OS 기기를 (API 28) 목표로 하고, 시스템 요소 중 SystemUI.apk
파일을 대상으로 준비해 본 명령입니다.
aapt package -f -M AndroidManifest.xml --min-sdk-version 26 -S res -I <android-28.jar> -I <SystemUI.apk> -I <framework-res.apk> -I <제조사 리소스 경로> -F <APK 출력 경로>
- 최소 SDK 버전을 26으로 두었는데요, 최소 버전이 낮으면 예전 권한 시스템이 필요한 것으로 잘못 인식해 불필요한 권한이 부여됩니다.
-M
,-S
플래그로 각각 매니페스트 파일, 리소스 폴더를 지정했습니다.-I
플래그를 연속으로 나열하여 안드로이드 API 파일 (SDK에서 떼어왔습니다), 수정 대상 앱 (SystemUI.apk
), 그리고 안드로이드·제조사 프레임워크 리소스 파일을 지정했습니다. 이렇게 하면 컴파일 중 필요한 리소스를 모두 정상적으로 참조할 수 있습니다.-F
플래그로 APK 출력 경로를 적었습니다.- 뭔가 덜 한 것 같기는 하지만 여러분이 완성시켜주세요.
컴파일된 APK 파일을 테스트 인증서 또는 여러분의 인증서로 서명하면 준비 끝.
준비된 리소스 오버레이 파일을 모아... 아래와 같이 설치해볼 수 있겠네요.
- 오레오 OS라면 그냥 설치?
- Substratum 같은 리소스 오버레이 매니저를 쓰시거나
- 루팅해서 설치하거나...
- LG, 삼성 기기면 직접 테마로 만들든 툴을 쓰든 해서
...여기까지 해서 비록 Pie 버전에서는 설치가 막혔지만, 시스템 리소스 또는 사용자 앱 리소스를 수정해볼 수 있는 안드로이드 OS 내장 도구인 리소스 오버레이를 알아봤습니다.
읽으시느라 고생하셨습니다!
'팁' 카테고리의 다른 글
LG폰 사용자 폰트 패키지: 리디바탕, Neo둥근모 (6) | 2020.04.16 |
---|---|
샤오미 70mai Pro 한국어 안내 음성 with 네이버 클로바 보이스 #2 (14) | 2020.03.22 |
안드로이드 리소스 오버레이 만들기 (3) (0) | 2020.01.10 |
샤오미 70mai Pro 한국어 안내 음성 with 네이버 클로바 보이스 (10) | 2019.12.29 |
안드로이드 리소스 오버레이 만들기 (2) (0) | 2019.11.12 |