안드로이드 SDK 가이드

UserHabit을 시작하기 위해 SDK 적용이 필요합니다.
API 레벨 지원 범위에 따라 적용 방법이 조금 상이합니다.

주의!Android app에 적용하기 위해 아래와 같은 사양이 필요합니다.

  • API level 9 이상
  • Android support library v4 22.2이상

1. SDK 적용하기

1) 라이브러리 추가하기

개발환경에 맞게 아래 탭을 선택하여 적용하세요. SDK 업데이트 히스토리

1. 아래 링크에서 안드로이드용 UserHabit SDK를 다운로드 합니다.

2. 해당 jar파일을 안드로이드 프로젝트 폴더 밑 libs 추가합니다. (app/libs/)

3. 해당 파일을 Java Build Path에 추가합니다.

app/build.gradle 에 적용하세요.
아래 소스와 같이 maven주소와 SDK를 추가합니다.

repositories {
  maven { url 'https://repo.userhabit.io/content/groups/public'}
}

android {
  compileSdkVersion 23
  buildToolsVersion "23.0.1"

  defaultConfig {
      applicationId "io.userhabit.myapplication.app"
      minSdkVersion 9
      targetSdkVersion 23
      versionCode 1
      versionName "1.0"
  }

  buildTypes {
      release {
          minifyEnabled false
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      }
  }
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.android.support:appcompat-v7:23.1.1'
  compile 'io.userhabit.service:userhabitsdk:1.1.3@aar'

}
2) AndroidManifest.xml 에 설정 추가하기

AndroidManifest.xml에 유저해빗 사용을 위하여 권한, APIKEY 등록, 서비스 등록이 필요합니다.
(API KEY에 경우 로그인 후 UserHabit 콘솔에서 앱을 등록하고 개발자 API키와 제품 API키를 발급 받습니다.)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="io.userhabit.myapplication2.app" >

  <!--인터넷 권한 추가-->
  <uses-permission android:name="android.permission.INTERNET"/>
  <!--네트워크 상태 체크 권한 추가-->
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      <activity
          android:name=".MainActivity"
          android:label="@string/app_name" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>

      <!--해당하는 API KEY 발급 받기-->
      <meta-data android:name="userhabitApiKey" android:value="API KEY" />
      <!--유저해빗 서비스 등록하기-->
      <service android:name="io.userhabit.service.main.service.UserhabitService" />

  </application>

</manifest>
      
3) 소스 코드 추가하기
1. API 14이상

아래와 같이 지정된 Application 클래스 내부에 유저해빗 함수를 적용합니다.
(API9 지원 프로젝트에 아래 방법을 도입하면 API14 이상 기기만 데이터를 수집합니다.)

public class BApplication extends Application {

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

}

2. API 9이상

모든 Activity의 OnStart와 OnStop에 Userhabit.activityStart(), Userhabit.activityStop()을 각각 입력하시면 됩니다.
(아래 추가적으로 제공되는 설정 기능에 경우 최초로 실행되는 Activity 내에서 정의하시면 됩니다)

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onStart() {
      super.onStart();
      Userhabit.activityStart(this);
  }

  @Override
  protected void onStop() {
      super.onStop();
      Userhabit.activityStop(this);
}
4) 프로가드 적용하기

프로가드를 사용하실 경우 아래와 같이 예외 처리 코드를 추가해주세요.

-dontwarn android.support.**
-dontwarn org.apache.http.**
-keepnames interface android.support.v4.** { *; }
-keepnames class android.support.v4.** { *; }
-keepnames class android.support.v7.** { *; }
-keepnames interface android.support.v7.** { *; }
-keep class org.apache.** { *; }
-keep interface org.apache.http.** { *; }

유저해빗에서는 Android Support 라이브러리로 부터 아래의 클래스를 사용 합니다.

  • v4.view.ViewPager
  • v4.view.ViewCompat
  • v4.widget.DrawerLayout
  • v7.widget.RecyclerView

2. 추가 화면 구성하기

UserHabit 서비스는 기본적으로 한 개의 Activity를 한 화면으로 자동 정의 합니다.
또한, 아래의 기능들을 활용하여 한 개의 Activity를 여러 화면으로 정의 하여 활용 하실 수 있습니다.

1) ViewPager로 구성된 화면 분석하기

하나의 Activity를 ViewPager 객체를 이용하여 여러 화면을 구성할 경우 이를 위한 별도의 함수를 제공하고 있습니다.
(ViewPager에 등록되는 화면이 한번 더 여러 화면으로 분할되어 사용될 경우 (2)기능을 활용하세요)

@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      mViewPager = (ViewPager) findViewById(R.id.vpPager);
      mAdpater = new MyPagerAdapter(getSupportFragmentManager());
      mViewPager.setAdapter(mAdpater);
      Userhabit.setViewPager(mViewPager);
  }
…
2) 사용자 정의를 통하여 추가 화면 정의하기

Activity 내에서 다양한 화면 구성을 통해 하나 이상의 화면을 표현하는 경우가 있습니다.
이 경우에, 화면이 변경 될 때 마다 아래 함수를 호출하시면 각각의 화면으로 분류하여 분석합니다.
(해당 함수는 onResume() 함수 이후에 적용하셔야 올바르게 동작합니다.)

@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

        Button btn = findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              TestFragment signIn = new TestFragment();
              signIn.show(getSupportFragmentManager(), "");
              Userhabit.setScreen(this, "테스트 화면");
          }
      });
  }
…
3) 특정 Activity 화면 제외하기

setScreen 을 사용하여 화면을 분류하여 분석하는 경우, Activity는 사실상 화면으로의 가치가 없는 경우가 발생합니다.
이러한 경우 해당 Activity가 자동으로 화면 정의가 되지 않도록 다음과 같이 추가합니다.

public class BApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        ArrayList<Class<? extends Activity>> list = new ArrayList<>();
        list.add(MainActivity.class);
        Userhabit.setExcludingClasses(list);
        Userhabit.start(this);
        
    }
}
 
4) Activity 자동 수집 해제하기

모든 Activity에서 자동으로 화면 인식을 하고 싶지 않다면 아래 기능을 활용합니다.
(이때에는 모든 화면을 setScreen으로 직접 적용하셔야 합니다)

public class BApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Userhabit.setManualActivityMode(true);
        Userhabit.start(this);
    }
}
5) 다이얼로그 화면 추적하기

Dialog 객체로 정의한 화면에 대해서도 추적이 가능합니다.
아래와 같이 Dialog 의 show(); 호출 후에 아래와 같이 함수를 호출하여 사용합니다.

private void showDialog() {
    mDialog.show();
    Userhabit.setScreen(dialog, "다이얼로그_화면");
  }

3. 스크롤 데이터 추적하기

안드로이드에서 제공하는 ListView와 RecyclerView 에 대해서 스크롤 분석이 가능합니다. 아래 예시된 코드와 같이 해당하는 뷰를 등록하면 됩니다. (한 화면당 하나의 스크롤만 분석이 가능합니다.)

또, 스크롤 분석에 필요한 스크린샷은 반드시 직접 수집해야 합니다.

1) 스크롤 스크린샷 취득하기

스크롤 스크린샷을 취득하기 위해서는 8. 스크린샷 취득하기 에서 2) 수동 스크린샷 수집 모드 활용 기능을 활용해야 합니다.

(1) 우선 수동 스크린샷 수집 모드를 활성화 합니다.

(2) 스크롤 화면에서 스크롤 화면 수집 버튼을 누르면 자동으로 스크린샷을 수집합니다.
(최대 1분의 시간이 소요되며 스크린샷이 수집되는 동안 앱을 터치 할 수 없습니다.
전원 버튼을 누르거나 앱을 종료하지 마세요. 동작이 완료되면 다시 앱이 활성화 됩니다.)

주의 디바이스 해상도 width가 1080px이 아닌 경우, 일부 데이터가 부정확하게 보일 수 있습니다.

2) 스크롤 추적을 위한 코드 적용
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(getContext(), mPhotoList);
    mRvPhotoList.setAdapter(adapter);
    Userhabit.addScrollView(mRvPhotoList);
    }

(ScrollView에 대해서는 추후 지원될 예정입니다.)

4. 세션 종료 시간 설정하기

유저해빗에서는 앱이 백그라운드로 넘어간 이 후 특정 시간 동안 앱을 활성화하지 않을 경우 세션을 종료합니다.
(세션에 대한 정의는 용어집 에서 확인하세요.)
기본 세션 종료 시간은 10초로 설정되어 있습니다. 해당 값은 아래와 같은 방법으로 수정이 가능합니다.

public class BApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Userhabit.setSessionEndTime(10);
        Userhabit.start(this);
  }

}

5.동적으로 API KEY 입력하기

start 함수에 api key를 입력 할 수 있습니다.
(AndroidManifest.xml 에 API KEY가 입력되어 있어도, 동적으로 입력된 API KEY를 더 우선으로 합니다)

public class BApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Userhabit.start(this, "API KEY");
  }

}

6.사용자 터치 수집 제외하기

보안상의 이유로 특정 뷰 영역에 대한 터치를 수집하고 싶지 않다면 아래와 같이 등록하세요.

@Override
public void onStart() {
   // TODO Auto-generated method stub
   super.onStart();
   Userhabit.addSecretView(button1);
}

7.디버그 모드 활성화 하기

디버그 모드를 활성화 하면 유저해빗 수집 과정에 대한 로그 및 스크린샷 수집 모드를 활용 하실 수 있습니다.
(스크린샷 수집 모드의 경우 현재 베타 서비스 중이며, Production 모드에서는 활성화 되지 않습니다. 자세한 내용은 8. 수동 스크린샷 수집 모드 활용 에서 2) 수동 스크린샷 수집 모드 활용 을 확인하세요. )

public class BApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Userhabit.setDebug(true);
        Userhabit.start(this);
  }
}

8. 스크린샷 취득하기

UserHabit에서는 해당 화면에 대한 인지를 위하여 스크린샷을 앱으로 부터 취득하고 있습니다.화면이 시작한 후에 약 1초 후에 스크린샷 정보를 취득합니다.하지만 일부, 화면이 다 출력되기 전에 수집하는 경우가 발생합니다.ex)네트워크에서 데이터를 받아오는 경우
이러한 경우를 대비하여 추가로 아래 2가지 방법을 통한 스크린샷 수집 방법을 제공하고 있습니다.(일부 비율이 다소 다른 기기에서는 스크린샷 수집이 제한될 수 있습니다.)

1) 코드를 통한 수집 방법

화면의 출력이 완료되는 시점에 해당 함수를 적용하세요. 함수가 호출되는 순간 스크린샷을 수집합니다.
(스크린샷 수집은 Test 모드에서만 유효 하며 1 세션 당 한번의 함수 호출만이 유효 합니다.)
또한 지정된 매개변수 (true/false)에 따라 웹에서 지정한 스크린샷 취득 규칙을 적용 합니다.

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      server.getNetworkData(mNoticeListener);
  }

  OnResponseListener mNoticeListener = new OnResponseListener() {
      @Override
      public void onSuccessed(int statusCode, JSONObject response) {

      //true : 웹에서 지정된 설정을 무시하고 수집한다. false : 웹에서 지정된 설정에 따른다.
      Userhabit.takeScreenshot(true);
      }
  };

}
…
2) 수동 스크린샷 수집 모드 활용 - BETA

7. 디버그 모드 활성화 하기 함수를 활성하고 아래 퍼미션을 추가합니다.
앱이 실행된 기기를 후면 카메라가 보이도록 뒤집고 1초 뒤에 다시 화면이 보이도록 뒤집으면 스크린샷 수집을 위한 화면이 실행됩니다.
(해당 기능을 위해서는 ‘화면 위에 그리기’ 권한이 필요합니다. 해당 권한을 허용해주세요.)

<?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                  package="io.userhabit.myapplication2.app" >

      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
      <application
      .....
        </application>
        </manifest>
      
Screen help 01

위의 이미지와 같이 정상적으로 실행이 되면 앱 화면 오른쪽 하단에 + 버튼이 나옵니다.

  • 화면 수집 관련 도움 뷰 : '정보 off' 버튼을 클릭하면 상단에 현재 화면 명칭과 스크린샷 수집 현황 정보가 출력됩니다.
  • 일반 화면 수집 : 현재 화면의 스크린샷을 수집합니다.
  • 스크롤 화면 수집 : 해당 화면에 스크롤이 등록되어 있는 경우 활성화 되며, 스크롤에 해당하는 스크린샷을 수집합니다.

9. 유입 경로 추적하기

텐핑 서비스를 활용하고 계실 경우 유저해빗을 통해 어뷰징을 막을 수 있는 장점이 있습니다.
단, 아래와 같이 추가적인 작업이 필요합니다. (안드로이드에서는 하나의 앱에서 하나의 리시버만 설정할 수 있습니다.)

1) 유저해빗 인스톨 리시버를 한 개만 활용할 경우

AndroidManifest.xml 파일에 다음과 같이 입력합니다.

<receiver
   android:name="io.userhabit.service.main.UserhabitInstallReceiver"
   android:exported="true">
 <intent-filter>
   <action android:name="com.android.vending.INSTALL_REFERRER" />
 </intent-filter>
</receiver>
2) 인스톨 리시버를 두 개 이상 활용할 경우

하나의 리시버를 직접 구현하고 해당 리시버에서 다른 리시버들을 호출 합니다. 아래와 같이 하나의 인스톨 리시버를 생성합니다.

public class MultiInstallReceiver extends BroadcastReceiver {
   @Override
   public void onReceiver(Context context, Intent intent) {
    UserhabitInstallReceiver userhabitReceiver = new UserhabitInstallReceiver();
    userhabitReceiver.onReceive(context, intent);

    //다른 서비스의 리시버들을 동일한 방식으로 호출합니다.
   }
}

위와 같이 작성한 리시버를 AndroidManifext.xml 에 등록합니다.

 <receiver
       android:name="com.yourpackage.MultiInstallReceiver"
       android:exported="true">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
 </receiver>
3) 인스톨 리시버 확인 방법

인스톨 리시버로부터 오는 데이터일 경우 실제 플레이스토어에서 설치 시에 데이터를 넘겨주기 때문에 테스트에 어려움이 있습니다. adb shell을 이용하여 인스톨 리시버를 호출하여 설정이 올바르게 되었는지 테스트합니다.

1. 먼저 안드로이드 기기를 PC와 연결 하고, adb 실행 파일을 찾습니다.

2. adb 파일은 안드로이드가 설치되어 있는 경로 안에 있습니다.
안드로이드 설치 경로를 기준으로 platform-tools 디렉토리 안에 adb 파일이 있습니다.

Android/sdk/platform-tools

3. adb shell을 실행합니다.

#)adb shell

4. 앱을 실행한 상태에서 알맞은 패키지명과 인스톨 리시버클래스 경로를 입력합니다.

am broadcast -a com.android.vending.INSTALL_REFERRER
  -n <패키지명>/<인스톨 리시버 클래스 경로> --es "referrer" "Parameter"

ex) 유저해빗 리시버를 이용할 경우

am broadcast -a com.android.vending.INSTALL_REFERRER
  -n <패키지명>/io.userhabit.service.main.UserhabitInstallReceiver --es "referrer" "Parameter"

ex) 여러개 리시버를 사용하기 위해서 별도의 인스톨 리시버를 만든 경우

am broadcast -a com.android.vending.INSTALL_REFERRER
  -n <패키지명>/<직접 생성한 인스톨 리시버 클래스> --es "referrer" "Parameter"


올바르게 설정 되었다면 해당 명령어를 입력한 다음 안드로이드 로그 창에
태그명이 "UserhabitLog""referrer : Parameter" 와 같이 입력한 값이 출력됩니다.

10. 디바이스 구분자 랜덤 생성 기능

유저해빗에서는 각각의 디바이스를 구분하기 위하여 Android에서 제공하는 ANDROID_ID 값을 사용합니다.
해당 ANDROID_ID 사용에 관하여 정책에 따라 해당 값을 수집하지 않기 위해서 아래와 같은 함수를 통해서 임의로 지정된 값으로 대체 가능합니다.

public class BApplication extends Application {

    @Override
    public void onCreate() {
       super.onCreate();
       Userhabit.enableDeviceRandomID();
       Userhabit.start(this);
  }

}

더 궁금한 사항은 help@userhabit.io으로 연락해주시면 신속히 답변해드리겠습니다.