플러그인 제작 (unity3d 라이브러리 추가하기)

 

인텔리 J에서 하는 경우

https://jhedde.tistory.com/entry/Unity-Android-Java-플러그인-붙이기-1

 

Unity - Android Java 플러그인 붙이기 (1)

최근 프로젝트를 진행하는 중에 삽질을 많이 해야하는 일을 맡게 되었다. 삽질을 좀 했는데 삽질한 것을 기록하기 위해 포스팅을 한다. 이 글은 Android, Java 에 대해 기본적인 이해를 전제로 쓰여졌다. 1. 플러..

jhedde.tistory.com

안드로이드 스튜디오에서 하는 경우

https://slway000.tistory.com/35

 

[UNITY] 안드로이드 플러그인 만들기 Part 1

유니티3D 안드로이드(Android) 플러그인(Plugin) 만들기 Part 1. 안드로이드 스튜디오(Android Studio) 2.1.1 기준입니다. * 안드로이드 스튜디오(Android Studio) 상위 버전 분들은 여기 를 눌러 확인바랍니다. *..

slway000.tistory.com

* 해당 버전보다 높은 버전일 경우 gradle 스크립트 문제로 jar 파일이 생성되지 않는다.

해결책은 안드로이드 스튜디오 버전을 바꾸거나 gradle 스크립트 내에서

from('build/intermediates/bundles/release/') -> from('build/intermediates/intermediate-jars/release/') 로 변경

 

 

이클립스에서 하는 경우

https://westwoodforever.blogspot.com/2013/07/unity3d-android-plugin.html

 

Unity3D Android Plugin 이클립스에서 빌드하기

개발하면서 나온 이슈를 정리하고 있습니다. 출처만 남겨주시고 마음대로 퍼가주세요.

westwoodforever.blogspot.com

 

 

유니티에서 플러그인 사용

https://jhedde.tistory.com/entry/Unity-Android-Java-플러그인-붙이기-3?category=653994

 

Unity - Android Java 플러그인 붙이기 (3)

Unity - Android Java 플러그인 붙이기 (2) 이전 글에서는 Andorid Libary Project 를 통째로 담을 수 있는 AAR 파일을 만들어 적용시켰었다. 이제는 Unity 에서 Android Java Class 에 접근할 수 있는 방법에 대..

jhedde.tistory.com

 

레퍼런스

https://docs.unity3d.com/kr/530/Manual/PluginsForAndroid.html

 

유니티 - 매뉴얼: Android 플러그인 빌드

고급 Unity 모바일 스크립팅 Android 스플래시 화면 사용자 지정 Android 플러그인 빌드 이 페이지는 Android의 Native Code Plugins에 대해 설명합니다. Android 플러그인을 빌드 Android 플러그인을 빌드하려면 우선 Android NDK를 구하여 공유 라이브러리 (shared library)를 구축하는 데 필요한 단계를 이해하십시오. 플러그인을 구현하기 위해 C++(.cpp)을 사용하는 경우, name mangli

docs.unity3d.com

https://docs.unity3d.com/kr/current/Manual/AndroidAARPlugins.html

 

AAR 플러그인과 Android 라이브러리 - Unity 매뉴얼

Android Archive(AAR) 플러그인은 컴파일된 Java, 네이티브 (C/C++)코드, 리소스 또는 Android 매니페스트가 포함된 번들입니다. .aar 파일 자체는 모든 에셋을 포함하는 zip 아카이브입니다. 자세한 내용은 Android 라이브러리 생성에 대한 Android 개발자 문서를 참조하십시오.

docs.unity3d.com

 

 



(1) NginX 설정파일

  • 확장자: .conf

  • 경로: 설치방법에 따라 다름

- /etc/nginx/conf.d/*.conf        <-- 가장 일반적

- /etc/nginx/site-available/*.conf

- /etc/nginx/site-enabled/*.conf


  • 설정파일 구조: 블록, 지시어

http {

# 최상위 블록

# 모든 지시어는 하위 블록에 상속됨.


server { # 하나의 웹사이트 단위

# 하위 블록의 지시어는 상위 블록 것보다 먼저 적용됨.

location <PATH> {

# 특정 URL을 처리

}

}

}


events {

# 네트워크의 동작방법과 관련된 설정값

# 위의 블록들과 상속관계를 갖지 않음

# 이벤트 블록 전용 지시어 사용

}


- 지시어

server_name 서비스할 호스트명 정의;

include 포함할 설정파일 경로;            <--   관련 설정 파일을 재사용하는 용도



(2) 서버 구조


외부 요청 ↔︎ 웹 서버 ↔︎  WSGI ↔︎ 애플리케이션


  • 웹 서버 (여기서는 NginX 사용)

    • Apache

    • NginX


  • WSGI (Web Server Gateway Interface) wiki

    • gunicorn: 파이썬으로 작성된 서버로, HTTP 통신만 제공

    • uwsgi: C언어로 작성된 wsgi용 서버

    • gunicorn vs uwsgi


  • 애플리케이션 비교는 생략 (너무 많음, 여기서는 Django 사용)


How the virtualenv separates dependencies on the server.


(2) 프록시 방법

위 서버구조에서 프록시는 웹 서버와 WSGI 사이에서 일어나며, WSGI는 애플리케이션과 하나라고 봐도 무방하다.

사실상 파이썬 애플리케이션이 혼자 통신하기 힘드니 도와주는 친구라고 생각하자.


  • HTTP 통신


[nginx 설정파일 .conf]


server {

listen 80;

server_name <SERVER_HOSTNAME>;

access_log /var/log/nginx/example.log;


location / {

proxy_pass http://<IP or Domain>:<PORT>;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

또는

upstream example_server {

server <IP or Domain>:<Port>;

}


server {

...


location / {

proxy_pass http://example_server;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

proxy_set_header 와 같은 옵션은 서버가 여러 개면 추가하는게 좋음 (단, 필수는 아님)

- gunicorn 은 이 방식만 가능

[gunicorn 명령어, 별도 파일 X]

gunicorn --chdir <PROJECT_DIR> --bind :<PORT> <WSGI_PATH>.wsgi:application

- uwsgi 는 별도의 파일이 필요

[uwsgi 설정파일 .ini]

[uwsgi]

chdir=<wsgi 모듈이 있는 프로젝트 디렉토리 경로>

module=<wsgi 모듈 경로>.wsgi:application

env = DJANGO_SETTINGS_MODULE=<settings 모듈 경로>


http=:<PORT>


logto=/var/log/<path>/@(exec://date+%%Y-%%m-%%d).log


# 기타 설정들은 알아서

# 맨 위 "[uwsgi]"의 의미는 wigs 모듈 별로 관리할 수 있는 "서버 식별자 = 이름" 정도로 볼 수 있음.

# 하나의 설정 파일에 다수의 서버가 관리가능하나, 설정 파일은 나누는 것을 추천


[uwsgi 명령어]


uwsgi <.ini 경로>

  • 명령어를 일일이 치기 귀찮을 경우, 데몬으로 서비스 등록하는 방법이 있음 (아래 참고)

[서비스 등록 스크립트, uwsgi.service]

[Unit]

Description=uWSGI service

After=syslog.target


[Service]

ExecStart=<uwsgi binary 경로> -i <ini 파일 경로>


Restart=always

KillSignal=SIGQUIT

Type=notify

StandardError=syslog

NotifyAccess=all


[Install]

WantedBy=multi-user.target

- 경로: /etc/systemd/system/uwsgi.service

- 명령어:


systemctl start uwsgi

(스크립트 변경 시 데몬을 재시작해야함)

  • Socket 파일로 통신 (gunicorn 은 불가능)

[nginx 설정파일 .conf]

server {

listen 80;

server_name <SERVER_HOSTNAME>;

access_log /var/log/nginx/example.log;


location / {

uwsgi_pass unix:<.sock 파일 경로>;

include uwsgi_param;

}

}

또는

upstream example_server {

server unix:<.sock 경로>

}


server {

...


location / {

uwsgi_pass example_server;

include uwsgi_param;

}

}


[uwsgi 설정파일 .ini]


[uwsgi]

chdir=<wsgi 모듈이 있는 프로젝트 디렉토리 경로>

module=<wsgi 모듈 경로>.wsgi:application

env = DJANGO_SETTINGS_MODULE=<settings 모듈 경로>


socket=<.sock 경로>

chmod-socket=666


logto=/var/log/<path>/@(exec://date+%%Y-%%m-%%d).log


# 가급적 소켓파일의 권한을 명시해주면 좋다. (아래의 경우 deploy 유저)

uid=deploy

gid=deploy

chown-socket=deploy:deploy


[uwsgi 명령어 / 서비스 등록 스크립트] : 위와 동일



  • 포트로 통신 (gunicorn 은 불가능)

[nginx 설정파일 .conf]

server {

listen 80;

server_name <SERVER_HOSTNAME>;

access_log /var/log/nginx/example.log;


location / {

uwsgi_pass <IP or Domain>:<PORT>;

include uwsgi_param;

}

}

또는

upstream example_server {

server <IP or Domain>:<Port>;

}


server {

...


location / {

uwsgi_pass example_server;

include uwsgi_param;

}

}



[uwsgi 설정파일 .ini]


[uwsgi]

chdir=<wsgi 모듈이 있는 프로젝트 디렉토리 경로>

module=<wsgi 모듈 경로>.wsgi:application

env = DJANGO_SETTINGS_MODULE=<settings 모듈 경로>


socket=:<PORT>

chmod-socket=666


logto=/var/log/<path>/@(exec://date+%%Y-%%m-%%d).log


[uwsgi 명령어 / 서비스 등록 스크립트] : 위와 동일



Ref.

gunicorn 환경설정


uwsgi 설정파일


nginx 설정파일:


클라이언트:

구현 부분: https://developer.android.com/google/play/billing/billing_integrate?hl=ko

한글 번역: http://theeye.pe.kr/archives/2118

보안 가이드라인: http://theeye.pe.kr/archives/2130



서버:
보안 가이드라인: http://theeye.pe.kr/archives/2570

영수증 확인 루틴: http://cbkman1111.cafe24.com/Android_1/1310

구매내역 조회 API: https://developers.google.com/android-publisher/api-ref/

파이썬에서 API 사용하기: http://leejaeng.tistory.com/10

파이썬에서 API 사용하기2: https://nevercaution.github.io/2016/03/11/store-inapp-in-python/

파이썬에서 API 사용하기(원본): https://developers.google.com/api-client-library/python/start/get_started

구글 인앱 결제 검증 웹 서비스 만들기: http://totuworld.github.io/2016/02/10/google-oauth/

자바스크립트에서 API 사용하기: http://totuworld.github.io/2017/03/07/azureunity-07/

php 안드로이드 영수증 체크: http://eventhorizon.tistory.com/19

서버검증 팁: http://blog.naver.com/uarepretty/140198321704

리프래시 토큰: https://blog.naver.com/siva6/130186786467

구글 인앱결제 서버검증: http://blog.naver.com/PostView.nhn?blogId=ssplas&logNo=220884235186&parentCategoryNo=&categoryNo=38&viewDate=&isShowPopularPosts=false&from=postView

구글 인앱결제 서버검증 에러관련: http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&no=4816



추가:

구독 및 반복 청구: https://support.google.com/googleplay/android-developer/answer/140504?hl=ko

환불처리: https://support.google.com/googleplay/answer/2479637?hl=ko&ref_topic=3365269&visit_id=1-636104025493492104-3882695194&rd=2

결제 테스트 검증: http://202psj.tistory.com/874

OAuth와 춤을: https://d2.naver.com/helloworld/24942

구글 API 클라이언트 라이브러리: https://developers.google.com/api-client-library/

구글 API 허가: https://developers.google.com/android-publisher/authorization

구글 OAuth 2.0 사용법:

https://developers.google.com/identity/protocols/OAuth2

https://developers.google.com/api-client-library/python/guide/aaa_oauth?hl=ko

Full Source for Android / iOS:

https://developers.google.com/api-client-library/python/auth/installed-app?hl=ko

[RFC] OAuth 2.0 인증 프레임워크: https://tools.ietf.org/html/rfc6749#section-4.1

OAuth2.0 Playground: https://developers.google.com/oauthplayground/?code=4/AAD11ZqxnwZciOCTaKM_mbUWBFp6L80mI7pQW9dPW3snoPbwF-BKK4q99tTr47Zum-Rmpkgb1e4x5JOaP_lvzyw#

API를 통한 영수증 검증: http://opens.kr/97



'Note' 카테고리의 다른 글

Android Plugin 만들기 / Unity 에서 사용하기  (0) 2019.03.30
NginX 프록시 환경설정 방법 (Nginx - WSGI)  (0) 2019.02.27
GDB 사용법  (0) 2018.06.29
make 사용법 (+Makefile)  (0) 2018.06.29
GCC 사용법  (0) 2018.06.29


컴파일러 디버깅 옵션

gcc -g -W -Wall -o [실행파일] [C파일]


소스 수준의 디버깅을 위한 정보를 실행파일에 포함시킨다.


디버깅 관련 리눅스 기본 명령어

  • file <파일이름> : 파일 정보    -> not stripped 출력 시 symbol을 볼 수 있다.

  • strings <파일이름> : 문자열 정보

  • nm -D <파일이름> : 동적으로 남아 있는 정보    -> 프로그램이 사용하는 함수 출력(정적 라이브러리만 해당)

  • objdump -d <파일이름> : 덤프따기

  • gdb <파일이름> : 디버깅


GDB 명령어 (gdb 실행 후 사용하는 명령어들)

1. 기본 설정

  • layout asm : 어셈블리 정보창 출력

  • layout reg : 레지스터 정보창 출력

  • set disassembly-flavor intel : 인텔 아키텍쳐로 설정


2. 프로그램 실행

  • r <명령인자> : 실행(run)

  • c : 중단된 프로그램 실행 재개(continue)

  • kill : 프로그램 실행 종료

  • s <숫자> : 몇 단계 씩 수행(step)

  • ni, si : 한단계 진행

  • finish : 현재 함수의 리턴까지 실행

  • return <return 값> : 함수를 실행하지 않고 리턴

  • q : 디버깅 종료


3. 중단점(breakpoint)
  • b <함수이름/라인넘버/*메모리주소> : breakpoint 설정

-> b *main+43 : main문자열(함수이름참조)이 참조하는 주소 + 43

-> break 80484a8

  • i b : 설정된 breakpoint 표시(= info breakpoint 또는 info b)

  • delete <breakpoint 번호> : 설정된 bp 삭제

  • enable <breakpoint 번호> : bp 활성

  • disable <breakpoint 번호> : bp 비활성

  • clear <함수이름> : 함수 내의 모든 bp 삭제


4. 메모리 확인
  • display [/표시형식] <변수이름> : 변수의 값이 유효한 코드 부분에서 값을 계속해서 출력 (표시형식: d, x, t)

  • undisplay : display 모드를 종료

  • print [/표시형식] <변수이름/*메모리주소/레지스터이름> : 현재 또는 지정된 위치의 프로그램 소스 코드 출력

  • x/[개수][표시형식][단위크기] <주소/함수이름> : 지정된 위치의 메모리 데이터를 지정된 형식으로 출력

-> 표시형식: d, o, x, t, f, s, i 등

-> 단위 크기: b, h, w, g


예시) x/x <주소> : 해당 주소의 내용물을 바이트 단위로 출력

-> x/10x : opcode 10개 출력

-> x/10i : 명령어 10개 출력

-> x/10s : 문자열 10개 출력

-> x/10wx : word단위로 10개 출력

-> x/s, x/i, ... etc


예시) mov $eax, [0xbfffefc4] : 대괄호포인터를 의미

-> 대괄호 없이 0xbfffefc4일 경우 그 주소의 내용이다.

-> 포인터는 그 주소에 저장된 포인터주소가 참조하는 주소의 내용물을 저장하는 것.

-> '*'기호 사용 : x/s *0xbfffefc4 처럼 한단계 더 보아야함


예시) 레지스터도 포인터처럼 사용해서 내용물을 볼 수 있다.

-> x/s $eax : eax에 저장된 내용(주소일수도있음)

-> x/s *$eax : eax에 저장된 포인터가 가리키는 내용



5. 프로그램 코드 확인

  • list <함수이름/라인넘버/변수이름> : 현재 또는 지정된 위치의 프로그램 소스 코드 출력

  • disas <함수이름/메모리주소> : 함수 디스어셈 내용(기계어 코드)


6. 변수값 변경 감지

  • watch <변수이름> : 변수에 데이터가 쓰여질 때 실행 멈춤(breakpoint역할)

  • rwatch <변수이름> : 변수 읽을 때 실행 멈춤

  • awatch <변수이름> : 변수 관련 모든 경우에 실행 멈춤


7. 기타 명령어

  • backtrace, where : 현재 실행 위치의 주소와 스택 상태 출력

  • i locals : 모든 지역 변수 목록과 현재 값 출력(= info locals)

  • i program : 프로그램 실행 정보 출력(= info program)

  • i reg : 현재 레지스터 정보 출력(= info reg)

  • set <수정할주소의 포인터> = <내용> : 메모리 데이터 변경

예시) 잘못된 경우 : 레지스터 주소에 문자열 주소를 넣을 때

set $esp = 0x08048585 : esp가 바뀜


예시) 옳은 경우 : 레지스터가 참조하는 주소에 문자열 주소를 넣을 때

set *0xbfffefa0 = 0x08048585

레지스터는 포인터참조(*)를 사용할 수 없다.

즉, 레지스터의 주소를 적을 것!





추가:

GDB를 통한 디버깅 따라하기(command) http://egloos.zum.com/psyoblade/v/2653919

GDB를 이용한 디버깅(docs) http://korea.gnu.org/manual/release/gdb/gdb.html

Cheatsheet Reference: http://www.yolinux.com/TUTORIALS/GDB-Commands.html





'Note' 카테고리의 다른 글

NginX 프록시 환경설정 방법 (Nginx - WSGI)  (0) 2019.02.27
[GooglePlay] 인앱 결제  (0) 2018.12.29
make 사용법 (+Makefile)  (0) 2018.06.29
GCC 사용법  (0) 2018.06.29
git 명령어 & Bitbucket 사용하기  (0) 2018.06.27

+ Recent posts