2011년 2월 28일 월요일

[Android Course][English][Theme] - Android Eclipse "Proguard" use




※ Proguard ?
: "Code obfuscation" Tool by, the various symbols used in the code generated by the machine's name is short, replace the name change.
 
Therefore, the attacker dontAllow () method is used instead of the information that a () uses a method that will give information only. Thus, the attacker does not see the original source code of each method to perform a task that is difficult to notice on a hunch
: It was personal it was a commercial Android dex tool because it uses Java code and the jad tool and you can decompile and reverse engineering is over. To solve this problem by using the code tools I Tues dock to make it difficult to reverse will be used. proguard nandokyi depending on how the coding, but there is nothing that can be decrypted is not possible.

1. Install the latest version of ADT
: "Window -> Android SDK and AVD Manager" and install the latest version through.
: First of course you are currently using the latest version of ADT (after version 8.0.1) must be installed. If you have already installed the latest version of ADT are you an update. ADT is equivalent to update the application to determine the target platform, no matter what we do not have big worries about compatibility updates You may boldly without.

2. Create a new project
- "Eclipse" from the "File> New> Android Project" on creating a new project by choosing (2 files in the root folder of the project generated) : "Proguard.cfg" Think of it as a professional guard configuration files, and basically set the appropriate values for the Android (referenced by name in the manifest does not obfuscation, such as a class may have ,...), the private developers who, without any modification if the If you must use a configuration file seems to be : "Default.properties" (Project settings file) opens a file using the following procedure would set a guard will just add value.
=> proguard.config=proguard.cfg










3. Build
: The build process automatically "Proguard Tool" two works. Proguard to your project folder is a newly created sub-folders within that folder, the following four files are generated.
- Dump.txt: Your application is being used in the internal structure of the class represents information about the rough. Literally for obfuscation in the process of analyzing the source deompeugapdeulyigetjo out. Well. - Mapping.txt: This file is important. Existing class or method is in the process of obfuscation which has been mapped to the new obfuscated name to the list, marked. Occurs in a log or application obfuscation, better prepared to analyze the stack trace is extremely important. - Seeds.txt: Obfuscation is a list of classes and members are not. - Usage.txt: because they are not used, apk files are removed from the list of codes. Doeseoneun removal method or class you should not have been removed, you will want to check out.






























In addition, inquiries, or questions, please contact us.
(joonryang@gmail.com)

[Android 강좌][Korean][테마] - Android Eclipse "Proguard" 사용




※ Proguard ?
:"코드 난독화" Tool로써, 코드에서 사용된 각종 심볼들의 이름을 기계가 생성한 짤막한 대체 이름을 변경합니다.
 따라서, 공격자는 dontAllow() 라는 메서드가 사용된다는 정보 대신 a() 라는 메서드가 사용된다는 정보만을 얻게 됩니다. 따라서 공격자는 원본 소스코드를 참조하지 않으면 각각의 메서드들이 어떤 일을 수행하는지 직감적으로 알아채기 어렵게 됩니다
: 상용이던 개인용이던 안드로이드는 자바코드를 사용하기 때문에 dex tool과 jad tool등을 이용하면 decompile을 통한 reverse engineering이 가능하다.
이를 해결하기 위해 코드난독화툴을 이용하여 reverse를 어렵게 하는 방법을 사용하게 된다. proguard는 코딩을 어떻게 하느냐에 따라 난독이 아니라, 전혀 해독이 불가하게 할수도 있다는 것이다.

1. ADT 최신 버전 설치
: "Window -> Android SDK and AVD Manager"를 통해서 최신 버전 설치.
: 우선 당연히 현재 사용하고 계신 ADT 를 최신 버전(8.0.1 이 후 버전)을 설치 하셔야합니다. 기존에 설치된 ADT 가 있으시면 최신 버전으로 업데이트 하시면 됩니다. ADT 를 업데이트 하는 것과, 어플리케이션 타겟 플랫폼을 결정하는 것은 별다른 상관이 없으니 호환성에 대하여 큰 걱정 하지 않고 과감하게 업데이트 하셔도 좋습니다.











2. 신규 프로젝트 생성
- "Eclipse"에서 "File > New > Android Project" 를 선택하셔서 새 프로젝트를 만듦
(프로젝트 루트 폴더에 2개의 파일이 생성됨)
: "proguard.cfg"
프로가드 환경 설정 파일이라고 생각하시면 되며, 기본적으로 안드로이드에 알맞은 설정 값(메니페스트에서 이름으로 참조하는 클래스는 난독화 하지 않는 등,...)을 갖고 있음으로, 개인 개발자 분들이라면 별다른 수정 없이 해당 설정 파일을 사용하시면 될 듯 합니다
: "default.properties"
(프로젝트 설정 파일임) 파일을 열어서 아래와 같이 프로가드를 사용하겠다고 설정 값을 추가하시면 됩니다
=> proguard.config=proguard.cfg

3. 빌드
: 빌드과정에서 자동으로 "Proguard Tool"이 동작함.
여러분의 프로젝트 폴더에 proguard 라는 하위 폴더가 새롭게 생성되며 해당 폴더 내에, 다음의 네 가지 파일이 생성됩니다.
- dump.txt : 여러분의 어플리케이션에서 사용중인 클래스들의 내부 구조에 대한 대략적인 정보를 나타냅니다. 말그대로 난독화 하기 위해 소스를 분석하는 과정에서 나오는 덤프값들이겠조. 뭐.
- mapping.txt : 이 파일은 중요합니다. 난독화 과정에서 기존 클래스 혹은 메서드가 어떤 새로운 난독화된 이름으로 매핑되었는지 그 목록을 표시해 줍니다. 난독화 된 어플리케이션에 발생하는 로그나, 스택 트레이스 들을 분석하기 위해서 꼭 챙겨 두셔야 합니다.
- seeds.txt : 난독화 되지 않은 클래스와 멤버들의 목록입니다.
- usage.txt : 사용되지 않기 때문에, apk 파일에서 제거된 코드들의 목록입니다. 혹시 제거되서는 안되는 메서드나 클래스가 제거되었는지 꼭 확인해 봐야 합니다.





추가로 문의 사항이나, 궁금한 점이 계시면 연락주세요.
(joonryang@gmail.com)
※ 도움이 되셨다면, ^^. 맨 위 광고클릭 좀..ㅎㅎ

2011년 2월 10일 목요일

[Android Course][English][Theme] - Android Market LVL(License Verification Library) Usage




※ LVL(License Verification Library) ?
: LVL basically your application from one device to another device with a light kind of piracy attacks makes
(Note> that even if piracy is to buy in to your account if your application can not run)
: If you use LVL in my application at runtime through the App Market was actually a purchase to determine if the application. If you are running a normal buyer.

1. "Market Licensing Package" Install
- "Window -> Android SDK and AVD Manager" through the installation
: "Available Packages" through the "Market Licensing Package" installation


- "Installed Packages" Package is installed through the check














2. "market_licensing" library Confirm Folder
: "Android-sdk-windows \ market_licensing \ library" when applied LVL future, Im required library.
: LVL to apply the library can be used in two ways.
  - a link to the reference project is the way
  - another one copy to the library source by the project will be put.
(Google Developer's Guide as a reference project to link recommended.)

3. Publisher Account Settings
: LVL want to use to obtain public key from the Android Market.
Android Market Account, select Edit Profile to access your personal information, such as setting screens coming out down below.
- "Test Accounts" field testing a Google account and put the address is
- "Public Key" field is a string that is used in the program, so in the future If you save it, and
- "Test response" values while the shape may be further tested in the license.

4. "LVL library Project" Create
: "LVL library Project" to create a reason, every time "LVL library Source" rather than copying it easy because when you add the reference.
- "Eclipse" from the "File> New> Android Project" by choosing and creating a new project.
(Contents column "Create project from existing source" to select, based on a copy of "LVL library" folder and checked)

- "Com_android_vending_licensing" project created.


















5. "LVL library" Apply
- "Test Android Project" to create
(ex : LVL_Test_App)








- "Eclipse - Project - Properties" by selecting additional library.






























































- "AndroidManifest.xml" Add permission settings
: LVL for permission to run with the following additional
<uses-permission android:name="com.android.vending.CHECK_LICENSE />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

- "LVL library" import
import android.telephony.TelephonyManager;
import com.android.vending.licensing.AESObfuscator;
import com.android.vending.licensing.LicenseChecker;
import com.android.vending.licensing.LicenseCheckerCallback;
import com.android.vending.licensing.ServerManagedPolicy;

- "LicenseCheckerCallback" Implementation
    private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
        @Override
        public void allow() {
            if (isFinishing()) {
                return;
            }
            // "License Authentication" Success
        }
        @Override
        public void applicationError(ApplicationErrorCode errorCode) {
         // "License Authentication" Error
        }
        @Override
        public void dontAllow() {
            if (isFinishing()) {
                return;
            }
         // "License Authentication" Fail
        }
    }

- "License Authentication" Initialization and Run
public class main extends Activity {

    // public key
    private static final String BASE64_PUBLIC_KEY = "public key ... ";
   
    // Random byte
    private static final byte[] SALT = {-6, 35, 50, -118, -13, -5, 73, -24, 11, 82, -15,
                         -12, 27, -17, -4, -113, -13, 42, -54, 79};
    private LicenseCheckerCallback m_LicenseCheckerCallback;
    private LicenseChecker m_Checker;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // "LicenseCheckerCallback" Initialize
        m_LicenseCheckerCallback = new MyLicenseCheckerCallback();
        // "Devices ID" Obtain
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String deviceId = tm.getDeviceId();
        // "LicenseChecker" Initialize
        m_Checker = new LicenseChecker( this,
                   new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)),
                   BASE64_PUBLIC_KEY);
        // "License Validation" Exe
        m_Checker.checkAccess(m_LicenseCheckerCallback);
    }
    ...
}

6. APK Test
: "LVL" to test the "Android Market" will be up to the fee.
: "Publish" does not need to do to, "save" are worth LVL can test release.


In addition, inquiries, or questions, please contact us.
(joonryang@gmail.com)

[Android 강좌][Korean][테마] - Android Market LVL(License Verification Library) 사용법




※ LVL(License Verification Library) ?
: 기본적으로 LVL 은 여러분의 어플리케이션을 한 디바이스에서 다른 디바이스로 불법 복제하는 가벼운 종류의 공격을 방어해줍니다
(주> 불법 복제하더라도 해당 계정에 어플리케이션 구매 정보가 없으면 실행할 수 없음)
: 나의 어플리케이션에서 LVL을 사용하면 실행시에 마켓앱을 통해 실제로 구매가 된 어플인지를 확인을 한다. 정상적인 구매자라면 실행을 하게 된다.

1. "Market Licensing Package" 설치
- "Window -> Android SDK and AVD Manager"를 통해서 설치
: "Available Packages"를 통해서 "Market Licensing Package" 설치

- "Installed Packages"를 통해서 설치된 Package 확인














2. "market_licensing" library 폴더 확인
: "android-sdk-windows\market_licensing\library" 추후 LVL 적용 시, 필요한 library 임.
: LVL을 적용하기 위해 library를 두가지 방법으로 사용할 수 있음.
 - 하나는 레퍼런스 프로젝트로 연결하는 방법이고,
 - 다른 하나는 라이브러리 소스를 해당 프로젝트에 카피하여 넣는 것임.
(구글 개발자 가이드에는 레퍼런스 프로젝트로 연결하는 것을 권장함.)

3. Publisher 계정 설정
: LVL을 사용하려면 안드로이드 마켓에서 public key 를 얻어야 합니다.
안드로이드 마켓 계정에 접속하여 Edit Profile 을 선택하면 개인 정보 설정 밑에 아래와 같은 화면이 나옴.
- "Test Accounts" 란에는 테스트할 구글 계정 주소를 넣으면 되며,
- "Public Key" 란에 있는 문자열은 추후에 프로그램에서 사용할 것이므로 잘 저장해 두면 되며,
- "Test response" 값을 바꿔가면서 추후에 라이선스 테스트를 할 수 있음.

4. "LVL library Project" 생성
: "LVL library Project"를 생성하는 이유는, 매번 "LVL library Source"를 복사하는 것 보다 바로 레퍼런스를 추가하면 편리하기 때문입니다.

- "Eclipse"에서 "File > New > Android Project" 를 선택하셔서 새 프로젝트를 만듦.
(Contents 란에서 "Create project from existing source"를 선택하고, 위에서 복사해 둔 "LVL library" 폴더를 선택함)

- "com_android_vending_licensing" 프로젝트 생성됨.


















5. "LVL library" 적용
- "Test Android Project"를 생성
(ex : LVL_Test_App)








- "Eclipse - Project - Properties" 선택하여 library 추가.






























































- "AndroidManifest.xml" 권한 설정 추가
: LVL 실행을 위한 권한을 아래와 같이 추가
<uses-permission android:name="com.android.vending.CHECK_LICENSE />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

- "LVL library" import
import android.telephony.TelephonyManager;
import com.android.vending.licensing.AESObfuscator;
import com.android.vending.licensing.LicenseChecker;
import com.android.vending.licensing.LicenseCheckerCallback;
import com.android.vending.licensing.ServerManagedPolicy;

- "LicenseCheckerCallback" 구현
    private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
        @Override
        public void allow() {
            if (isFinishing()) {
                return;
            }
            // "License Authentication" Success
        }
        @Override
        public void applicationError(ApplicationErrorCode errorCode) {
         // "License Authentication" Error
        }
        @Override
        public void dontAllow() {
            if (isFinishing()) {
                return;
            }
         // "License Authentication" Fail
        }
    }

- "License Authentication" 초기화 및 실행
public class main extends Activity {

    // public key
    private static final String BASE64_PUBLIC_KEY = "public key ... ";
   
    // Random byte
    private static final byte[] SALT = {-6, 35, 50, -118, -13, -5, 73, -24, 11, 82, -15,
                         -12, 27, -17, -4, -113, -13, 42, -54, 79};
    private LicenseCheckerCallback m_LicenseCheckerCallback;
    private LicenseChecker m_Checker;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // "LicenseCheckerCallback" Initialize
        m_LicenseCheckerCallback = new MyLicenseCheckerCallback();
        // "Devices ID" Obtain
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String deviceId = tm.getDeviceId();
        // "LicenseChecker" Initialize
        m_Checker = new LicenseChecker( this,
                   new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)),
                   BASE64_PUBLIC_KEY);
        // "License Validation" Exe
        m_Checker.checkAccess(m_LicenseCheckerCallback);
    }
    ...
}

6. APK 테스트
: "LVL"을 테스트하기 위해서는 "Android Market"에 유료로 올라가 있어야 합니다.
: "publish" 까지 할 필요는 없으며, "save" 만 해 놓으면 LVL을 테스트할 수 있습니다.


추가로 문의 사항이나, 궁금한 점이 계시면 연락주세요.
(joonryang@gmail.com)
※ 도움이 되셨다면, ^^. 맨 위 광고클릭 좀..ㅎㅎ

2011년 2월 7일 월요일

[Android Course][English][Theme][Error] - "generating final archive: Debug certificate expired on ...."




1. "Error" Cause
: "Eclpise" This error message comes out of the building may have.
This "Debug certificate" has expired, is due.
(Note: "Debug certificate" that is created will expire after 365 days.)

2. "Error" solution
Debug certificate has expired, you are to renew.
debug.keystore files are deleted, then re-build of Android apps are you.
(Note: "debug.keystore" The location of the file 'Window> Preferences> Android> Build' in the 'Default debug keystore' is the topic.)

In addition, inquiries, or questions, please contact us.
(joonryang@gmail.com)

[Android 강좌][Korean][테마][Error] - "generating final archive: Debug certificate expired on ...."




1. "Error" Cause
: "Eclpise"에서 빌드 중에 이런 오류 메시지가 나오는 경우가 있습니다.
이는 "Debug certificate"가 만료되었기 때문에 발생하는 것이다.
(참고 : "Debug certificate"는 만들어진 후 365일이 지나면 만료됩니다.)

2. "Error" solution
만료된 Debug certificate를 새로 갱신해주면 된다.
debug.keystore 파일을 삭제한 후, 다시 안드로이드 애플리케이션을 빌드만 하면 된다.
(참고 : "debug.keystore" 파일의 위치는 'Window > Preferences > Android > Build'에서 'Default debug keystore' 항목을 참조하면 된다.)

추가로 문의 사항이나, 궁금한 점이 계시면 연락주세요.
(joonryang@gmail.com)
※ 도움이 되셨다면, ^^. 맨 위 광고클릭 좀..ㅎㅎ

[Android Course][English][Theme] - Link to Android Market




1. Market Link type
- packageName = 패키지네임
- searchName = 검색어

2. example
: "market://details?id=packageName"
=> Details of the package with the application goes to the screen.

: "market://search?q=packageName" or "market://search?q=searchName"
=> Package, or to people that the search should search in the market.
3. How to Run
1) "Html" Link
"href=market://details/?id=packageName"

2) "Intent" Link
Intent marketLaunch = new Intent(Intent.ACTION_VIEW);
marketLaunch.setData(Uri.parse("market://search?q=Screen"));
startActivity(marketLaunch);

In addition, inquiries, or questions, please contact us.
(joonryang@gmail.com)

[Android 강좌][Korean][테마] - Android Market 링크방법




1. 마켓링크 종류
- packageName = 패키지네임
- searchName = 검색어

2. example
: "market://details?id=packageName"
=> 해당 패키지명을 가진 어플의 상세화면으로 간다.

: "market://search?q=packageName" or "market://search?q=searchName"
=> 해당패키지명 또는 해당 검색명으로 마켓에서 검색을 한다.

3. 실행 방법
1) Html 링크
"href=market://details/?id=packageName"

2) Intent 링크
Intent marketLaunch = new Intent(Intent.ACTION_VIEW);
marketLaunch.setData(Uri.parse("market://search?q=Screen"));
startActivity(marketLaunch);

추가로 문의 사항이나, 궁금한 점이 계시면 연락주세요.
(joonryang@gmail.com)
※ 도움이 되셨다면, ^^. 맨 위 광고클릭 좀..ㅎㅎ

2011년 1월 28일 금요일

[Android Course][English][Theme] - Android Tab to apply a background image




Tab typically apply a background image is simple.
In other words, as follows: "setBackgroundColor ()" Applying is easy.


'm_tabHost.getTabWidget().getChildAt(0).setBackgroundColor(Color.parseColor("#534512"));'
However, I want several properties as shown below was applied.

- 'Touch the color or image when you'
- 'Touch Up When the color or image'
- 'Tab color or image when it is focusing on'
...

As shown above in order to provide a base should be combined with the Android Control.






※ Example Code
- TapView_Custom.java
public class TapView_Custom extends TabActivity implements OnTabChangeListener {
    /** Called when the activity is first created. */

    private TabHost m_tabHost = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        setContentView(R.layout.tapview_custom_layout);
       
        /** TabHost ID */
        m_tabHost= (TabHost)findViewById(android.R.id.tabhost); 
        TabSpec aaa_TabSpec = m_tabHost.newTabSpec("aaa"); 
        TabSpec bbb_TabSpec = m_tabHost.newTabSpec("bbb");
        TabSpec ccc_TabSpec = m_tabHost.newTabSpec("ccc");
       
        LayoutInflater vi1 = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LayoutInflater vi2 = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LayoutInflater vi3 = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View View_1 = (View)vi1.inflate(R.layout.tab_row_item, null);        View View_2 = (View)vi2.inflate(R.layout.tab_row_item, null);
        View View_3 = (View)vi3.inflate(R.layout.tab_row_item, null);
        LinearLayout Layout_1 = (LinearLayout)View_1.findViewById(R.id.LinearLayout01);
        LinearLayout Layout_2 = (LinearLayout)View_2.findViewById(R.id.LinearLayout01);
        LinearLayout Layout_3 = (LinearLayout)View_3.findViewById(R.id.LinearLayout01);
        Layout_1.setBackgroundResource(R.drawable.tab_1_bg);
        Layout_2.setBackgroundResource(R.drawable.tab_2_bg);
        Layout_3.setBackgroundResource(R.drawable.tab_3_bg);
       
        ImageView iv_1 = (ImageView)View_1.findViewById(R.id.icon);
        ImageView iv_2 = (ImageView)View_2.findViewById(R.id.icon);
        ImageView iv_3 = (ImageView)View_3.findViewById(R.id.icon);
       
        TextView tv_1 = (TextView)View_1.findViewById(R.id.text);
        TextView tv_2 = (TextView)View_2.findViewById(R.id.text);
        TextView tv_3 = (TextView)View_3.findViewById(R.id.text);
        tv_1.setText("aaa");
        tv_2.setText("bbb");
        tv_3.setText("ccc");
       
        aaa_TabSpec.setIndicator(View_1);
        aaa_TabSpec.setContent(new Intent(this,test_activity.class)); 
        bbb_TabSpec.setIndicator(View_2);
        bbb_TabSpec.setContent(new Intent(this,test_activity.class)); 
        ccc_TabSpec.setIndicator(View_3);
        ccc_TabSpec.setContent(new Intent(this,test_activity.class)); 
       
       /** 탭을 TabHost 에 추가한다 */
        m_tabHost.addTab(aaa_TabSpec);
        m_tabHost.addTab(bbb_TabSpec);
        m_tabHost.addTab(ccc_TabSpec);
       
        m_tabHost.getTabWidget().setCurrentTab(0); 
    }
}

- tapview_custom_layout.xml
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:orientation="vertical">
 <TabHost
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:id="@android:id/tabhost">
  <LinearLayout
    android:id="@+id/LinearLayout01"
   android:orientation="vertical"
   android:layout_height="fill_parent"
   android:layout_width="fill_parent"> 
   <FrameLayout
    android:id="@android:id/tabcontent"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:layout_weight="1">
   </FrameLayout> 
 
    <TabWidget
    android:id="@android:id/tabs"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" >
   </TabWidget>
  </LinearLayout>
 </TabHost>

</LinearLayout>


- tab_row_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/LinearLayout01"
 android:orientation="vertical">
 <ImageView
  android:id="@+id/icon"
  android:layout_width="33dip"
  android:layout_height="30dip"
  android:layout_marginTop="3dip"
  android:scaleType="fitXY"
  android:layout_gravity="center"
  android:background="@drawable/icon" >
 </ImageView>
 <TextView
  android:id="@+id/text"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:layout_marginLeft="5dip"
  android:layout_marginRight="5dp"
  android:textSize="15dip"
  android:layout_gravity="center" />

</LinearLayout>


- tab_1_bg.xml
('res - drawable' folder, create a file in)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:state_selected="true"
  android:drawable="@drawable/color_green"/>

 <item
  android:state_pressed="true"
  android:drawable="@drawable/color_yellow"/>

 <item
  android:state_focused="false"
  android:drawable="@drawable/color_white"/>
</selector>


- tab_2_bg.xml
('res - drawable' folder, create a file in)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:state_selected="true"
  android:drawable="@drawable/color_green"/>

 <item
  android:state_pressed="true"
  android:drawable="@drawable/color_yellow"/>

 <item
  android:state_focused="false"
  android:drawable="@drawable/color_white"/>
</selector>


- tab_3_bg.xml
('res - drawable' folder, create a file in)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:state_selected="true"
  android:drawable="@drawable/color_green"/>

 <item
  android:state_pressed="true"
  android:drawable="@drawable/color_yellow"/>

 <item
  android:state_focused="false"
  android:drawable="@drawable/color_white"/>
</selector>


In addition, inquiries, or questions, please contact us.
(joonryang@gmail.com)