카테고리 보관물: Tools

안드로이드 스튜디오 Gradle 빌드 플러그인 업데이트

안드로이드 스튜디오(Android Studio)에서 Gradle을 사용해서 애플리케이션을 빌드하기 위해서 꼭 필요한 플러그인이 있고, 이 플러그인은 프로젝트(모듈이 아님)의 build.gradle 파일에 선언되어 있다. 이 파일은 아래 이미지에 선택되어 있다.

project_directory

아래에 볼 수 있는 스크립트 내용이 현재 프로젝트를 진행하고 있는 build.gradle 파일의 내용이다. 빌드 플러그인은 2015년 11월 12일 1.5.0의 안정화 버전이 발표되어, 1.3.1 버전에서 1.5.0 버전으로 업데이트를 한 것을 알 수 있다. 간단하게 아래처럼 버전만 변경하면 쉽게 빌드 플러그인을 업데이트할 수 있다.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        
        //classpath 'com.android.tools.build:gradle:1.3.1'
        classpath 'com.android.tools.build:gradle:1.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

이 빌드 플러그인은 Bintray에 배포가 되고 있으며, 아래에서 확인할 수 있다.
https://bintray.com/android/android-tools/com.android.tools.build.gradle

그리고 위 링크에서 배포된 버전들을 최신 순더로 살펴보면 다음과 같다. 최신 버전이 1.5.0임을 알 수 있고, 이 버전까지는 여러번의 베타 과정을 거치면서 안정화 된 것을 알 수 있다.

build.gradle.versions

이제 빌드 플러그인이 업데이트 되면 쉽게 업데이트할 수 있겠다.

IntelliJ/Android Studio Open Current Activity 플러그인

인텔리J나 인텔리J 기반의 IDE인 안드로이드 스튜디오에서 안드로이드 개발을 하면서 유용한 플러그인의 하나인 Open Current Activity에 대해서 살펴보자. 이 플러그인의 이름만으로도 어떤 기능을 제공하고 있는지 어렵지 않게 유추할 수 있다.

  1. 기능

    • 바로 에뮬레이터나 기기에 연결해서 보고 있는 앱 화면의 Activity로 바로 이동할 수 있는 플러그인이다.
  2. 설치 및 다운로드

    • 안드로이드 스튜디오의 경우에는 플러그인 설치 윈도에서 찾을 수가 없어서 다운로드 해서 설치하도록 하자. 설치 방법은 이 페이지(https://plugins.jetbrains.com/plugin/7877)에서 jar 파일을 다운로드 하고, Preference > Plugins > Install plugin from disk… 버튼을 클릭해서 다운로드 한 jar 파일을 로딩한다. 마지막으로 안드로이드 스튜디오를 재시작한다.
  3. 사용방법

    • 사용방법은 에뮬레이터나 기기를 연결해서 개발 중인 앱을 실행시킨다. 그리고 화면을 보는 상황에서 메뉴의 Navigate > Current Activity 메뉴를 찾아서 클릭한다. 이제 화면에 보고 있는 Activity가 에디터 창에 뜨는 것을 확인할 수 있다.

안드로이드를 개발하면서 화면을 이동하고, 이동한 화면에서 문제를 발견하면 어떤 Activity나 Fragment인지 찾아서 수정해야 하는데, 이 찾는 과정이 조금 시간이 걸리기도 하지만 기억력의 한계로 가끔은 짜증을 유발하기도 한다. 그래서 이 플러그인은 많은 안드로이드 개발자들에게 유익한 플러그인이 될 것으로 생각한다.

아래 화면은 플러그인 개발 사이트에서 보여주는 예시화면이다.

[Inno Setup] cmd 실행 뒤에 프로세스가 종료 안 되는 이슈

Inno Setup 툴은 윈도 애플리케이션을 패키징하는 툴이고, 스크립트 언어로 파스칼(Pascal)을 사용한다. 이 툴을 사용해서 애플리케이션을 패키징 하는 스크립트에서 애플리케이션 파일들을 복사하기 전/후에 외부 애플리케이션을 실행할 수 있다.
간단하게 스크립트 파일의 일부를 살펴보자.

[Files]
 Source: {#DefaultAssetFolderName}\NLog.dll; DestDir: {app}; Flags: ignoreversion
 .
 .
 .
[Run]
 Filename: "{cmd}"; Parameters: "/c taskkill /f /im explorer.exe"; Flags:runhidden;
 Filename: "{cmd}"; Parameters: "/c explorer.exe & exit"; Flags:runhidden;
[UninstallRun]
 Filename: "{cmd}"; Parameters: "/c taskkill /f /im explorer.exe"; Flags:runhidden;
 Filename: "{cmd}"; Parameters: "/c explorer.exe & exit"; Flags:runhidden;
[UninstallDelete]
 Type: filesandordirs; Name: {app}
 .
 .

위 소스는 다음의 과정을 거치게 된다.
1. 설치
1.1 [Files] 부분에 있는 파일들을 복사한다.
1.2 [Run] 부분을 차례로 실행한다.

2. 삭제
2.1 [UninstallRun] 부분을 차례로 실행한다.
2.2 [UninstallDelete] 부분에 있는 폴더/파일을 삭제한다.

위의 1.2와 2.1에서는 외부 애플리케이션으로 cmd를 사용하고 있다. 이 과정을 거치다 보면 설치는 되는데 cmd 프로세스가 종료되지 않는 문제와 삭제 시에 [UninstallDelete]의 과정으로 진행하지 못하는 문제가 있다.

그래서 이 경우를 해결하기 위해서 C#으로 애플리케이션을 만들어서 위의 과정을 실행시켜야 한다.

// 5초뒤에 프로세스를 종료시키는 스레드 시작 
Thread newThread = new Thread(new ThreadStart(Program.Run));
newThread.Start();

// cmd 실행 
ProcessStartInfo cmd = new ProcessStartInfo();
Process process = new Process();
cmd.FileName = @"cmd";
cmd.WindowStyle = ProcessWindowStyle.Hidden;             // cmd창이 숨겨지도록 하기
cmd.CreateNoWindow = true;                               // cmd창을 띄우지 안도록 하기

cmd.UseShellExecute = false;
cmd.RedirectStandardOutput = true;         // cmd창에서 데이터를 가져오기
cmd.RedirectStandardInput = true;          // cmd창으로 데이터 보내기
cmd.RedirectStandardError = true;          // cmd창에서 오류 내용 가져오기

process.EnableRaisingEvents = false;
process.StartInfo = cmd;
process.Start();

process.StandardInput.Write(@"taskkill /f /im explorer.exe" + Environment.NewLine);
process.StandardInput.Write(@"explorer.exe & exit" + Environment.NewLine);

process.StandardInput.Close();

string result = process.StandardOutput.ReadToEnd();
sb = new StringBuilder();
sb.Append("[Result Info]" + DateTime.Now + "\r\n");
sb.Append(result);
sb.Append("\r\n");

// 10초 대기
process.WaitForExit(10 * 1000);

public static void Run()
{
    Thread.Sleep(5 *1000);
    Application.ExitThread();
    Environment.Exit(0);
}

위 소스로 간단하게 cmd_exec.exe 애플리케이션을 만들었다고 가정하고, 패키징 스크립트를 수정하고 실행하면 정상으로 실행된다. 위 패키징 스크립트를 아래와 같이 변경해서 {cmd}로 수행하는 과정을 애플리케이션으로 래핑해서 실행시키면 된다.

[Files]
 Source: {#DefaultAssetFolderName}\NLog.dll; DestDir: {app}; Flags: ignoreversion
 .
 .
 .
[Run]
 Filename: "{app}\cmd_exec.exe"; Flags: runhidden waituntilterminated
[UninstallRun]
 Filename: "{app}\cmd_exec.exe"; Flags: runhidden waituntilterminated
[UninstallDelete]
 Type: filesandordirs; Name: {app}
 .
 .

윈도 프로세스 명령 TASKLIST

윈도도 프로세스와 연관된 명령 도구로 tasklist를 제공하고 있다. 이 명령은 이름으로 task와 list가 결합한 태스크 목록 명령으로 쉽게 유추해 볼 수 있고, 유추한 내용이 맞다. 리눅스나 유닉스의 경우에는 ps를 사용해서 비슷한 동작을 처리할 수 있다. 이 명령을 사용하는 형태에 대해서 살펴보자.

1. tasklist /?

이 명령으로 tasklist 명령으로 사용할 수 있는 파라미터와 예제를 확인할 수 있고, 그 내용은 아래에서 확인할 수 있다.

TASKLIST [/S 시스템 [/U 사용자 이름 [/P [암호]]]]
[/M [모듈] | /SVC | /V] [/FI 필터] [/FO 형식] [/NH]

설명:
이 명령줄 도구는 현재 로컬 또는 원격 시스템에서 실행되고 있는 응용 프로그램 및 관련 작업/프로세스 목록을 표시합니다.

매개 변수 목록:
/S 시스템 연결할 원격 시스템을 지정합니다.
/U [domain\]user 명령을 실행해야 하는 사용자 컨텍스트를 지정합니다.
/P [암호] 해당 사용자 컨텍스트의 암호를 지정합니다. 생략한 경우에는 물어봅니다.
/M [모듈] 해당 패턴 이름과 일치하며 DLL 모듈이 로드된 모든 작업을 나열합니다. 모듈 이름을 지정하지 않으면 각 작업에서 로드한 모든 모듈을 표시합니다.
/SVC 각 프로세스에 있는 서비스를 표시합니다.
/V 자세한 정보를 표시하도록 지정합니다.
/FI 필터 필터에서 지정한 조건과 일치하는 작업 집합을 표시합니다.
/FO 형식 출력 형식을 지정합니다. 사용할 수 있는 값: “TABLE”, “LIST”, “CSV”.
/NH 출력에 표시하지 않을 “열 머리글”을 지정합니다. “TABLE”과 “CSV” 형식에서만 사용할 수 있습니다.
/? 이 도움말/사용법을 표시합니다.

필터:
필터 이름 유효한 연산자 유효한 값
———– ————— ————–
STATUS eq, ne RUNNING | NOT
RESPONDING
IMAGENAME eq, ne 이미지 이름
PID eq, ne, gt, lt, ge, le PID 값
SESSION eq, ne, gt, lt, ge, le 세션 번호
SESSIONNAME eq, ne 세션 이름
CPUTIME eq, ne, gt, lt, ge, le CPU 시간
(hh:mm:ss 형식)
hh – 시간,
mm – 분, ss – 초
MEMUSAGE eq, ne, gt, lt, ge, le 메모리 사용(KB)
USERNAME eq, ne 사용자 이름([domain\]user 형식)
SERVICES eq, ne 서비스 이름
WINDOWTITLE eq, ne 창 제목
MODULES eq, ne DLL 이름

예:
TASKLIST
TASKLIST /M
TASKLIST /V
TASKLIST /SVC
TASKLIST /M wbem*
TASKLIST /S 시스템 /FO LIST
TASKLIST /S 시스템 /U domain\username /FO CSV /NH
TASKLIST /S 시스템 /U 사용자 이름 /P 암호 /FO TABLE /NH
TASKLIST /FI “USERNAME ne NT AUTHORITY\SYSTEM” /FI “STATUS eq running”

2. tasklist

이 명령을 사용해서 현재 실행하고 있는 프로세스에 대한 정보를 가져올 수 있다. Image Name이 프로세스 이름이고 PID가 프로세스 ID이다. 그리고 Mem Usage가 메모리 사용량이다.

3. tasklist /m

이 명령으로 프로세스별로 의존하는 라이브러리(dll)를 확인할 수 있다.

4. tasklist /m xxx.dll

이 명령으로 라이브러리(dll)에 의존하는 프로세스 목록을 확인할 수 있다.

그 외에 자주 사용할 수 있는 명령으로 탐색기를 멈췄다가 다시 시작하는 명령은 다음과 같이 실행시킬 수 있다. 아래의 명령은 Administrator 권한을 가지고 cmd를 열고, 실행하면 된다.

taskkill /f /im explorer.exe
explorer.exe & exit

윈도에서 간혹 dll을 삭제하려고 시도하는 경우, 삭제할 수 없다는 메세지를 볼 수 있다. 이런 경우는 특정 프로세스가 dll을 로딩하고 있으므로 발생한다. 그래서 tasklist /m xxx.dll을 사용해서 이 dll을 사용하는 특정 프로세스를 종료하고 삭제를 할 수 있다.

안드로이드 스튜디오(Android Studio)에서 Fabric의 Crashlytics을 플러그인 설치 없이 사용하기

Crashlytics는 안드로이드나 IOS에서 크래시나 그와 같은 상황에 대한 리포팅 서비스를 제공하고 있다. 이 서비스를 사용하는 기본 방법은 http://sjava.net/?p=479를 확인하면 쉽게 알 수 있다. 필자가 진행하고 있는 프로젝트로 외부 프로젝트도 같이 진행하고 있다. 그래서 Crashlytics 계정을 2개 이상 사용하고 있다.

프로젝트를 변경해서 다른 계정을 사용할 때는 Crashlytics의 플러그인에서 로그아웃 -> 로그인 해서 사용하는 계정을 변경해서 사용한다. 그리고 이 플러그인을 설치하고 싶지가 않았다. 그래서 이 글에서는 플러그인을 설치하지 않고 Crashlytics를 사용하는 방법을 살펴보자.

Crashlytics는 트위터(Twitter)가 인수를 하고 Fabric이라는 통합 툴의 일부가 되었다. 그리고 사용하는 방법도 변경이 되었기에 변경된 내용을 살펴보자.

1. Fabric에서 Crashlytics에 해당하는 gradle 설정은 다음과 같다. 아래 내용은 https://fabric.io/migrations/gradle 에서 확인 할 수 있다.

buildscript {
  repositories {
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:1.5.0'
    // The Fabric Gradle plugin uses an open ended version to react
    // quickly to Android tooling updates
    classpath 'io.fabric.tools:gradle:1.+'
  }
}

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
  jcenter()
    maven { url 'https://maven.fabric.io/public' }
  }

android {
  compileSdkVersion 23
  buildToolsVersion "23.0.0"

  defaultConfig {
    minSdkVersion 16
    targetSdkVersion 23
  }
}

dependencies {
  // Crashlytics Kit
  compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
    transitive = true
  }
}

2. AndroidManifest.xml 파일에 아래의 권한을 추가한다.

<manifest>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

3. AndroidManifest.xml 의 <application> 요소에 아래의 값을 추가한다.

<application>
    <meta-data android:name="com.crashlytics.ApiKey" android:value="키를 넣어 주세요" />
</application>

3.1 위에서 필요한 키는 웹사이트에서 Settings > Organizations 의 목록에 있는 Admin 그룹을 클릭하면 사용자 목록을 볼 수 있고, 이 화면에서 API 키를 확인할 수 있다.

4. Application 클래스에서 사용
– Application 클래스를 상속하는 클래스의 onCreate() 메서드에서 아래와 같은 코드를 사용해서 Crashlytics를 사용할 수 있다.

public void onCreate() {
    super.onCreate();
    Fabric.with(this, new Crashlytics());
}

이제 아래 과정은 Crashlytics가 Fabric으로 통합되면서 Deprecated된 과정이다. 따라서, 아래의 과정은 참고를 하지 않는게 좋다.

이 과정은 안드로이드스튜디오(Android Studio)에 적용할 수 있다.

1. Crashlytics의 pom.xml 파일을 확인한다.
https://crashlytics.com/downloads/maven 에서 Crashlytics에서 배포하는 바이너리에 대한 정보를 확인할 수 있다.

2. 위 정보를 기준으로 build.gradle에 아래의 정보를 입력한다.

buildscript {
    repositories {
        // 1. Add the Crashlytics Maven repository
        maven { url 'http://download.crashlytics.com/maven' }
    }
    dependencies {
        // 2. Add the Crashlytics plugin to your dependencies
        classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+'
    }
}

apply plugin: 'com.android.application'

// 3. Apply the Crashlytics plugin after the Android plugin
apply plugin: 'crashlytics'

repositories {
    // 4. Add the Maven repository
    maven { url 'http://download.crashlytics.com/maven' }
}

dependencies {
    // 5. Add the Crashlytics SDK to the Android project
    compile 'com.crashlytics.android:crashlytics:1.+'
}

3. AndroidManifest.xml 파일에 아래의 권한을 추가한다.

<manifest>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

4. AndroidManifest.xml 의 <application> 요소에 아래의 값을 추가한다.

<application>
    <meta-data android:name="com.crashlytics.ApiKey" android:value="키를 넣어 주세요" />
</application>

4.1 위에서 필요한 키는 웹사이트에서 Settings > Organizations 의 목록에 있는 Admin 그룹을 클릭하면 사용자 목록을 볼 수 있고, 이 화면에서 API 키를 확인할 수 있다.

5. Application 클래스에서 사용
– Application 클래스를 상속하는 클래스의 onCreate() 메서드에서 아래와 같이 Crashlytics를 사용할 수 있다.

public void onCreate() {
    super.onCreate();
    Crashlytics.start(this);
}

 

* 레퍼런스
http://blog.danlew.net/2015/02/20/setting-up-a-new-app-in-crashlytics-without-the-plugin/