리소스 오버레이 프로젝트 폴더 준비: 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 휴대폰 오레오/파이 OS에서 상태바 통신사 문구 및 VoLTE 로고 숨기기를 위해 찾아본 리소스 목록을 예시로 들어 보겠습니다.

굿락으로 챙겨주는 갤럭시 부럽다..

무슨 파일을 덮어써야 할까...

상태바 리소스이니 다음 파일을 찾아봅시다.

  • SystemUI.apk를 먼저 찾아보고,
  • 공통 리소스를 담는 framework-res.apk
  • 그리고 제조사 공통 리소소를 담는 lge-res.apk (삼성 폰도 비슷한 거 있음) 파일을 열심히 뒤져봐야겠습니다.

SystemUI.apk에 있는 상태바 관련 레이아웃 파일이나 소스코드를 참고해서 관련 리소스 이름을 알아내는 것도 좋습니다.

문구 표출 형태, 그리고 관련 리소스 찾기

리소스 디렉토리 구조 및 이름 짓는 법을 알고 계시면 편합니다. 이 부분은 공식 문서 포함해서 좋은 글 많으니 직접 찾아보시고요, 여기서는 실제 예시를 들어보겠습니다.

❌ 레이아웃(layout) 등 다른 ID를 참조하는 코드가 포함된 리소스는 수정하기 어렵습니다. 자세한 내용은 나중에..

  • 🧀 아이콘: KT, LGU+, 그리고 VoLTE 로고
    그림 형태이니까, 1px * 1px 크기 투명한 PNG 파일로 바꿔치기하면 되겠습니다.

수정 대상은 drawable 리소스 자체일 수 있고, drawable 리소스는 여러 mipmap 요소를 상황에 따라 사용하도록 하는 XML 파일이며 실제 이미지는 mipmap일 수 있습니다. 후자의 경우는 실제 그림 리소스인 mipmap을 고치는 게 좋겠습니다.

SystemUI.apk에만 있으면 좋았을텐데, lge-res.apk에도 VoLTE 로고를 포함해서 몇 개 있었습니다. 싹다 바꿔주면 되겠고요.
DPI 별로 베리에이션이 있으니 (xhdpi, xxhdpi, xxxhdpi 등) 모든 베리에이션에 대해 역시 싹다 바꿔줍니다.

  • 🅰 문구: SKT
    그냥 T로고가 예쁜데..

이 경우는 문구에 해당하는 폰트 크기를 0으로 만드는 방법이 먹혔습니다. 아래와 같은 방법으로 수정 대상 값을 찾을 수 있는데요.

  • res/values/dimens.xml 파일의 dimen(sion) 값 중 적절해보이는 이름을 찾을 수 있고, (머리가 귀찮으면 몸이 고생)
  • 상태바 관련 레이아웃에서 통신사 문구를 나타내는 요소를 찾아 확인할 수 있습니다.
    • 폰트 크기 속성이 직접 지정되어 있으면 그 값을 봅니다.
      res/layout/status_bar.xml:
      <TextView ... android:textSize="@dimen/operator_text_font_size" />
      <TextView ... android:textSize="12sp" /> <!-- 단, 이렇게 값이 직접 씌어있다면 수정하기 난감합니다. -->
    • (폰트 크기 속성을 포함하는) 스타일을 지정한 경우, res/values/styles.xml을 확인해야 합니다.
      <!-- res/layout/status_bar.xml: -->
      <TextView ... android:textAppearance="@style/TextAppearance.StatusBar.Clock" />
      <!-- res/values/styles.xml: -->
      <style android:name="TextAppearance.StatusBar.Clock">
      ...
      <item name="android:textSize">10sp</item>  <!-- 값으로 직접 지정되어 있으면 styles.xml을 고치면 되고 -->
      <item name="android:textSize">@dimen/clock_text_font_size</item> <!-- 또다른 값을 참조하면 해당 값을 고쳐줍니다 -->
      ...
      </style>
      • 레이아웃 대신 소스코드에서 뷰 요소의 폰트 크기를 지정할 수도 있겠죠. 이 경우는 잘... 확인하시면 되겠습니다.

다행히 폰트 크기가 레이아웃에 하드코딩되어있지 않으며 dimen 값을 참조하게 되어 있었고, 해당하는 값은 다른 상태바 요소와 공유되지 않는 별도 값이었습니다. (통신사 문구 폰트 크기를 0으로 만들었더니 시계 문구도 안 보이면 난감하니까요.)

 

샤오미(산하 브랜드?)에서 만든 블랙박스 70mai Pro는 저렴한 가격에 고화질 영상을 자랑하는 가성비 블랙박스입니다. 국내 제품에서는 고가 제품에만 들어가는 고급 이미지 센서를(소니 IMX335) 7만원짜리 저가형 제품에서 누릴 수 있는 것이 큰 장점입니다.

70mai pro

(이미지 출처: 다나와 상품정보)

러시아산 커스텀 펌웨어: 시스템 파일, 즉 안내 음성 파일 수정 가능

여기에 러시아 형누님들의 SSH 지원 커스텀 펌웨어를 설치하면, 보안성이 조금 더 떨어지는 대신 (러시아 형누님들이 무슨 일을 했을 지..), SSH 연결을 통해 시스템 파일 접근 및 수정이 가능합니다. 그러면.. 안내 음성 파일 교체도 할 수 있죠!

4pda 포럼 70mai Pro 게시글에 가시면 최신 커스텀 펌웨어를 찾을 수 있습니다.

네이버 클로바: 매우 자연스러운 음성 합성 서비스

클로바 보이스 체험 페이지에 가시면 딥러닝 기술로 만든 음성 합성 기능을 체험해 볼 수 있습니다. 무려 개인 콘텐츠 제작 목적에 한하여 무료 사용이 가능하다고 하네요!

그렇다면?

네이버 클로바로 만든 70mai Pro 한국어 안내 음성

  • 위 포럼 링크에서 러시아 형누님들이 준비한 음성 파일 및 대본 엑셀 파일을 받았습니다.
  • 열심히 번역하고, 네이버 클로바 음성합성 데모 페이지에서 손수 하나하나 음성 WAV 파일을 받았습니다. 스크립트 만들면 편했겠지만, 몇 개 없으니..
  • 적절한 형식의 AAC 파일이 필요하므로 음악 파일 변환기로 WAV를 AAC로 바꿔줍니다.

70mai_NaverAraVoice.zip
2.90MB

해서 한국어 안내 음성 파일을 준비했습니다. 이제 기기의 음성 파일을 교체하기 위해 역시 러시아 포럼의 가이드 글을 따랐습니다:

  • SSH 연결을 지원하는 커스텀 펌웨어를 설치한 블랙박스 기기를 준비합니다.
    • 저는 v1.0.6na 버전을 설치했는데, 지금 보니 1.0.7 버전이 공개되어 있네요.
  • 기기와 안드로이드 폰을 와이파이로 연결한 뒤 (70mai 앱 통해 연결), "AndFTP" 앱으로 기기에 SCP 접속했습니다.
    • SFTP가 아니라 SCP라 위 가이드에 있던 AndFTP 외에 마땅한 앱을 모르겠더라고요.
    • 러시아산 SSH 펌웨어 기본 계정은 "root", 비밀번호는 없음.
  • 루트 디렉토리로 올라가서 "voiceplay" 디렉토리가 있습니다. "liteos" 디렉토리, 그리고 "voiceplay" 디렉토리로 들어가세요. 상황별 디렉토리(adas, record, storage, system) 밑에 음성 파일들이 있습니다. 요걸 한국어 음성 파일로 교체하면 끝!

문제점
버전 차이인지 다른 음성 디렉토리가 또 있는지, 대본 파일에 있던 일부 음성 항목은 1.0.6버전 기기에 없었습니다. 총 17개 항목이 없었는데, "음성 녹음" 상태 안내 빼고는 펌웨어 업데이트 등 주요 기능에는 무관한 종류라 뭐 일단은 괜찮은 것 같습니다.

변환 설정

  • Pazera Free Audio Extractor
  • AAC, 48000Hz 샘플레이트, 모노 채널, CBR 비트레이트, AAC-LC 프로필, 그리고 64kbps 비트레이트

 

 

  1. 2020.01.02 15:41

    비밀댓글입니다

    • Favicon of https://blog.limerainne.win limerainne 2020.01.03 14:20 신고

      제가 착각을 했네요. "/liteos/voiceplay" 경로이군요. 아래 링크한 가이드를 참고하세요. (구글 번역기 같은 것 쓰십시오.)

      https://4pda.ru/forum/index.php?s=&showtopic=916938&view=findpost&p=81805148

1단계: 수정 대상 앱 또는 시스템 프레임워크 확보

특정 앱을 수정하고 싶다면,

  • 앱 파일 획득

    • 기기에서 직접 추출
      요즘 파일 탐색기에 다들 앱 추출 기능이 있죠. 아니면 Send Anywhere 앱도 있고요.

    • APK 공유 사이트 이용
      저는 APKMirrorAPKPure를 이용하는데요, APKPure 사이트는 왜인지 모르게 중국 풍이 느껴지기는 하지만 한국 개발사 포함해서 각종 앱이 다 있습니다. 혹 변조되었을지 두려운 마음 조금 있지만, 디지털 서명을 믿을 수밖에요. (서명 v1은 뚫릴 수 있다던데... 설마...)

한편 휴대폰 UI를 바꾸고 싶다면,

  • 시스템 프레임워크 파일 획득: 보통 아래 파일을 획득하면 되는 것 같습니다.
    • /system/framework/framework-res.apk : 안드로이드 OS 공통
    • /system/priv-apps/SystemUI.apk : 상태바, 내비게이션 버튼 등 시스템 요소 그리는 애
    • 또한 /system/framework 디렉토리에 제조사별 커스텀 리소스도 있으니 함께 확보해야 합니다.

그 외에 프레임워크 소스 파일, Settings.apk도 확보하셔서 소스를 들여다보면 이 리소스가 어디에 쓰이는지 아는 데 도움이 됩니다. 문제는 안드로이드 OS 5.0부터 ART를 도입하고, 그 후로 갖가지 최적화가 적용되면서 소스 파일이 점점 숨어들어갔습니다. 디컴파일해서 소스 들여다보기가 쉽지는 않습니다.

2단계: 역컴파일 툴 통해 코드 및 리소스 분석

최근 저는 JADX 즐겨 쓰고 있습니다. 별다른 복잡한 조작 없이 달빅 바이트코드를 자바 코드로 바꿔 보여주고, 전체 코드 검색 가능한 점이 좋습니다. 리소스 대상으로는 키워드 검색 안 되는 점은 아쉬워요.

JADX 개발자님들께 이 자리를 빌어 감사드립니다. 물론 의미없죠..
JADX 프로젝트 홈페이지

팁은... 잘 모르겠고... 감으로 때려맞추고 이래저래 하다보면 답이 나옵니다...

한편, 시스템 프레임워크를 수정한다면 제조사 또는 서드파티 테마 파일을 열어보는 것도 좋습니다. 어디를 건드려야 할 지 가이드가 되거든요.

 

(3)편에서 계속...

RRO 또는 runtime resource overlay

개념

안드로이드 앱 패키지의 주요 구성 요소는 코드, 리소스라 할 수 있습니다. 이 중 리소스에는 색상, 문자열 같은 단순 값부터, 그림 (drawable), 그리고 (XML) 레이아웃 등이 들어있는데요.

(런타임) 리소스 오버레이는 앱 패키지를 불러올 때, 원래 앱의 리소스를 사용자가 설치한 오버레이 패키지의 리소스로 덮어씌워주는 도구입니다.

소니 모바일 팀에서 개발했고 6.0 - 7.0 시절에 AOSP에 기부했다고 하고요, 8.0부터 본격적으로 도입이 된 것 같아요. 삼성, LG를 포함해서 많은 제조사들이 이 리소스 오버레이 기능을 바탕으로, 휴대폰 테마 기능을 개발하여 적용했습니다. substratum 테마 앱도 리소스 오버레이를 기반으로 작동하죠.

한계

  • 소스 코드를 고칠 수 없습니다. 당연하죠.
  • 새 버전이 나올 때마다 변경 사항이 있는지 보고 반영해야 합니다. 못할 짓이죠.
  • 앱 오류, 또는 시스템 전체에 오류를 일으킬 수 있습니다
    • 단순한 값 변경도 경우에 따라 코드에서 부작용을 일으킬 수 있습니다
    • 레이아웃처럼, 코드에서 리소스 내부 구성요소에 (예. 레이아웃 내 뷰) ID로 접근한다던지 하면, 없어진 요소를 프로그램에서 찾지 못하고 NullPointerException 예외를 일으킬 수 있는 등 예기치 못할 위험이 있습니다

안드로이드 9.0 파이 제한 사항 및 우회 방안

다만 안드로이드 9.0부터는 구글이 보안 개선을 이유로 제조사 서명이 되지 않은 리소스 오버레이는 설치할 수 없도록 제한했습니다. 보안 위협 시나리오가 어떤 것이 있을지..., 소설을 써 보겠습니다만 실현 가능성이 없어 보이네요.

  • 사악한 DLC 앱: 스토어에는 검수하기에 멀쩡해 보이는 앱을 게시하고, 사용자를 속여 리소스 오버레이가 설치되면 오버레이에 정의된 플래그 값을 읽어서 숨겨진 사악한 기능이 활성화되는 앱. 구글 검수를 퍽이나 통과할 수 있겠죠?
  • 앱 기능 망치기: 특정 상수값을 고쳐서 앱 동작을 방해한 뒤, 기밀 정보를 빼돌리기. 참 쉽겠죠?

삼성 기기의 경우 S9/노트9 빼고는 설치 제한이 걸린 것으로 보입니다. 만, 플레이스토어에 파이 OS용 리소스 오버레이 기반 테마 제작 앱이 있습니다. 대단합니다. *Synergy
LG 기기는 사용자 테마를 만들고 그 안에 직접 만든 리소스 오버레이를 넣어둘 수 있습니다. 안 막히기를 바랍니다.

제작 절차

  • 수정하려는 앱 및 시스템 프레임워크 파일을 획득
  • 역컴파일 툴 (JADX 추천) 통해 코드 및 리소스 분석
  • 리소스 오버레이 프로젝트 폴더 준비: AndroidManifest.xml 파일, res 폴더
  • 수정할 리소스 만들어 넣기
  • aapt 툴 통해 프로젝트를 APK 파일로 생성, 서명 후 기기에 설치

 

(2)편에서 계속...

국내 스마트폰은 플레이스토어, 제조사 스토어에서 원하는 폰트를 유·무료로 구입해서 쓸 수 있습니다.

아이폰에는 탈옥 않으면 절대 바랄 수 없고, 외산폰은 루트 권한 있어야 하는 것 같은데...

그런데 스토어에 없는 (수정도 허용되는 라이선스 또는 개인 소장) 폰트를 쓰고 싶으면.. 폰트 패키지를 직접 만들어 써야겠죠. 국내 두 제조사는 각기 다른 패키지 형식을 쓰는데요.

"플립폰트"를 쓰는 듯한 (아직 그대로죠?) 삼성폰은 방법이 여러가지 마련되어 있죠.
예를 들어 파이 OS 즈음부터 (S9/노트9 빼고) 사용자 폰트 추가가 차단된 듯 하나, 테마 무료체험 기능을 오용하는 꼼수가 마련되어 있습니다. https://tali.tistory.com/378
역시 사용자 많고 봐야 합니다. 저도 끼워주세요... 곧 아이폰11 나오니 기대하겠습니다.. 지금도 잘 팔리니 그런 일은 없을 것..
지금은 없는... 팬텍도 플립폰트였네요.

 

그럼 LG는...? "HY폰트"라는데 한양에서 만든 폰트 시스템인가봐요.
문제는 이 집은 해독하기 어려운 폰트 패키지 형식을 쓰는 바람에 사용자가 비공식 폰트 패키지를 만들기가 쉽지 않습니다. 조금 더 자세히는 패키지 내의 "/asset/font.dat" 바이너리 파일이 도대체 무슨 형식인지 알 수가 없습니다.

HY폰트 형식이 나온지가 매우 오래되었기 때문에 비공식 패키지 제작법이 나올만 한데, 저는 아직까지는 찾지 못했습니다. 미국, 아니면 베트남 커뮤니티에서 뚫어줄 만 한데, 굳이 고생할 유인이 없는 듯 합니다. 폰트 판매자 입장에서는 다행이지요.

 

방법이 완전히 없는 건 아니라고 합니다. 다른 폰트 패키지를 하나 받아서, 패키지 내의 폰트 파일을 원하는 폰트로 바꿔치기하는 방식이 있다고 하네요. "font.dat"를 수정하지 않겠다는 의도가 되겠습니다. 이미 수 년 된 방법입니다.

폰트 파일만 교체
폰트 수정 (FontCreator 사용) + 파일 교체

  1. 쓰지는 않을 폰트 패키지를 하나 다운로드하거나 구입하고, PC로 추출해 둡니다.
  2. 패키지를 반디집 같은 압축 프로그램으로 열어서, 폰트 이름, 폰트 파일 이름을 확인합니다.
  3. (필수 아님?) 사용하려는 폰트를 FontForge(무료!) 같은 프로그램으로 열어서 폰트 이름을 패키지의 것으로 바꿉니다.
  4. 사용하려는 폰트 파일 이름을 패키지의 폰트 파일 이름으로 바꾼 뒤, 패키지에 넣어줍시다.
  5. 패키지를 다시 서명한 후, 기기에 설치하고 적용합시다. 기기에서 폰트 이름은 패키지의 것으로 표시되겠습니다.

...뭔가 자괴감 드는 방법이죠.. 그냥 스토어에 있는 폰트 씁시다.

참고: Enable Windows 10 Fluent Design Acrylic Effects in VirtualBox

Windows 10 1903 (19년 5월 업데이트) 즈음부터 'Fluent Design', 특히 아크릴 느낌 배경 효과가 본격 적용되고 있습니다.

그러나 PC 성능이 부족하다던지 하면 알아서 효과가 해제되는데요, 설정 앱에서 "투명 효과"를 아무리 껐다켰다 해도 소용이 없습니다.

위 링크를 보시면 가상PC인 경우 안 되는 모양이고요, 저 같은 경우에는 사용중인 PC가 저성능 PC로 인식이 되었습니다.

이 경우 위의 링크를 참조해서 레지스트리 편집 하나 해 주면 고급 꾸밈 효과를 강제로 동작시킬 수 있다고 합니다.

  • 레지스트리 편집기를 열고
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Dwm까지 찾아 들어가서
  • 새 32-bit DWORD 값을 만들고, 이름은 ForceEffectMode로, 값은 2로 지어주세요. (왜 2일까...)
  • PC를 재부팅하면 끝!

한편, 창이 비활성화될 때 아크릴 효과가 꺼지고 단색 배경으로 대체되는 건 원래 그렇게 설계된 거랍니다. 안 쓰는 창에도 아크릴 배경을 그리는 불필요한 연산을 줄이기 위해서래요. 고성능 PC에서는 다 돌려도 괜찮은데 말이죠.

레딧에 항상 아크릴 배경을 그리게 만든 분이 계시네요. 링크

TL; DR

일단 솔직히 원인을 잘 모릅니다. 다른 블로그 찾아보세요 :( ....

요기가 좋아 보이네요: https://www.tabida.pe.kr/58   
특히 검색 인덱싱 속도를 높이기 위해 "그룹 정책"에 들어가서 "PC를 사용 중이더라도 최고 속도 인덱싱" 옵션을 켜는 것이 인상적입니다. 저는 아직 못 써봤지만...

저의 경우는 PC 포맷 후 수많은 메일이 들어있는 메일 계정 로그인을 해 뒀을 때, 인덱싱이 매우 오래 걸릴 (이건 메일이 많으면 어쩔 수 없다네요.) 뿐더러 인덱싱 중인데 메일 검색을 시도했을 때 검색 결과로 최근 메일 일부만 뜨는 문제였습니다.

<Outlook 옵션 - 검색>에서 "가능한 경우 쿼리 입력시 결과 표시" 옵션꺼서, 인덱싱 결과를 쓰지 않고 검색하도록 하여(?) 문제를 우회했습니다.

아직 인덱싱 진행 중이라는 오류 메시지가 안 떴는데, 앞선 글처럼 비정상적인(?) 방법으로 계정 추가를 해서 그럴지 모르겠네요.

 

겪은 문제 증상

"인덱싱이 안 되었다"고 오류 메시지가 뜨지는 않으나, 결과 몇 개만 나오고 전체 결과는 안 나오는 상태였습니다. 인덱싱이 잘 안 되고 있는 상태였는데요.

  • 인덱싱 상태를 보면 수만 건 메일 항목이 인덱싱을 기다리고 있다고 나타났습니다. 어림짐작이지만 10초당 100건씩 줄어드는 것 같았어요.
* 인덱싱 상태 보기

아웃룩 프로그램에서 검색란을 클릭하면, 위의 리본 메뉴에 [검색] 탭이 생깁니다.
클릭한 뒤 [검색 도구] > [인덱싱 상태]를 차례로 누르면 현재 인덱싱 프로그램이 뭘 하고 있는지 나옵니다.

알아서 새로고침되지 않으니, 인덱싱이 되어서 갯수가 줄긴 하는지 보려면 조금 있다가 직접 인덱싱 상태 창을 다시 열어주어어 합니다...

[인덱싱 상태] 메뉴 위치
지금은 인덱싱이 끝났지만...

해결 아니고 우회 방법

파일 - 옵션 - 검색으로 들어가서 "가능한 경우 쿼리 입력시 결과 표시" 옵션껐습니다. 인덱싱 결과를 쓰지 않고 검색하도록 하는 것 같은데요, 요렇게 하니까 검색이 되기는 되더라구요.

다만 인덱싱 결과를 안 쓰니 검색 속도가 느려진다고는 하는데... 일단 검색 되는게 우선이죠.

 

실패한 도전

  • 메일함 파일 깨져서 색인이 안 되나 해서 MS오피스 프로그램 폴더에 있는 "ScanPST.exe" 프로그램을 돌려봤습니다. 항목 몇 개가 손상되었고 고쳤다고 했지만, 인덱싱 속도 개선에는 별 소용이 없더군요. 아니... 방금 로그인했는데 손상된 항목이 있다고요???

    "ScanPST.exe"는 "C:\Program Files\Microsoft Office\root\Office16\"에 있었습니다.
    64비트 OS, 32비트 오피스이면 "Program Files" 폴더 대신 "Program Files (x86)" 폴더에서 찾아주세요.
  • 아웃룩 검색 옵션에서 "표시되는 결과 수를 제한하여 검색 속도 높이기" 옵션을 먼저 꺼 봤지만 소용이 없었습니다.

 

 

 

가지 않은 길

  • 정 인덱싱이 안 되면 "인덱스 재생성", 또는 아예 윈도 인덱싱 서비스를 포기하라고도 하더군요. 아무리 그래도 그건...
  • 방금 찾아보니 PC 사용 중일 때 인덱싱 속도를 늦추지 않도록 하는 옵션이 있다고 하네요..

 

IMAP/SMTP 로그인할 때 메일 계정 전체 말고 메일 아이디만 써야 하는데,

2019 로그인 화면에서는 "로그인 아이디" 입력란이 없어졌어요 :(

Outlook 2019 로그인 화면 중 IMAP 상세 설정 화면... 로그인 계정 입력란 어디?

대신 이렇게 해 보세요.

# 아예 레지스트리 설정값을 고쳐서 예전 설정 창으로 되돌리는 방법이 있다고 합니다:

https://answers.microsoft.com/ko-kr/msoffice/forum/msoffice_outlook-mso_other-mso_2016/%ec%95%84%ec%9b%83%eb%a3%a9-2016/50a8a449-982b-42ad-814b-87b53d866bcb
https://support.microsoft.com/en-us/help/3189194/how-to-disable-simplified-account-creation-in-outlook

레지스트리 편집기에서 (시작 - 실행 - regedit),
* HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Setup\ 경로로 찾아 들어가서,
* (트리 오른쪽 빈 창에) 오른쪽 클릭 - [새로 만들기 - DWORD(32비트) 값] 클릭하고
* 항목 이름은 "DisableOffice365SimplifiedAccountCreation"으로, 1로 설정!

편집기를 끄고 Outlook을 다시 실행하면 예전 창으로 계정 생성이 가능하다고 하네요. 정말 됩니다.
  • 제어판 (윈도 10 설정 말고) > 사용자 계정 > Mail 로 들어가서

 

 

  • [전자 메일 계정] 버튼을 눌러 아웃룩 계정 설정 창을 띄우고

  • [전자 메일] 탭에서 [새로 만들기...] 버튼을 누르고 계정을 추가하세요.

예전 아웃룩 2016까지 쓰던 창이 나타나고요. IMAP 계정 상세 설정 창까지 가면 "로그인 계정" 입력란이 있습니다.

 

Outlook 2016까지 보던 상세 설정창이 반겨줍니다. 로그인 계정 입력란도 있네요!

 

 

아웃룩 프로그램 실행 중에, 위 방법으로 새 계정을 추가했는데 새 계정에서 메일 발송이 안 되면

아웃룩 프로그램을 껐다 켜 보세요.

아웃룩 프로그램이 떠 있는 상태에서 위 방법으로 새 계정을 추가했다면, 동기화할 폴더 목록에 새 계정의 폴더가 들어있지 않을 수 있습니다. 이 경우 [보내기/받기]를 백날 눌러봐야 소용이 없습니다.

 

이런 글 있는 줄 알았으면 삽질 덜 했지...

알아두면 쓸데없는 배경 설명

Let's Encrypt (이하 LE)웹서버를 위한 무료 SSL 인증서 서비스입니다. 무료니까 3개월마다 갱신해야 하고 (자동 갱신 툴 이용하면 괜찮...) 사고 났을 때 어떤 보상도 못 받지만, 무료니까...

그런데 지난 2018년 초에 서버 인증 방식 중 하나인 TLS-SNI-01 방식이 보안 취약점으로 인해 폐기 수순에 돌입했고, 2019년 2월 부로 LE 서비스에서도 완전히 지원 중단되었습니다.

문제는 TLS-SNI-01 방식이 당시 HTTPS 포트만으로 인증이 가능한 유일한 방식이었다는 점입니다. 만약 HTTPS 포트만 열려있고, 1. DNS 서버를 건드릴 수 없는데다, 2. HTTP(80번) 포트도 열 수 없는 상황이라면 답이 없죠.

그 대신 TLS-ALPN-01이라는 HTTPS 포트만으로 인증받는 새 표준이 작년 하반기에 준비되고, 각종 자동 인증 도구 및 LE에서 지원을 시작한 모양입니다. 문제는 가장 널리 쓰이는 Certbot 도구는 아직 지원을 안 한다는 것...

대신 Dehydrated 및 Nginx 최신 버전을 이용해 TLS-ALPN-01 방식으로 인증서를 받아와 보겠습니다.

목표는,

  • Certbot에서 Dehydrated로 인증 도구 갈아타기
  • 무중단 인증서 갱신을 위해, Nginx의 load balancer 이용하기로 함 (Dehydrated의 TLS-ALPN-01 + Nginx 설명 따름)

Nginx 설정 변경

  1. Nginx 공식 저장소의 mainline 버전으로 갈아타기

우분투 18.04 저장소의 nginx는 지원을 안 하는 것 같아서...

  • 공식 저장소 추가
  • 저장소 인증키 추가
  • 설치!
  • 프록시 설정

nginx.conf 하단에 한 줄 붙이고,

include /etc/nginx/tls_alpn_proxy.conf;

tls_alpn_proxy.conf 파일을 만들고 내용으로 아래와 같이...

stream {
  map $ssl_preread_alpn_protocols $tls_port {
    ~\bacme-tls/1\b 127.0.0.1:10443;
    default 127.0.0.1:4433;
  }

  server {
    listen 443;
    listen [::]:443;

    proxy_pass $tls_port;
    ssl_preread on;
  }
}

(TODO 왜 127.0.0.1 붙여야 하지...)

  1. 원래 서버 설정 고치기

원래 443 포트로 서빙하던 것을 4433 포트로 고쳐두고

  1. 설정 파일 문법 검사 후 적용

nginx -t
systemctl reload nginx

Dehydrated 설치 및 설정

  1. Dehydrated 설치

사실 그냥 셸스크립트라 설치라고 할 것이 없고...

GitHub 저장소 clone!

그리고 저장소의 tls-alpn-01 지원 글 참고해서 응답기 역할하는 Python 스크립트도 준비!

  1. 설정 폴더 및 파일 생성

$ mkdir /etc/dehydrated
$ cp <path/to/tool>/docs/example/config /etc/dehydrated/config

복사한 설정 파일을 열어서

CA -- 일단 테스트용 staging 서버로 변경
CHALLENGETYPE -- tls-alpn-01로 설정

/etc/dehydrated/domains.txt 파일 만들고 그 안에 서버 도메인 주소 입력!

  1. Nginx 설정...은 아까 했고...

  2. 잘 돌아가는지 테스트!

등록키 받아오고

$ <path/to/tool>/dehydrated --register --accept-terms

응답기 역할을 할 Python 스크립트 실행시켜두고

$ python3 <path/to/responder>

인증서 생성!(-c 또는 --cron 하면 알아서 생성/관리 작업 수행)

$ <path/to/tool>/dehydrated -c

  1. 실제 인증서 받아오기

설정 파일을 다시 열어서 staging 서버에서 실제 서버 주소로 되돌려놓고,

$ <path/to/tool>/dehydrated --register --accept-terms
$ <path/to/tool>/dehydrated -c

한 번 더 해주면 /etc/dehydrated/certs/<domain>/에 인증서가 똭!

아까 띄워둔 Python 응답기는 이제 꺼도 되겠죠.

  1. Nginx 설정 고쳐서 새 인증서 쓰도록 변경

Certbot과 파일 이름은 같고, 경로가 /etc/letsencrypt/live/<site>/에서 /etc/dehydrated/certs/<site>/로 바뀌었습니다.

$ nginx -t
$ systemctl reload nginx

하면 마무리됩니다.

Cron 작업에 추가하기

아래와 같은 스크립트를 만드세요.

#!/bin/bash

python3 <path/to/responder> &
PID_RESP=$!

<path/to/tool>/dehydrated -c -k <path/to/hook> | logger -t dehydrated

kill $PID_RESP
  • 위 스크립트에서 | logger -t dehydrated는 데비안/우분투 기준으로 시스템 로그에 메시지 남기려고 두었고, /etc/rsyslog.d/etc/logrotate.d/ 안의 파일을 수정해서 syslog 대신 별도 로그 파일에 기록되게 만들 수 있겠습니다.

위에 "hook" 이야기가 있는데, 인증서 갱신될 때 Nginx가 설정을 (=인증서를) 다시 가져오게 (reload) 해야 합니다.
그러니 아래와 같은 hook 스크립트를 만드세요. 공식 샘플 참고.

#!/usr/bin/env bash

deploy_cert() {
    local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"

    echo "* Hook: reloading Nginx settings..."
    systemctl reload nginx
}

HANDLER="$1"; shift
if [[ "${HANDLER}" =~ ^(deploy_cert)$ ]]; then
  "$HANDLER" "$@"
fi

(사실 hook 스크립트에 startup_hook, exit_hook 이용해서 응답기 켜고 끄면 되긴 하겠네요...)

마지막으로 Certbot에 대해 했듯이 Cron 작업으로 만들면 되겠습니다.

$ crontab -e

0 4 * * 1 <path/to/cron_script> >/dev/null

끝!

곧 Certbot이 지원하게 되면 다 헛짓거리 되겠지만, 어쨌든 끝!

Apache는 다른 멋진 방법으로 잘 하실 수 있겠죠.

+ Recent posts