<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>caTea 블로그</title>
    <link>https://changhee.tistory.com/</link>
    <description>개발자..</description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 10:17:35 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ZaRas</managingEditor>
    <item>
      <title>V8 engine xcode build and embed</title>
      <link>https://changhee.tistory.com/66</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구글 자바스크립트 엔진을 사용하여 이것저것 개발하기위해 개발환경을 만들어보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어로 된 자료가 많이 없어서 내가 만든다.. (V8엔진 사이트가 불친절한것도 있는거같기두..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자가 개발한 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M1 Pro 노트북&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Macos 13.0.1 벤츄라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode 14.2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 개발 관련 구글 툴 받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 v8엔진 소스를 받기 전에 v8엔진 빌드 툴부터 받는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 아래 명령어를 실행한다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&lt;span&gt;git clone &lt;a href=&quot;https://chromium.googlesource.com/chromium/tools/depot_tools.git&quot;&gt;https://chromium.googlesource.com/chromium/tools/depot_tools.git&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 환경변수 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 받고 환경변수로 등록해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.zprofile 파일 수정 후 터미널 재실행&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;PATH=&quot;/Users/ abcdefg123456/workspace/v8engine/depot_tools:${PATH}&quot;&lt;br /&gt;export&amp;nbsp;PATH&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 구글 V8 Engine 소스코드 및 개발환경 받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음 적당한 디렉토리에 V8프로젝트를 받을 폴더 생성 해주고 아래 명령어 실행하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식사이트에서 하라는 명령어들을 모두 해준다 빌드 환경까지 내려받아주는듯 fetch 실행바이너리는 depot_tools에 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 환경변수를 설정해주어야한다 내부적으로 gclient 실행까지 해주는듯하다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;&lt;span&gt;&lt;span&gt;fetch v8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. gm, v8gen 환경변수 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 gm , v8gen 명령어를 수행해야 컴파일 빌드 스크립트를 만들어주는데 경로 찾아가기 귀찬으니까 환경변수로 등록하자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;alias gm=/Users/abcdefg123456/workspace/v8engine/v8/tools/dev/gm.py&lt;br /&gt;alias v8gen=/Users/abcdefg123456/workspace/v8engine/v8/tools/dev/v8gen.py&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 임베디드용 컴파일 빌드 스크립트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 xcode에 맥용으로 엔진을 임베디드하여 사용할꺼기 때문에 아래 명령어로 생성한다 (메뉴얼에 이렇게 있더라..)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&lt;span&gt;v8gen arm64.release.sample&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 컴파일 실행&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&lt;span&gt;ninja -C out.gn/arm64.release.sample v8_monolith&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 라이브러리 생성 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 경로 가보면 .a파일이 3개 생겼을꺼다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;/Users/abcdefg123456/workspace/v8engine/v8/out.gn/arm64.release.sample/obj&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 문제가 발생했다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가져가 사용해보니 에러가 나데?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 문제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 정상적으로 되어서 라이브러리 파일을 프로젝트에 넣고 실행해보니 에러로그가 콘솔에 올라온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v8_enable_pointer_compression 이 플래그를 false로 해주어야 포인터 충돌이 안난다 공식문서에는 ios만 하라고 되어있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Macos에는 모두 넣어줘야한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시빌드했다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/Users/abcdefg123456/workspace/v8engine/v8/out.gn/arm64.release.sample/args.gn 파일을 열어서 수정해준다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;dcheck_always_on&amp;nbsp;=&amp;nbsp;false&lt;br /&gt;is_component_build&amp;nbsp;=&amp;nbsp;false&lt;br /&gt;is_debug&amp;nbsp;=&amp;nbsp;false&lt;br /&gt;target_cpu&amp;nbsp;=&amp;nbsp;&quot;arm64&quot;&lt;br /&gt;use_custom_libcxx&amp;nbsp;=&amp;nbsp;false&lt;br /&gt;v8_enable_i18n_support&amp;nbsp;=&amp;nbsp;false&lt;br /&gt;v8_monolithic&amp;nbsp;=&amp;nbsp;true&lt;br /&gt;v8_use_external_startup_data&amp;nbsp;=&amp;nbsp;false&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;v8_enable_pointer_compression&amp;nbsp;=&amp;nbsp;false&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;is_clang&amp;nbsp;=&amp;nbsp;true&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;target_os&amp;nbsp;=&amp;nbsp;&quot;mac&quot;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 붉은색 소스에서 자꾸 앱 크래시가 난다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Fatal process OOM in Failed to reserve virtual memory for CodeRange&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-17 오후 2.24.24.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MfObM/btr4sUanwYo/hyhX73ni7mh2SZOKunwNRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MfObM/btr4sUanwYo/hyhX73ni7mh2SZOKunwNRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MfObM/btr4sUanwYo/hyhX73ni7mh2SZOKunwNRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMfObM%2Fbtr4sUanwYo%2FhyhX73ni7mh2SZOKunwNRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;870&quot; height=&quot;412&quot; data-filename=&quot;스크린샷 2023-03-17 오후 2.24.24.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 193px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 175px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 175px;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; std&lt;/span&gt;::&lt;span&gt;unique_ptr&lt;/span&gt;&amp;lt;&lt;span&gt;v8&lt;/span&gt;::&lt;span&gt;Platform&lt;/span&gt;&amp;gt; platform = &lt;span&gt;v8&lt;/span&gt;::&lt;span&gt;platform&lt;/span&gt;::&lt;span&gt;NewDefaultPlatform&lt;/span&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;v8&lt;/span&gt;::&lt;span&gt;Platform&lt;/span&gt; *p = platform.&lt;span&gt;get&lt;/span&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;v8&lt;/span&gt;::&lt;span&gt;V8&lt;/span&gt;::&lt;span&gt;InitializePlatform&lt;/span&gt;(platform.&lt;span&gt;get&lt;/span&gt;());&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;v8&lt;/span&gt;::&lt;span&gt;V8&lt;/span&gt;::&lt;span&gt;Initialize&lt;/span&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;v8&lt;/span&gt;::&lt;span&gt;Isolate&lt;/span&gt;::&lt;span&gt;CreateParams&lt;/span&gt; create_params;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;create_params.&lt;span&gt;array_buffer_allocator&lt;/span&gt; = &lt;span&gt;v8&lt;/span&gt;::&lt;span&gt;ArrayBuffer&lt;/span&gt;::&lt;span&gt;Allocator&lt;/span&gt;::&lt;span&gt;NewDefaultAllocator&lt;/span&gt;();&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;v8::Isolate* isolate = v8::Isolate::New(create_params);&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 v8엔진이 시스템 로우 레벨단 메모리 핸들링을하는데 애플이 막아놓은것이였다.. 찾는데 오래걸렸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Disable Executeable Memory Protection 을 체크 하면 정상 동작된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-17 오후 2.18.38.png&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blqN73/btr4hyNGi7J/LREjNoOLdazreGvZugKhJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blqN73/btr4hyNGi7J/LREjNoOLdazreGvZugKhJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blqN73/btr4hyNGi7J/LREjNoOLdazreGvZugKhJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblqN73%2Fbtr4hyNGi7J%2FLREjNoOLdazreGvZugKhJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;952&quot; data-filename=&quot;스크린샷 2023-03-17 오후 2.18.38.png&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 정말 끝이다 v8엔진을 맘껏 핸들링할수있다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갖고 놀아봐야겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-17 오후 2.26.30.png&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;1212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vSgsD/btr4l28ap8b/9vbZPanvj6R5Qi90a06kE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vSgsD/btr4l28ap8b/9vbZPanvj6R5Qi90a06kE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vSgsD/btr4l28ap8b/9vbZPanvj6R5Qi90a06kE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvSgsD%2Fbtr4l28ap8b%2F9vbZPanvj6R5Qi90a06kE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2316&quot; height=&quot;1212&quot; data-filename=&quot;스크린샷 2023-03-17 오후 2.26.30.png&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;1212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>macos | ios</category>
      <category>c++</category>
      <category>embedd</category>
      <category>Google V8 Engine</category>
      <category>JavaScript Engine</category>
      <category>V8</category>
      <category>V8 Engine</category>
      <category>v8 engine xcode build</category>
      <category>Xcode</category>
      <category>자바스크립트</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/66</guid>
      <comments>https://changhee.tistory.com/66#entry66comment</comments>
      <pubDate>Fri, 17 Mar 2023 14:29:04 +0900</pubDate>
    </item>
    <item>
      <title>Android 와 NDK SO File시스템</title>
      <link>https://changhee.tistory.com/65</link>
      <description>&lt;p&gt;먼저 이번에 문제 된 상황을 설명하자면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여러 업체의 라이브러리를 붙이다 보면 SO 파일을 붙이는경우가 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만약 디렉토리 구조가&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;jniLibs&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;armeabi&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;A.so&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;B.so&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;armeabi-v7a&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;B.so&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;x86&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위와 같이 외부 업체 SO 파일들이 위치해 있다고 가정해보자&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;안드로이드 디바이스의 아키텍쳐가 armeabi를 지원한다면&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;armeabi의 디렉토리의 so파일을 로드 할 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만 안드로이드 디바이스의 아키텍쳐가 armeabi-v7a 라면?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;시스템은 armeabi-v7a 를 찾아가 로드할 것이다&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만 위와 같은 상황이라면 A.so파일이 없지않는가?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그러면 에러가 발생하여 앱이 죽을것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;왜냐하면 안드로이드 시스템은 디바이스의 아키텍쳐의 최적화 된 아키텍쳐 파일을 찾아가게 되어있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만약&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;jniLibs&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;armeabi&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;A.so&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;B.so&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;x86&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;armeabi-v7a 디렉토리를 삭제하고 빌드하여 실행하면 아무 문제가 없을 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SO 파일 로드 시 최적화 된 아키텍쳐가 없을 시 하위 아키텍쳐를 찾아서 로드하기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;물론 속도 차이는 있을 수 있지만 동작은 될 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;결론&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 안드로이드 개발 시 SO파일을 붙여 개발 할 경우 원칙 상 모든 아키텍쳐를 받는게 맞다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;jniLibs&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;arm64-v8a&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;A.so&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;B.so&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;armeabi&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;A.so&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;B.so&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;armeabi-v7a&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;A.so&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;B.so&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;x86&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 만약 타 업체에서 armeabi 타겟만 주었을 시 armeabi를 제외한 디렉토리를 지우면 동작은 할 것이다.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;(타업체들도 armeabi 타겟 아키텍쳐 so파일을 주었다는 가정하에)&lt;/p&gt;</description>
      <category>android</category>
      <category>.</category>
      <category>.so</category>
      <category>Android</category>
      <category>Android NDK시스템</category>
      <category>NDK</category>
      <category>SO 파일</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/65</guid>
      <comments>https://changhee.tistory.com/65#entry65comment</comments>
      <pubDate>Tue, 21 Aug 2018 11:22:13 +0900</pubDate>
    </item>
    <item>
      <title>Android NDK SO File 과 관련 파일 다운사이징 방법</title>
      <link>https://changhee.tistory.com/64</link>
      <description>&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;안드로이드 개발 시 외부 업체의 .so 파일 관련하여 조사한 내용입니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;안드로이드 개발 시 SO File(Navtive Source Lib) 사용이 증가함에 따라&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;빌드 시 APK 용량이 커져 줄이는 방안을 모색해 보았습니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font size=&quot;4&quot; class=&quot;&quot;&gt;1. 특정 architecture 타겟을 지정하여 빌드&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&quot;armeabi&quot;, &quot;armeabi-v7a&quot; 두가지의 SO File 들만 가지고 빌드 시 모든 Android 플랫폼에서 동작 가능합니다.(2018-07-19기준)&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;위의 방법을 통해 APK 사이즈를 줄일 수 있습니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;제약조건&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;- 해당 조건으로 빌드 시 반드시 해당 architecture 타겟 폴더에 SO File 이 위치해 있어야 합니다.&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font size=&quot;4&quot; class=&quot;&quot;&gt;2. architecture 별로 APK를 빌드하여 구글 플레이스토어에 등록&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;안드로이드 스튜디오의 Gradle 설정에 architecture 타입별로 APK가 생성되는 기능이 있습니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;이 기능을 통해 하나의 APK에 하나의 architecture SO File을 빌드하여&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;architecture 별로 생성한 후 구글 플레이스토어에 등록 합니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;사용자들은 구글 플레이스토어에서 다운받게 되는데 구글에서 사용자 디바이스에 맞는 APK를 내려주어 다운받게 됩니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;div class=&quot;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;제약조건&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;- 해당 조건으로 빌드 시 반드시 해당 architecture 타겟 폴더에 SO File 이 위치해 있어야 합니다.&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font size=&quot;4&quot; class=&quot;&quot;&gt;3. 소스 단에서 architecture 구별하여 SO File을 내려받아 동적 로딩&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;SO File은 동적 라이브러리로써 소스의 시스템함수 loadLibrary, load API를 통해 로드할수 있습니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;SO File을 서버에서 다운받아 안드로이드 디바이스의 internal Storage에 저장 후 저장 경로를 통해 로드 후 사용 가능합니다.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;br class=&quot;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;제약조건&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;- 소스상에서 디바이스 architecture를 검사하여 해당하는 SO_File을 다운받아야 합니다. (만약 맞지 않을경우 로딩시 런타임 에러 발생)&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;- 해당 클래스는 저희가 제공하는 targetinterface.jar의 클래스 패키지명, 클래스명, 메서드 명이 동일해야 동작합니다.&lt;/font&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; text-size-adjust: auto;&quot;&gt;&lt;font color=&quot;#ff2600&quot; class=&quot;&quot;&gt;- API&amp;nbsp;실행 전 반드시 .so 파일을 로드 해주셔야 합니다.(System.load(path))&lt;/font&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>android</category>
      <category>apk</category>
      <category>apk 다운사이징</category>
      <category>so file</category>
      <category>안드로이드</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/64</guid>
      <comments>https://changhee.tistory.com/64#entry64comment</comments>
      <pubDate>Tue, 21 Aug 2018 11:07:16 +0900</pubDate>
    </item>
    <item>
      <title>jar 압축풀기, 압축하기</title>
      <link>https://changhee.tistory.com/63</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;압축하기&lt;/p&gt;&lt;p&gt;jar cvf jarName.jar ./&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;압축풀기&lt;/p&gt;&lt;p&gt;jar xvf AndroidPlugin.jar&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;c : 새로운 jar 패키지 파일을 생성&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;t : jar 패키지내의 파일 리스트를 출력&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;x : jar 패키지의 압축을 품&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;f : c, t, x 옵션에 대해 사용할 jar 파일 이름을 지정합니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;v : jar 패키징 도구 수행중 수행 관련 메세지를 출력&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;m : mainfest 파일 이름을 지정&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;O : 압축하지 않고 묶기만 함&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;M : mainfest 파일을 생성하지 않음&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;u : jar 패키지의 내용을 업데이트&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;i : 해당 jar 파일과 Class-Path 필드를 통해 참조되는 jar 파일에 대한 정보를 INDEX.LIST 파일로 생성&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; color: rgb(5, 115, 6); font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;-C : 압축할 때 사용할 기준 디렉토리를 지정&lt;/span&gt;&lt;span _foo=&quot;COLOR: rgb(0,0,0)&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;​&lt;/span&gt;&lt;/p&gt;</description>
      <category>util</category>
      <category>jar</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/63</guid>
      <comments>https://changhee.tistory.com/63#entry63comment</comments>
      <pubDate>Mon, 2 Jul 2018 10:53:48 +0900</pubDate>
    </item>
    <item>
      <title>컴퓨터 암호화 정리</title>
      <link>https://changhee.tistory.com/62</link>
      <description>&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;u&gt;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;암호화&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;비대칭키 방식(공개키 방식)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - RSA 알고리즘&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 키교환 알고리즘(대칭키 방식의 비밀키를 암복호화) 및 전자서명(예, 비대칭키 암호화 + 메시지 다이제스트) 등에 사용&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 대칭키 방식의 비밀키의 암호화/복호화,&amp;nbsp;전자서명, 인증 및 부인방지 용도에 사용&lt;/p&gt;&lt;div style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 암호화할 때 공개키를 사용했으면 복호화할 때는 개인키를 사용(그 반대도 가능하나 동일한 키로 암호화/복호화는 수행 불가)&lt;/div&gt;&lt;div style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 공개키로 암호화, 개인키로 복호화&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 공개키 인증 및 암복호화 속도 문제&lt;/div&gt;&lt;div style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- 대칭키 방식에 비해 암호화/복호화 속도가 100배 정도 느리며 키 길이보다 큰 평문 암호화/복호화에 사용 불가&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;대칭키 방식(비밀키 방식)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 스트림 암호화(가변 길이 데이터를 패딩없이 처리, 잘 사용안함)와 블록 암호화(고정된 크기의 블록 단위로 데이터를&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 암호화 + 패딩)로 나뉨&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - DES(64bit 블록 암호화, 56bit 키, 자바는 64bit(8byte) 키 사용), 3DES(=DESede, 64bit 블록 암호화, 112~168bit 키, 자바는&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192bit(24byte) 키 사용)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , AES(128bit 블록 암호화, 128bit(16byte) 키, 미국 표준), AES-256(256bit(32byte) 블록 암호화, 256bit 키)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AES의 국내표준변종 ARIA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , SEED(128bit 블록 암호화, 128bit 키) 알고리즘&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 자바6 이상부터 256bit 지원(&lt;a _foo=&quot;con_link&quot; href=&quot;http://lyb1495.tistory.com/89&quot; target=&quot;_blank&quot; style=&quot;color: rgb(0, 95, 193); text-decoration-line: underline; cursor: pointer; -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1);&quot;&gt;http://lyb1495.tistory.com/89&lt;/a&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - DES, 3DES가 가장 느림&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 비밀키(공개키) 하나로 암호화와 복호화&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 주로 평문을 암호화하는 데 사용&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 비밀키가 외부에 노출되면 암호화는 무용지물&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 비밀키 유출 및 관리 문제로 인하여 인증에는 사용 불가&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600;&quot;&gt;암호화 통신&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 대칭키 방식(비밀키로 평문 암호화/복호화) + 비대칭키 방식(RSA: 비밀키 암호화/복호화 및 전송방식-키 교환 방식-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;패딩(Padding)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 데이터를 특정 크기로 맞추기 위해 특정 크기보다 부족한 부분을 무의미한 문자로 채워넣는 기법&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 암호화시 무조건, 항상, 반드시 수행&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;PKCS#5&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Public Key Crytography Standard&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Password-based Encryption Standard&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 패스워드로 표현할 수 있는 키를 사용하는 암호화 표준&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 현대의 공인인증 방식은 PKCS#5 표준에 따라 개인 패스워드가 근간&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 패스워드란 영문, 숫자, 특수문자를 포함, 키보드 상에서 [input type=&quot;password&quot;] 형식으로 쓸 수 있는 모든 문자를 말함&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1바이트로 표현 가능한 모든 문자, 즉 ASCII 코드로 0 ~ 255(이진수로 00000000 ~ 11111111)에 해당&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 앞 부분의 컨트롤 문자와 뒷부분의 확장 문자 코드를 빼면 32 ~ 126 사이의 문자 코드만 해당&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이걸 이진수로 표현하면 최대 8자리의 숫자로 표현되기 때문에 8진 문자열(Octet string)이라고도 불림&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8진 문자열을 사용하는 것에 대한 표준이 바로 PKCS#5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 평문의 길이가 8바이트(64비트)의 배수를 기준으로 모자라는 수만큼 숫자를 채워 8바이트의 배수로 길이를 맞추는 작업&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - DES, 3DES 암호화 알고리즘에서 사용&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - PBKDF2 : 암호기반 키 파생 함수, 암호에서 비밀키를 파생하기 위한 표준 메커니즘&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;PKCS#7&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 128비트(16바이트) 이상 블록 암호화(AES, AES-256, SEED 등) 알고리즘의 등장으로 인하여 PKCS#5에서 확장된 표준.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 평문의 길이가 16바이트(128비트)의 배수를 기준으로 모자라는 수만큼 숫자를 채워 16바이트의 배수로 길이를 맞추는 작업&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 블록 크기가 128비트일 경우 PKCS#5와 PKCS#7은 서로 호환됨&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;모드(Feedback Modes, 블록 암호화 운영 모드) / IV(초기화 벡터: Initialization Vector)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;ECB 모드&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IV를 사용하지 않고, 즉 XOR 연산없이 각 블록을 암호화만 하는 모드&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;CBC(Cipher-Block Chaining) 모드&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 블록 암호화 운영 모드 중 보안성이 제일 높아 가장 많이 사용&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 최초 평문 1블록과 IV를 XOR 연산한 다음 암호화하고&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다음 평문 1블록은 앞에서 암호화된 결과 블록과 XOR 연산하고 다시 암호화하는 과정을 끝까지 반복하는 방식&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 평문 마지막 블록은 패딩된 블록&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;AES 암호화(일반적인 암호화 개발 순서)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Key 생성(세션 처리?) - 문자열 -&amp;gt; UTF-8 인코딩 -&amp;gt; MD5(128bit)/SHA2-256(256bit) 해싱&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I.V 생성(항상 신규 생성?) - 문자열 -&amp;gt; UTF-8 인코딩 -&amp;gt; MD5(128bit) 해싱&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 암호화 - 평문 -&amp;gt; UTF-8 인코딩 -&amp;gt; PKCS#7 -&amp;gt; 128/256비트 AES(CBC) 암호화 -&amp;gt; Base64 인코딩 -&amp;gt; 암호문&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;PBKDF2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;nbsp;&lt;/span&gt;암호기반 키 파생 함수, 암호에서 비밀키를 파생하기 위한 표준 메커니즘&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 패스워드를 메시지 다이제스트&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 패스워드의 복잡도를 임의로 높여주기 위해 salt라고 표현하는 난수 dummy 값(32바이트 이상) 추가&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 솔트(salt)는 단방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 위 과정을 1000번 이상 반복(iteration)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - ((패스워드 + SALT) + Hashing) * ITERATION -&amp;gt; 키 스트레칭&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 비밀키 = PBKDF2(PRF, Password, Salt, c, DLen)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PRF: 난수(예: HMAC)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Password: 사용자 패스워드&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Salt: 암호학 솔트(사용자마다 다른 32바이트 이상 권장)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c: 원하는 iteration 반복 수(사용자마다 다른 1000 이상 권장)&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DLen: 원하는 비밀키 길이, 단위 bit&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding: 0px; font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;u style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span style=&quot;font-weight: 600;&quot;&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-weight: 600; font-family: AppleSDGothicNeo-Bold; font-size: 16.002px;&quot;&gt;HMAC(무결성 검사)&lt;/span&gt;&lt;br style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Hash 함수를 사용하여 MAC(메시지 인증 코드)를 생성하는 방법&lt;/span&gt;&lt;br style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - 비밀키 + 메시지 다이제스트, 오직 동일한 비밀키를 가진 쪽에서만 전달받은 메시지의 무결성을 검사&lt;/span&gt;&lt;br style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&lt;span style=&quot;font-family: sans-serif; font-size: 16.002px;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - HMAC-MD5(MD5 : 128비트), HMAC-SHA-1(SHA-1 : 160비트)&lt;/span&gt;&lt;/p&gt;</description>
      <category>util</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/62</guid>
      <comments>https://changhee.tistory.com/62#entry62comment</comments>
      <pubDate>Mon, 18 Jun 2018 17:02:21 +0900</pubDate>
    </item>
    <item>
      <title>공인인증서에서 데이터 뽑아내기</title>
      <link>https://changhee.tistory.com/61</link>
      <description>&lt;p&gt;공인인증서 형태를 보았는가&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;공인인증서 경로를 따라 가보면 signCert.der , signPri.key&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2개의 파일이 보일것이다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;공인인증서 선택 화면을 보면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만료일, 범용, 개인, 등등 공인인증서 정보들을 보았을것이다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 정보는 signCert.der file에 담겨져 있는정보인데&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이정보를 뽑아보자&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;방법은 OpenSSL 을 이용해 가져온다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 위의 설명한 두개의 파일을 준비한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;필자는&amp;nbsp; Mac의 터미널 환경에서 작업을 하였다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 명령어를 쳐보자&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 명령어는openSSL 에서 지원하는 x509 알고리즘을 이용해&amp;nbsp;.der 파일을 pem 파일로 변환해주는 역할이다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;왜 변환하냐고?&amp;nbsp; 위의 정보들은.der파일론 읽을수없다&amp;nbsp;.pem파일로 변환하여 뽑아 내는것이다 (내가 이해한 부분)&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;pem 파일의 정의&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;color: rgb(34, 34, 34); font-family: &amp;quot;Nanum Gothic&amp;quot;; font-size: 16px;&quot;&gt;PEM&lt;/b&gt;&lt;span style=&quot;color: rgb(34, 34, 34); font-family: &amp;quot;Nanum Gothic&amp;quot;; font-size: 16px;&quot;&gt;(Privacy-enhanced Electronic Mail) 포맷은 인증기관에서 가장 많이 사용하는 포맷입니다. PEM 인증서는 보통 .pem, .crt, .cer, .key 와 같은 확장자를 가집니다. 이 포맷은 Base64로 인코딩된 ASCII 텍스트 파일이고 &quot;------BEGIN CERTIFICATE----&quot;와 &quot;----END CERTIFICATE----&quot;와 같은 시작과 끝을 알리는 문구가 들어 갑니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(34, 34, 34); font-family: &amp;quot;Nanum Gothic&amp;quot;; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;생성된 .pem 파일을 텍스트 뷰어로 열어보면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-----BEGIN CERTIFICATE-----&lt;/p&gt;&lt;p&gt;MIIFmzCCBIOgAwIBAgIEIK82tTANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJr&lt;/p&gt;&lt;p&gt;cjEQMA4GA1UECgwHeWVzc2lnbjEVMBMGA1UECwwMQWNjcmVkaXRlZENBMRowGAYD&lt;/p&gt;&lt;p&gt;VQQDDBF5ZXNzaWduQ0EgQ2xhc3MgMjAeFw0xNzEyMDUxNTAwMDBaFw0xODEyMTcx&lt;/p&gt;&lt;p&gt;NDU5NTlaMHExCzAJBgNVBAYTAmtyMRAwDgYDVQQKDAd5ZXNzaWduMRQwEgYDVQQL&lt;/p&gt;&lt;p&gt;DAtwZXJzb25hbDRJQjEMMAoGA1UECwwDU0hCMSwwKgYDVQQDDCPslYjssL3tnawo&lt;/p&gt;&lt;p&gt;KTAwODgwNDIyMDEyMTIxMjE4ODAwMjMyODCCASIwDQYJKoZIhvcNAQEBBQADggEP&lt;/p&gt;&lt;p&gt;ADCCAQoCggEBANwdu3oMNTcqUiERvXOwVNF0Iwb7XeBAFfJgLuD0wfPs+tQ/Q3mH&lt;/p&gt;&lt;p&gt;kV1IdW8k9r9mQxWAmnGfH1e4RJC5r4sgovwMOk70bpEtcNAQDkAv/ysfYsyvOdXY&lt;/p&gt;&lt;p&gt;0Zb2HTmk66LOkP6vjRB86qHy4ddTGvXYyd6t1KTsZVzGpv+SR8saopT/DDcnVuxL&lt;/p&gt;&lt;p&gt;zJfopYqbhFMKwtV2EMR/HzCAkaYx0Jg/JktiboFrQzwOzgThaLquRJrrcVg7ClMK&lt;/p&gt;&lt;p&gt;6A4dfmXYadTOkpVQfk9LMqxbLw6UZNySI07eHwrozNGsf+xfcCHWs7zGTTTt5EJS&lt;/p&gt;&lt;p&gt;mBgPm5eUYiclbRjlVE9khbNCiWK5dDCe69kCAwEAAaOCAlgwggJUMIGPBgNVHSME&lt;/p&gt;&lt;p&gt;gYcwgYSAFO/cRNLGjcAOozjAfJPGw0G/So/woWikZjBkMQswCQYDVQQGEwJLUjEN&lt;/p&gt;&lt;p&gt;MAsGA1UECgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo&lt;/p&gt;&lt;p&gt;b3JpdHkgQ2VudHJhbDEWMBQGA1UEAwwNS0lTQSBSb290Q0EgNIICEBwwHQYDVR0O&lt;/p&gt;&lt;p&gt;BBYEFCDNwCkS+444N87J1HyCRQH/JLdeMA4GA1UdDwEB/wQEAwIGwDB5BgNVHSAB............&lt;/p&gt;&lt;p&gt;-----END CERTIFICATE-----&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;아래와 같은 텍스트 문구를 볼수있다 위의 문구는 base64로 인코딩되어 있는부분으로 openssl에서 지원하는 api로&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;내가 필요한 인증서 만료일, 개인 법인 등등 의 정보를 뽑아보자!!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;사족은 끗&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;openssl x509 -inform der -in /Users/xxx/zzz/xxxx/signCert.der -out certificate.pem&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;자 이제 pem파일이 생성되었을것이다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 생성된 .pem 파일을 가지고 아래명령어를 쳐보자&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;openssl x509 -enddate -noout -in certificate.pem&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;result =&amp;nbsp;[notAfter=Dec 17 14:59:59 2018 GMT]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;결과값이 짜잔 나와브럿네&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사용할수있는 명령어들로는&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 588px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991FBF395B0E53321D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991FBF395B0E53321D&quot; width=&quot;588&quot; height=&quot;987&quot; filename=&quot;스크린샷 2018-05-30 오후 4.29.07.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>util</category>
      <category>openssl</category>
      <category>x509</category>
      <category>공인인증서</category>
      <category>공인인증서 만료일</category>
      <category>공인인증서 정보</category>
      <category>인증서</category>
      <category>인증서 정보 뽑아내기</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/61</guid>
      <comments>https://changhee.tistory.com/61#entry61comment</comments>
      <pubDate>Wed, 30 May 2018 16:30:25 +0900</pubDate>
    </item>
    <item>
      <title>swift Dictionary NSDictionary 차이점</title>
      <link>https://changhee.tistory.com/60</link>
      <description>&lt;p&gt;기본적으로 Swift의 컬렉션 구조의 세가지 타입이 있다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Dictionary, NSDictionary, MutableDictionary&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;가장 큰 차이점은 타입 설정유무다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;NSDictionary 는&amp;nbsp; Object타입만 들어간다 하여 Int, float 등의 포인터 타입이 아닌경우 NSNumber형식으로&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;컨버팅후 사용해야 하지만&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Swift의 Dictionary는 포인터 형식이 아닌 형식들도 값을 할당할수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;내가 이해한 부분인것.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;알아본바론 컴파일 시점엔 두타입이 동일하게 봄&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;585&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border: none; border-collapse: collapse; width: 585px;&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width:343;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-top:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;Swift Dictionary&amp;nbsp;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 242px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;Swfit NSDictionary&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:343;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;구조체&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 242px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;클래스&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:343;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;value type&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 242px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;referance type&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:343;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;타입을 지정해야만 사용가능&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 242px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot; colspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;Object type&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:343;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;Swift Standard library&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 242px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;Cocoa library&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 343px; height: 33px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-left: 1px solid rgb(204, 204, 204);&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;int, float 포인터 타입(객체가 아닌) 것들도 삽입가능&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;width: 242px; height: 33px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204);&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;int, float 등 포인터형태가 아닌것들은 NSNumber형식으로 변환하여 NSDictionary에 할당해야함&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #00b1ff; background-color: #000000}
span.s1 {color: #ffffff}
span.s2 {color: #ff4647}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>macos | ios</category>
      <category>dictionary</category>
      <category>ios</category>
      <category>NSDictionary</category>
      <category>차이점</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/60</guid>
      <comments>https://changhee.tistory.com/60#entry60comment</comments>
      <pubDate>Wed, 30 May 2018 10:15:09 +0900</pubDate>
    </item>
    <item>
      <title>adb 특정 텍스트만 필터걸어서 파일쓰기 안드로이드</title>
      <link>https://changhee.tistory.com/59</link>
      <description>&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff}
span.s1 {font-variant-ligatures: no-common-ligatures}
&lt;/style&gt;


&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff}
span.s1 {font-variant-ligatures: no-common-ligatures}
&lt;/style&gt;


&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;/Applications/eclipse/android-sdks/platform-tools 들어가서&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;로그 파일 쓰기 특정 텍스트를 포함한것만&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;./adb logcat | grep ktgeo&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&amp;gt; /Users/achee7059/logcat.txt&lt;/span&gt;&lt;/p&gt;</description>
      <category>android</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/59</guid>
      <comments>https://changhee.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 30 Jan 2018 14:43:45 +0900</pubDate>
    </item>
    <item>
      <title>mac sha1 string convert hash key</title>
      <link>https://changhee.tistory.com/58</link>
      <description>&lt;p&gt;echo xx:xx:xx:xx:Xx&amp;nbsp;| xxd -r -p | openssl base64&lt;/p&gt;</description>
      <category>util</category>
      <category>sha1 convert hashkey</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/58</guid>
      <comments>https://changhee.tistory.com/58#entry58comment</comments>
      <pubDate>Wed, 10 Jan 2018 16:03:00 +0900</pubDate>
    </item>
    <item>
      <title>android crash dump</title>
      <link>https://changhee.tistory.com/57</link>
      <description>&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff}
span.s1 {font-variant-ligatures: no-common-ligatures}
&lt;/style&gt;


&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff}
span.s1 {font-variant-ligatures: no-common-ligatures}
&lt;/style&gt;


&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;/Applications/eclipse/android-sdks/platform-tools 들어가서&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;./adb shell dumpstate &amp;gt; androidlog.txt&lt;/span&gt;&lt;/p&gt;</description>
      <category>android</category>
      <category>android log dump</category>
      <author>ZaRas</author>
      <guid isPermaLink="true">https://changhee.tistory.com/57</guid>
      <comments>https://changhee.tistory.com/57#entry57comment</comments>
      <pubDate>Wed, 20 Dec 2017 17:36:14 +0900</pubDate>
    </item>
  </channel>
</rss>