Gradle 개요


Gradle 블로그를 포스팅하기 앞서 왜 gradle에 관한 블로그를 포스팅하는지 이유를 말씀드리고싶네요. 현업에서 일하고 있는데, gradle을 항상 남이 짜놓은걸 그대로 받아서 빌드돌려서 개발만 하다가, 이제는 제대로 스터디해서 내기호에 맞게 수정하고싶은 마음이 생겼습니다. 또한, gradle이 강력한 빌드 툴이라는 말을 계속 들어서 언젠가는 해야겠다는 마음먹었는데 드디어 행동에 옮기게 되었습니다. 부디 저와 같이 스터디하여 gradle을 master하도록 합시다.


Gradle OverView



Gradle은 Gradle 사에서 만든 범용 빌드 도구중에 하나입니다. 안드로이드에서 빌드 뿐만 아니라, java, c/c++ 등의 모든 범용 언어를 지원합니다. 그러므로 엄청 강력한 툴이지요. 그래서 Gradle을 한번 배워두면 다른언어로 개발하더라도 빌드 스크립트를 처음부터 다시 작성할 필요없이 재사용하실 수 있습니다. 누차 강조하지만 꼭 gradle을 배워보도록 합시다.


다음은 gradle의 주요 특징 4가지 입니다.


1. Polyglot Build

Gradle은 각 언어를 플러그인으로 구별합니다. java는 java, java 웹 프로젝트는 war, 안드로이드 앱은 com.android.application 플로그인을 사용하면 됩니다.


2. 도구통합

gradle은 이클립스, 안드로이드 스튜디오 와 같은 IDE에서 정말 편리하게 사용할 수 있도록 창을 제공하고있습니다. 또한 젠킨스와 함께 활용할 수 도있습니다. 소스코드가 git에 업로드되면 서버에서 CheckStyle, FindBugs 등의 플러그인을 활용하여 소스코드가 잠재적으로 가진 문제를 검출하여 개발자에게 통보하거나 위험한 코 드를 merge할 수 없도록 강제적으로 할 수 있습니다.


3. 외부 라이브러리 관리 자동화

Gradle의 또다른 장점중 하나는 개발자가 더는 외부라이브러리를 관리하지 않아도 된다는 점입니다. 개인적으로 이점이 가장 마음에 듭니다. 이클립스에서 개발했던 과거의 경우에는 libs 폴더에 원하는 외부라이브러리 파일을 직접 복사하였지만, Gradle 에서는 단순히 외부 저장소 위치와 라이브러리의 그룹, 이름, 버전 등을 지정해주면 알아서 다운로드하고 빌드에 포함시키게 됩니다. 이얼마나 편하고 좋습니까.


4. 고성능 빌드

Gradle은 점진적 빌드, 빌드캐싱, 병렬 빌드 기능을 지원하는 고성능 빌드를 지향합니다. 하지만 실제로 우니도우 환경에서 안드로이드 앱을 빌드해보면 gradle 메모리 사용량이 많고 빌드시 CPU 점유율이 엄청 높게 잡힙니다. 실무에서 권장하는 사양은 메모리 8GB와 SSD 장착입니다. 메모리 4GB에서 모듈의 수가 늘어나면 Out of memery 현상이 발생합니다. 또한 heap이 부족하다고 난리치기도 한답니다.(진짜 경험)







안드로이드 스튜디오에서 Gradle의 특징을 살펴보겠습니다.



1. 멀티 프로젝트 구조

안드로이드 스튜디오에서 프로젝트를 생성하면 멀티 프로젝트로 생성됩니다. app이라는 폴더가 있는데 이를 Gradle에서는 모듈이라고 부릅니다. gradle에서는 app 모듈뿐만 아니라 새로운 모듈을 추가하여 모듈별로 src 폴더를 포함하게 됩니다.


2. src폴더 구조가 다름

androidTest, main, test 폴더를 확인하실 수 있습니다. Test 폴더는 Local Unit Test 를 지원합니다.


3. libs 폴더

이클립스 libs 폴더에는 빌드하는데 필요한 외부라이브러리를 직접 포함시켜야 했습니다. 하지만 gradle에서는 의존성 관리를 gradle이 담당하므로 libs 폴더를 사용하지 않아도됩니다. 필요한 스크립트 파일에서 외부라이브러리의 저장소와 버전등을 지정하면 빌드할 때 알아서 해당 버전을 다운로드하여 포함합니다. 또한, +옵션등을 적용하면 최신버전을 자동으로 다운로드 할 수 있습니다.


4. bin 폴더

gradle에서 빌드를하면 build/output/apk 폴더에 apk 파일이 위치하게됩니다. 혹은 AAR파일도 있게 됩니다.



정독 해주셔서 감사합니다.

안녕하세요 진쓰예요. 형상관리툴하면 가장먼저 생각나는툴은 역시 깃(GIT)이라고 할 수 있습니다.

깃은 리누스 토발스가 개발한 형상관리툴로서, 압도적인 처리속도로 인해서 전세계 개발자 대다수가 사용하는 아주 강력한 툴이라고 할 수 있습니다.


git 포스팅을 시작하는 이유는, 실제 제가 일하고 있는 현업에서 점점 git을 사용하는 추세로 바뀌고 있기 때문입니다. 그러면 그전엔 어떤 형상관리 툴을 썼느냐 하면 p4(perforce)라는 형상관리툴을 이용했습니다. 윈도우 Base의 gui환경을 제공했기 때문에 사용하기 편리했습니다. 그러나 대세에 따라가려면 git을 써야겠죠? 또한, 현업을하면서 퍼포스가 가지는 한계에 부딪혔기때문에 결국 git을 공식 사용하기로 선포하였다고합니다. 부서에서 진행한 git 세미나를 들었었는데요. 실습없이 진행하다보니 그냥 감만 잡은 상태입니다. 그래서 블로그를 진행해보면서 직접 실습도해보면서 개인적으로 공부도 해보고 여러분들에게 공유도하면 좋을 것 같아서 해당 git 포스팅을 하기로 마음먹었습니다.


보통 리눅스 환경에서 git을 많이 사용할텐데요.윈도우에서도 설치하고 이용해보도록 윈도우 git 설치 포스팅 시작하겠습니다.



먼저 공식사이트로 이동해서 git을 다운받도록 합시다.

https://git-scm.com

 

공식사이트로 이동하셨으면 아래화면중 Downloads를 선택합니다.


Downloads를 선택하시고 Windows를 선택하시면, 해당하는 PC에맞는 Bit의 인스톨러를 자동 다운로드하게 됩니다.

 

다운로드가 다되면 설치를 진행하시면 됩니다.

저같은경우는 전부 default로 설정된대로 설치를 진행하였습니다.

이렇게 하시면, git 환경변수도 설치과정중에 자동으로 할당되게됩니다.

 

 

설치를 다 끝내시면, 윈도우 시작에 git bash를 검색하면 다음과 같은 아이콘을 확인하실 수 있게 됩니다.

 

그리고 실행하시면 다음과 같은 bash 창이 열리는것을 확인하실수 있습니다.

 

 

설치되었으면  git이 제대로 설치되었는지 확인해봐야겠죠? 개발자들은 이런 확인과정을 꼼꼼히 해주셔야 합니다.

 

 

사용자 이름과 이메일을 입력하려면 다음 명령을 커멘드라인에 입력하고 실행합니다. git에서 커밋할때마다 기록하는 사용자 이름과

메일 주소를 설정하는 명령입니다.

 

명령을 실행해도 특별한 메세지가 출력되지는 않습니다. 하지만 이제 Git을 사용할 준비가 되었습니다.

혼자 개발이아닌 다수의 개발자들과 협업을 할 수도 있게 되었고, 또한 github사이트에 공유하여 open source 프로젝트도 진행하실 수 있는 환경을 구축하게 되었습니다.

 

 

감사합니다. 부디 Git을 잘 다루는 개발자가 되어 형상관리를 예쁘고 멋지게 해봐요.

다음 포스팅 부터 git을 이용한 실습 예제들을 소개하도록 하겠습니다.

<안드로이드 액션바 + 탭 구현>


 안드로이드에서 제공되는 Action Bar에서 Navigation Tab Mode로 변경하여 제작하는것이 금일 포스팅의 목표입니다. 안드로이드가 요즘 목표가 액션바에 네비게이션 탭을 둬서 유저에게 제공하는 UI를 제공하는거죠. 또한, 프래그먼트 사용을 적극 권장하고 있는 추세인것 같습니다. 다중의 액티비티를 만들어내는 것보다 프래그먼트를 도입하여 하나의 액티비티에서 여러기능들을 수행할 수 있도록 유도하고 있는것 같습니다.


 실제로 이러한 움직임은 불과 몇 년전의 web 에서와 비슷하다고 할 수 있는데요. web page 시장도 예전에는 frame이라는 태그가 있었고, 여러 html 파일들로 나뉘어 져있었어요. 그런데 w3c에서 frame 태그를 없애더니 하나의 페이지에서 여러 정보를 전개할 수 있는 ajax등을 권장하고 있는 추세이지요. 


아무쪼록 액션바에 네비게이션 탭모드로 설정하고 프래그먼트와 연동하는 안드로이드 실습 포스팅 진행하도록 하겠습니다.

금일 실습해볼 과제의 최종결과물 먼저 보도록 하겠습니다.

 

 

 

두번째 그림은, 첫번쨰 프래그먼트 상태인데 중복으로 눌렀을 경우, 다시한번 선택되었다는 토스트가 뜨도록 구현한 사항입니다. 구현사항이 궁금하시면, MainActivity.java 의 onTabReselected 오버라이드 메서드를 참고하시면 되겠습니다. 



먼저 탭이동에 따른 프래그먼트 먼저 생성하겠습니다.

Fragment1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">


<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="First Fragment"
android:textColor="#ff000000"
android:gravity="center" />
</LinearLayout>


첫번째 프래그먼트가 생성되었을때, inflate를 전개하는 코드입니다. inflater를 통해서, 전개하는 과정의 코드가 있습니다.

FragmentOne.java

package com.android.jinss.dando;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
* Created by PARK on 2017-07-08.
*/
public class FragmentTwo extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1, container, false);
}
}


2번째 프래그먼트 xml파일입니다.

Fragment2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
>

<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Second Fragment"
android:textColor="#ff000000"
android:gravity="center" />


</LinearLayout>


두번째 프래그먼트가 생성되었을때, inflate를 전개하는 코드입니다.

FragmentTwo.java

package com.android.jinss.dando;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
* Created by PARK on 2017-07-08.
*/
public class FragmentTwo extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment2, container, false);
}
}


그리고 fragment가 펼쳐질 activty_main.xml을 살펴보시겠습니다.두 fragment가 들어갈 부분을 LinearLayout으로 지정해놓고, id를 fragment로 추가하였습니다.

fragemetOne, Two 프래그먼트가 해당 Id가 fragment인 LinearLayout 부분에 들어가서 전개되는것을 확인하실 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.android.jinss.dando.MainActivity"
>

<LinearLayout
android:id="@+id/fragment"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout> 


마지막으로 Actionbar.TabListner를 implements하는 MainActivty를 살펴보시겠습니다. Fragment전개 역시 Main에서 합니다.


MainActivtiy.java

 package com.android.jinss.dando;


import android.app.ActionBar;
import android.app.Activity;

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity implements ActionBar.TabListener {
Fragment frag1, frag2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ActionBar ab = getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

//타이틀바는빼고 탭만 보여주기위해 작성.
ab.setDisplayShowTitleEnabled(false);
ab.setDisplayShowHomeEnabled(false);


frag1 = new FragmentOne();
frag2 = new FragmentTwo();
ab.addTab(ab.newTab().setText("Text Fragment")
.setTabListener(this));
ab.addTab(ab.newTab().setText("Image Fragment")
.setTabListener(this));
}

@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
ft.replace(R.id.fragment, tab.getPosition() == 0 ? frag1 : frag2);
}

@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
ft.remove(tab.getPosition() == 0 ? frag1 : frag2);
}

@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
Toast.makeText(this, "Reselected!", Toast.LENGTH_LONG).show();
}
}



액션바에 네비게이션 탭을 add하여 전개하는 코드들을 살펴보았습니다. 근데 하면서, 탭의 height을 늘리고싶었는데 도무지 방법을 모르겠더라구요.

그럴때는 개발자가 직접 custom theme style.xml을 직접 작성하여서 해야하는 것같던데 자세한 방법을 찾아보다가 지쳐서 일단 pending 상태입니다.


혹시 아시는 아이디어가 있으시다면 댓글로 달아주시면 고맙겠습니다. 이상으로 안드로이드 액션바에 네비게이션 tab mode와 fragment 동시 구현에 대한 포스팅을 마치도록 하겠습니다. 감사합니다.

+ Recent posts