Difference between r1.5 and the current
@@ -2,6 +2,8 @@
[[TableOfContents]]
* github가 private인 관계로 zip형태로 첨부하였습니다.
* 소스파일 : [attachment:wikinote_android-master.zip]
= Backend =
== 9월 24일 ==
@@ -10,8 +12,40 @@
* ubuntu를 기반으로 wikinote, nodejs를 깔아둔 Docker 이미지 제작 완료
- 참조: https://hub.docker.com/r/wraithkim/wikinote_docker/
= Frontend =
== Volley ==
=== 1차 ===
* 설치는 git clone https://android.googlesource.com/platform/frameworks/volley
- 참조: https://hub.docker.com/r/wraithkim/wikinote_docker/
== 10월 24일 ==
* 서버의 static 파일들(image,text,mp3 등등..)에 접근하기 위해 nginx 설정을 해주었다. (static 파일은 flask를 통해 가는게 아니라 nginx에서 처리한다.)
* flask에서 render_template기능을 사용해보았다.(html과의 연동) 하지만 jinja2 문법을 조금 익혀야 할 듯 하다.
* 현재 메인페이지는 render_template가능을 사용해서 index.html 템플릿에 연동했고, 404페이지는 404.html 페이지에 연동해놓았다. (404처리는 nginx에서 처리하는게 아니라 flask에서 처리한다.)
* http://wikinote.zeropage.org/templates/index.html 와 같이 템플릿에 직접접근을 하려하면, nginx댠에서 HTTP 403(Permission Denied)을 리턴하도록 해두었다.
= Frontend =
== Design ==
* 기존의 있던 로고가 조금 어색해서, 구글에 떠돌아다니는 이미지(Free icon)에 폴라곤디자인을 씌워서 로고를 제작해봄.
(http://wikinote.zeropage.org/images/logo_test.png)
* 이런식으로도 응용이 가능하다.
(http://wikinote.zeropage.org/images/logo_404.png)
== DEX Loader ==
* 사실 이 부분은 크게 중요해보이진 않지만, 새로운 시도를 해본다는데에 의의를 두고 진행하고 있는 브랜치.
* 어플의 버전관리(업데이트)를 위해 고민하던 중, 기본적으로 서버에서 새로운 버전정보를 받아와 업데이트를 유도하는 방식이 대부분이었고, 유도하는 방식으로는
1. Play Store에 연결
2. 서버에서 APK다운로드 후 패키지매니저 호출
3. 그런거 없다. 그냥 Play Store에 업데이트 올리면 알아서 받아라
4. Runtime update (은행앱, 게임앱들)
등의 방식이 존재했다.
* 이중에서 가장 좋아보이는 runtime update에 대해 연구하던 중, 이승한 멘토님께서 '구글은 JAR(DEX포함)을 다운로드 시켜서, 업데이트한다' 라는말에 호기심이 생겨, 연구중인 내용.
=== 성과 ===
* DexClassLoader와 Reflection API 둘다 기본으로 제공되는 라이브러리인데, 이를 이용해서 외부의 DEX파일의 함수를 이용하는 것은 성공했다.
* 하지만, Reflection API를 이용하면 코드를 짜는데 있어서 매우 난잡하고, 성능면에 있어서도 그닥 좋은편이 아니라서 뭔가 새로운 방법이 없나 연구하던 중, MultiDEX 빌드를 사용햐는 방법이 있었다.
* MultiDEX 빌드란, 기존 한개의 APP에서 한개의 DEX(byte code)를 만들어내는데, APP에서 사용하는 메소드가 65000개가 넘어갈 경우(충분히 가능하다. 외부 라이브러리의 메소드도 하나의 DEX로 묶어서 빌드하므로..) 빌드(컴파일)가 되지 않는다. 이러한 문제를 해결하기 위해 제시된 방안이, 외부라이브러리는 따로 빌드하여 DEX파일을 생성하고, 우리의 main-DEX는 따로 생성해서, run-time에 라이브러리의 DEX(Secondary-DEX)를 로딩 시키는 방법이다.(메소드가 6만개가 넘어가는 앱들은 이런식으로 주로 구현한다고 한다.)
* 여기에서 착안하여, MAIN-DEX는 업데이트를 체크하는 로직만, Secondary-DEX에는 실제 어플리케이션의 로직을 담아서 Secondary DEX를 Run-time에 load하는 방식으로 해보는게 옳다고 생각을 하지만, Android Studio에서 이렇게 빌드시키는 Gradle Script를 어떻게 짤지에 대해서 고민중에 있다.
* 이 부분에 대해서 관심이 있는 사람이라면, (http://shloves.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-DexClassLoader-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BB%A4%EC%8A%A4%ED%85%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A1%9C%EB%94%A9) 을 참고해보자. 다만 Eclipse-ANT기준으로 빌드 스크립트가 작성되어있으니, 알고리즘을 참고해보자.
=== 1차 ===
* 설치는 git clone https://android.googlesource.com/platform/frameworks/volley
@@ -23,5 +57,10 @@
* 만약 Queue를 어플리케이션 시작부터 끝까지 유지시키고 싶을 때는 싱글톤 클래스를 이용해보자.
=== 2차 ===
* POST 전송 형식은 GET 전송 형식과 같지만, 리퀘스트 오브젝트에서 몇몇 메서드를 오버라이딩 해야 한다. (Key-Value 형태는 갖춰야하므로..)
=== 2차 ===
* POST 전송 형식은 GET 전송 형식과 같지만, 리퀘스트 오브젝트에서 몇몇 메서드를 오버라이딩 해야 한다. (Key-Value 형태는 갖춰야하므로..)
* 현재 프로젝트에서는 기존 Volley 내에 있는 클랴스를 상속받아 해결
* 현재 프로젝트에서는 기존 Volley 내에 있는 클래스를 상속받아 해결
== Oauth ==
* Android/iOS는 Google Sign-in이라는 것을 사용하면 비교적 간단하게 구현할 수 있다고 한다.
* keystore가 필요하다는데 아직 조사중..
* Sign-in에서 로그인했을 때 특정 토큰을 받아낼 수 있는지 알아내야 할 듯 싶다. (구글 계정 정보는 받아올 수 있는 듯 싶은데 원하는 토큰 값이 나오는지는 조금 더 알아봐야..)
= 페이지 댓글 = * page not found 가져다 써야겠다. - [bluemir]
위키노트 어플을 개발하면서 얻은 경험 혹은 기술들을 서술하는 페이지입니다.
- github가 private인 관계로 zip형태로 첨부하였습니다.
- 소스파일 : wikinote_android-master.zip (261.03 KB)
1.1. 9월 24일 ¶
- Docker와 nginx의 Reverse proxy와 Virtual Host 설정을 자동으로 해주는 docker-gen이라는 프로그램을 위키서버에 설치
- ubuntu를 기반으로 wikinote, nodejs를 깔아둔 Docker 이미지 제작 완료
1.2. 10월 24일 ¶
- 서버의 static 파일들(image,text,mp3 등등..)에 접근하기 위해 nginx 설정을 해주었다. (static 파일은 flask를 통해 가는게 아니라 nginx에서 처리한다.)
- flask에서 render_template기능을 사용해보았다.(html과의 연동) 하지만 jinja2 문법을 조금 익혀야 할 듯 하다.
- 현재 메인페이지는 render_template가능을 사용해서 index.html 템플릿에 연동했고, 404페이지는 404.html 페이지에 연동해놓았다. (404처리는 nginx에서 처리하는게 아니라 flask에서 처리한다.)
- http://wikinote.zeropage.org/templates/index.html 와 같이 템플릿에 직접접근을 하려하면, nginx댠에서 HTTP 403(Permission Denied)을 리턴하도록 해두었다.
2.1. Design ¶
- 기존의 있던 로고가 조금 어색해서, 구글에 떠돌아다니는 이미지(Free icon)에 폴라곤디자인을 씌워서 로고를 제작해봄.
()
- 이런식으로도 응용이 가능하다.
()
2.2. DEX Loader ¶
- 사실 이 부분은 크게 중요해보이진 않지만, 새로운 시도를 해본다는데에 의의를 두고 진행하고 있는 브랜치.
- 어플의 버전관리(업데이트)를 위해 고민하던 중, 기본적으로 서버에서 새로운 버전정보를 받아와 업데이트를 유도하는 방식이 대부분이었고, 유도하는 방식으로는
- Play Store에 연결
- 서버에서 APK다운로드 후 패키지매니저 호출
- 그런거 없다. 그냥 Play Store에 업데이트 올리면 알아서 받아라
- Runtime update (은행앱, 게임앱들)
- Play Store에 연결
- 이중에서 가장 좋아보이는 runtime update에 대해 연구하던 중, 이승한 멘토님께서 '구글은 JAR(DEX포함)을 다운로드 시켜서, 업데이트한다' 라는말에 호기심이 생겨, 연구중인 내용.
2.2.1. 성과 ¶
- DexClassLoader와 Reflection API 둘다 기본으로 제공되는 라이브러리인데, 이를 이용해서 외부의 DEX파일의 함수를 이용하는 것은 성공했다.
- 하지만, Reflection API를 이용하면 코드를 짜는데 있어서 매우 난잡하고, 성능면에 있어서도 그닥 좋은편이 아니라서 뭔가 새로운 방법이 없나 연구하던 중, MultiDEX 빌드를 사용햐는 방법이 있었다.
- MultiDEX 빌드란, 기존 한개의 APP에서 한개의 DEX(byte code)를 만들어내는데, APP에서 사용하는 메소드가 65000개가 넘어갈 경우(충분히 가능하다. 외부 라이브러리의 메소드도 하나의 DEX로 묶어서 빌드하므로..) 빌드(컴파일)가 되지 않는다. 이러한 문제를 해결하기 위해 제시된 방안이, 외부라이브러리는 따로 빌드하여 DEX파일을 생성하고, 우리의 main-DEX는 따로 생성해서, run-time에 라이브러리의 DEX(Secondary-DEX)를 로딩 시키는 방법이다.(메소드가 6만개가 넘어가는 앱들은 이런식으로 주로 구현한다고 한다.)
- 여기에서 착안하여, MAIN-DEX는 업데이트를 체크하는 로직만, Secondary-DEX에는 실제 어플리케이션의 로직을 담아서 Secondary DEX를 Run-time에 load하는 방식으로 해보는게 옳다고 생각을 하지만, Android Studio에서 이렇게 빌드시키는 Gradle Script를 어떻게 짤지에 대해서 고민중에 있다.
- 이 부분에 대해서 관심이 있는 사람이라면, (http://shloves.tistory.com/entry/안드로이드-DexClassLoader-를-이용한-커스텀-클래스-로딩) 을 참고해보자. 다만 Eclipse-ANT기준으로 빌드 스크립트가 작성되어있으니, 알고리즘을 참고해보자.
2.3.1. 1차 ¶
- 설치는 git clone https://android.googlesource.com/platform/frameworks/volley
- Android Studio에서 작업 시, File → Import Module을 하고 clone한 폴더를 적어주면 알아서 적용된다.
이클립스는 알아서 찾아보자.
- 기본적으로 Http 요청을 하기위해서는 RequestQueue, RequestObject가 필요한데, RequestObject를 Queue에 넣으면 요청이 이루어진다.
- 가장 기본적인 RequestQueue 생성방법은 Volley.newRequestQueue(context)를 이용.
- 만약 Queue를 어플리케이션 시작부터 끝까지 유지시키고 싶을 때는 싱글톤 클래스를 이용해보자.
2.3.2. 2차 ¶
- POST 전송 형식은 GET 전송 형식과 같지만, 리퀘스트 오브젝트에서 몇몇 메서드를 오버라이딩 해야 한다. (Key-Value 형태는 갖춰야하므로..)
- 현재 프로젝트에서는 기존 Volley 내에 있는 클래스를 상속받아 해결
- 현재 프로젝트에서는 기존 Volley 내에 있는 클래스를 상속받아 해결