가끔씩 마주치게 되는 "OutOfMemoryError : bitmap size exceeds VM budget" 에러는 메모리 누수가 주요 원인입니다. 이와 관련된 링크를 모아봤습니다.


* 액티비티가 멈출 때 비트맵을 재활용(즉 GC)되게 하라

- bitmap 이미지인 경우 recycle() 호출
- onPause에서 수행하는게 좋음
- ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();

* 이미지를 미리 줄여서 읽어들여라

- BitmapFactory.Options.inSampleSize 활용

* Activity Context에 대한 참조(reference)를 오랫동안 유지하지 말아라

- Drawable.setCallback(null) 사용
- WeakReference를 가진 static 내부 클래스
- 이미지를 static 변수로 처리하지 마라

* 외부(outer) 클래스의 상태에 의존하지 않는 내부(inner) 클래스는 static으로 선언하라
- 내부클래스는 외부 클래스 인스턴스를 크게 만들며 또한 외부클래스 객체가 필요이상으로 오래 살아있게 되어 메모리를 더 차지할 수 있음
- 외부클래스의 상태 필드에 접근하지 않는(즉 외부 객체의 상태에 의존하지 않는) 내부클래스는 static으로 선언

* Attacking memory problems on Android
Posted by 90002

안드로이드 Paint


Paint 상속 계층도

java.lang.Object

└─ android.graphics.Paint


Paint의 하위 클래스들

TextPaint


Paint 은 머야?

그리기(Draw)하기위해 쓰여지는 도구 라고 생각하시면 됩니다.

쉽게 말해 Canvas가 도화지라면 Paint는 붓이라고 생각하시면 좋을듯 합니다.

도화지에 그림을 그릴때 우리들은 여러가지 붓을 사용하여 효과를 줍니다.

붓을 굵기, 색상, 모양등을 선택해서 원하는 형태로 그릴수 있는 것이죠.


Paint 에서 사용되는 메소드

  1. set(Paint src)

    - 매개변수로 받은 Paint로 설정합니다.


    setARGB(int a, int r, int g, int b)

    - Paint의 투명도 및 색상을 설정 합니다.


    setAlpha(int a)

    - Paint의 투명도 설정을 합니다.


    setAntiAlias(boolean aa)

    - Paint의 경계면을 부드럽게 처리할지 설정합니다.


    setColor(int color)

    - Paint의 색상 설정 합니다.


    setStrokeCap(Paint.Cap cap) - 선의 끝나는 지점의 장식을 설정합니다.

    BUTT : 그 정해진 위치에서 끝납니다.

    ROUND : 둥근 모양으로 끝이 장식됩니다.

    SQUARE : 사각형 모양이며, 해당 좌표보다 조금더 길게 그려 집니다.

    setStrokeJoin(Paint.Join join) - 선의 끝 모양을 설정합니다.

    MITER : 모서리를 각진 모양으로 만듭니다.

    BEVEL : 모서리가 둥글게 살짝 깍인 모양으로 만듭니다.

    ROUND : 모서리를 둥근 모양으로 만듭니다.

    setStrokeMiter(float miter)

    - 0 이상의 값을 설정, 뽀족한 정도를 설정(각도단위)


    setStrokeWidth(float width)

    - Paint의 굵기를 설정 합니다.


    setStyle(Paint.Style style) - Paint 스타일을 설정 합니다.

    FILL : 색상이 채워지고 테두리는 그려지지 않습니다.

    FILL_AND_STROKE : 채우기와 테두리가 모두 그려집니다

    STROKE : 채우기 없이 테두리만 그려집니다.


    setTextAlign(Paint.Align align)

    - 해당 Paint의 글자 정렬을 설정 합니다.


    setTextScaleX(float scaleX)

    - 텍스트페인트의 수평scale factor 를 설정합니다.


    setTextSize(float textSize)

    - Paint의 글자 크기를 설정합니다.


    setTextSkewX(float skewX)

    - Paint의 수평으로 기울어진 정도를 설정합니다.


    setTypeface(Typeface typeface)

    - Paint의 글꼴을 설정 합니다.


    setUnderlineText(boolean underlineText)

    - Paint의 글자에 밑줄 설정을 합니다.


    setColorFilter(ColorFilter filter)

    - RGB를 이용하여 paint에 변화를 줍니다. 이것은 Alpha를 무시 합니다.

    setMaskFilter(MaskFilter maskfilter)

    - 모서리에 알파채널을 이용하여 효과를 설정합니다.


    setPathEffect(PathEffect effect)

    - 그리는 방법을 제어 합니다.(도형의 모서리, 윤곽선등)


    setShader(Shader shader)

    - 솔리드에 색상을 설정해 줍니다. 그라디언트등


    setXfermode(Xfermode xfermode)

    - 이미 그려진 곳에 새로 그리는 기법입니다.

 

 

출처:http://jwandroid.tistory.com/182#recentTrackback 


Posted by 90002

 

안드로이드 Matrix 함수 확대 축소 회전 비틀기 이동 뒤집기

Matrix.postScale(float x, float y) // 확대, 축소

Matrix.postRotate(float degrees) // 이미지 회전

Matrix.postSkew(float sx, float sy) // 이미지 비틀기

Matrix.postTranslate(floatdx, float dy) // 이미지 이동

Matrix.postScale()을 이용하면 이미지의 확대/축소 뿐만 아니라 이미지를 수직이나 수평으로 뒤집기.

Matrix.postScale(-1, 1) // 수평으로 뒤집기

Matrix.postScale(1, -1) // 수직으로 뒤집기

Matrix.postScale(-1, -1) // 수평, 수직 뒤집기 Matrix.postRotate(180)과 같은 결과

Matrix matrix = new Matrix(); // 새로운 Matrix를 만들고

matrix.postScale(-1, 1); // 수평으로 뒤집기

bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, w, h, matrix, false); // 새로운 비트맵 생성

Posted by 90002

[안드로이드] 이미지 회전하기

안드로이드에서 이미지를 호출하여 회전하는 방법을 소개한다.
해당 소스코드는 직접작성한 것은 아니고, anddev.org 사이트에서 검색해서 얻은 결과이다.
매트릭스를 이용하여 이미지를 회전시키고 있다.

아래를 참조해 보세요.

package com.google.android.bmptest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.graphics.*;
import android.graphics.drawable.*;
import android.view.*;

public class bmptest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) { 
super.onCreate(icicle); 
LinearLayout linLayout = new LinearLayout(this);

// load the origial BitMap (500 x 500 px) 
Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), 
R.drawable.fedor); //미리 해당 폴더에 이미지 파일이 있어야 한다. fedor.jpg

int width = bitmapOrg.getWidth(); 
int height = bitmapOrg.getHeight(); 
int newWidth = 200; 
int newHeight = 200; 

// calculate the scale - in this case = 0.4f 
float scaleWidth = ((float) newWidth) / width; 
float scaleHeight = ((float) newHeight) / height; 

// create a matrix for the manipulation 
Matrix matrix = new Matrix(); 
// resize the bit map 
matrix.postScale(scaleWidth, scaleHeight); 
// rotate the Bitmap 
matrix.postRotate(45); 

// recreate the new Bitmap 
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
width, height, matrix, true); 

// make a Drawable from Bitmap to allow to set the BitMap 
// to the ImageView, ImageButton or what ever 
BitmapDrawable bmd = new BitmapDrawable(resizedBitmap); 

ImageView imageView = new ImageView(this); 

// set the Drawable on the ImageView 
imageView.setImageDrawable(bmd); 

// center the Image 
imageView.setScaleType(ImageView.ScaleType.CENTER); 

// add ImageView to the Layout 
linLayout.addView(imageView, 
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT 
) 
); 

// set LinearLayout as ContentView 
setContentView(linLayout); 
}
}


결과는 아래와 같다.


 

출처: http://hyena0.tistory.com/292 

Posted by 90002

1. manifesto


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

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

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




2. src


public class main extends Activity {

TextView text;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

text = (TextView)findViewById(R.id.text);

//////////////////////Bitmap 외부에 저장//////////////////////////

Bitmap screenshot = BitmapFactory.decodeResource(getResources(), R.drawable.a1);

String filename = "a1.png";

File f = new File(Environment.getExternalStorageDirectory(), filename);

try {

f.createNewFile();

OutputStream outStream = new FileOutputStream(f);

screenshot.compress(Bitmap.CompressFormat.PNG, 100, outStream);

outStream.close();

} catch (IOException e) {

e.printStackTrace();

}

Uri bitmapURI = Uri.fromFile(f); // <- file:///~ 형태의 URI

String filePath = bitmapURI.getPath();

//////////////////////Bitmap 외부에 저장/////////////////////////////

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,

Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); // <- 미디어스토어에 인식시킴.

Cursor c = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null,

"_data = '" + filePath + "'", null,null); // <- _data컬럼에서 "file:///~" 형태의 filePath와 같은 Row를 받아옴.

c.moveTo!First();

int id = c.getInt(0); // <- Row에서 첫번째 컬럼인 ID를 얻음.

Uri uriF = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); // <- content://~ 형태의

URI로 만듬.

Intent intent3 = new Intent(Intent.ACTION_ATTACH_DATA); // 주소록에 사진붙이기 인텐트 발동!

intent3.setData(uriF); // 인텐트에 Bitmap URI 첨부

startActivity(intent3);

text.setText("OK");

}

}

출처 : http://blog.daum.net/yldot/7703384

Posted by 90002
private LinearLayout layout;
private Button button;
private ImageView image;

private int REQ_IMAGE_SELECT= 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

layout = new LinearLayout(this);
button = new Button(this);
image = new ImageView(this);

layout.setOrientation(LinearLayout.VERTICAL);

button.setText("열기");
button.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,50));
button.setOnClickListener(this);

image.setLayoutParams(new LinearLayout.LayoutParams(200,200));

setContentView(layout);
layout.addView(image);
layout.addView(button);

}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v==button){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent ,REQ_IMAGE_SELECT);
}
}
protected void onActivityResult(int requestCode, int resultCode,Intent data){
if(resultCode == Activity.RESULT_OK){
try{
Uri uri = data.getData();
image.setImageURI(uri);
}
catch(Exception e){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent ,REQ_IMAGE_SELECT);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}

 

출처:http://www.androidside.com/plugin/mobile/board.php?bo_table=B49&wr_id=42333 

 

Posted by 90002

안드로이드 달력을 만드는데 도움이 될것 같다. 버튼을 동적으로 만들수 있다는것은 참으로 유용하다. 저것을 xml로 작업하려면 버튼 30개를 만들어야되고 button선언을 30번을 해야한다. 수정해야 될 사항이 생길경우 30군대를 찾아 고처야 한다. 그래서 버튼을 동적으로 만들었다. 간단하다. 뒤에 리니어 레이아웃 5개를 배치하고 그냥 버튼만들어서 넣었다. 물론 이벤트도 30개에 한번에 넣을수 있다.

역시 자바에 불가능이란 없는것 같다. 코드는 이러하다.

public void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
 

  setContentView(R.layout.main);
 
  LinearLayout linear1 = (LinearLayout) findViewById(R.id.linearLayout1);
  LinearLayout linear2 = (LinearLayout) findViewById(R.id.linearLayout2);
  LinearLayout linear3 = (LinearLayout) findViewById(R.id.linearLayout3);
  LinearLayout linear4 = (LinearLayout) findViewById(R.id.linearLayout4); 
  LinearLayout linear5 = (LinearLayout) findViewById(R.id.linearLayout5);
 

  Button btn[] = new Button[30];
  for (int i = 0; i < btn.length; i++) {
   btn[i] = new Button(this);
   btn[i].setText("" + (i + 1));
   btn[i].setWidth(66);
   btn[i].setTextSize(11);
   btn[i].setId(i);
   if (i < 7) {
    linear1.addView(btn[i]);
   } else if (i < 14) {
    linear2.addView(btn[i]);
   } else if (i < 21) {
    linear3.addView(btn[i]);
   } else if (i < 28) {
    linear4.addView(btn[i]);
   } else {
    linear5.addView(btn[i]);
   }
   btn[i].setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     Toast.makeText(ThreadAndroidActivity.this,(v.getId()+1)+ "일!",
       Toast.LENGTH_SHORT).show();
    }
   });
  }
 }


 

레이아웃 선언은 별것 없다. 버튼도 그냥 배열로 만들어서 넣어 버리기만 하면 된다. 엄청 간단한 예이다. 그런데 여러군대 검색을 해도 이런 예제는 없어서 생각을 해보려하니 나의 멍청 머리는 회전을 하지 않았따. ㅠㅠㅠㅠ 계속 삽질끝에 만들어서 올려본다.

어떻게 저것으로 달력을 만드나. 왼쪽 오른쪽 버튼을 넣고 가운대에 월을 표시한다. 그리고 버튼 배치를 가운대에 숫자에 따라 동적으로 바꾼다. 그럼 달력을 완성할수 있다. 달력에 일정을 넣고 싶다면 버튼 이벤트에 intent를 선언해서 다음 일정 입력하는 엑티비티를 만들고 넘겨서 일정을 입력하고 디비에 저장한후........... 하아.....이것저것 생각하려니 골치 아프다. 그냥 그만!

http://blog.naver.com/dhrod0325?Redirect=Log&logNo=140145234311

Posted by 90002

<script type="text/javascript"><!--
google_ad_client = "ca-pub-1261983873465389";
/* 글 제일 위에 */
google_ad_slot = "2059623354";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

이번에 안드로이드 스터디를 진행하면서, 과제가 주어졌다. " 모든 작업은 JAVA로만 구현해오세요. "
어차피 대부분 기능은 자바로 구현되니 쉽게 찾아보면서 할수있겠지.... 했는데, 아무리 서적을 뒤져봐도 JAVA 만을 이용한 안드로이드 코드방식에 대해 설명한 책은 없었다.
일부 책에서 약간의 언급을 해줬지만, 순수 JAVA 코드로만 짜는 것은 아주 간단한 프로그램만들때만 쓸 뿐, 큰 프로젝트를 진행하게 되면, 비효율적인 부분들이 많아서 쓰지 않는다. 라고 마무리 짓고 더이상의 설명은 찾아볼수가 없었다.
혹시나 저처럼 자료를 찾아다니는 분들이 있을까하여, 혼자서 구글링을 하며 배운 내용을 짧게나마 포스팅 남겨둡니다.


[ 안드로이드 최초 생성시 Activity_main.xml 의 구성 ]

[위의 Activity_main.xml 코드를 Java로 바꿨을 때 ]

처음보면 왜 서적에서 쓰지말라고하는지, 이해가 갈수도...

그런데 막상 알고보면 별거 없습니다. 천천히 살펴보죠.

RelativeLayout rlRelativeLayout = new RelativeLayout(ctCtex);
xml에서 최초 <RelativeLayout... 으로 설정하고 코드 작성을 시작합니다.
마찬가지로 java 코드에서도 RelativeLayout 을 할당해서 컨텍스트(Context)를 연결해줍니다.



RelativeLayout.LayoutParams lpRelativeLayout_Property = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
);

다음 레이아웃의 속성을 지정해주기 위해, RelativeLayout.LayoutParams 를 사용합니다.
(LinearLayout 을 사용해서 만들었다면. LinearLayout .LayoutParams :: 해당 레이아웃에 맞는 Params를 가져옵니다. )
xml에서 android:layout_width / heigth 를 지정해주는 것처럼 RelativeLayout.LayoutParams 에서 인자로 넓이 / 높이 를 받게 됩니다.


[ 이해 하시리라 믿겠습니다 . . . ㅡ 3 - ]


rlRelativeLayout.setLayoutParams( lpRelativeLayout_Property )
중요! 레이아웃 설정만 해서 끝나는것이 아닙니다. 속성 지정이 끝나면, setLayoutParams 를 이용하여, 설정값을 세팅한 변수를 입력해서, 세팅하고자하는 레이아웃에게 넘겨줘야됩니다.


이제 RelativeLayout 의 크기 설정이 끝났다.
다음 Layout 안에 들어갈 뷰를 생성해보자.

TextView tvText = new TextView(ctCtex);
위에 설명한 레이아웃 생성방식과 동일합니다. new 를 통해서 객체 생성과 동시에 인자로 컨텍스트를 넘겨줍니다.


RelativeLayout.LayoutParams lptvText_Property = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
lptvText_Property.addRule(RelativeLayout.CENTER_VERTICAL);
lptvText_Property.addRule(RelativeLayout.CENTER_HORIZONTAL);

마찬가지로 레이아웃에서 설정하던 방식과 동일합니다. 눈여겨 볼점은 addRule 이라는 함수부분 입니다.

[Reference ]
.addRule(int verb); or .addRule(int verb, int anchor);

기본적으로 LayoutParams의 인자로 바로 설정 가능한 값은 w / h (Width 와 Height) 값 밖에 없습니다.
xml에서 android:layout_centerHorizontal 과 같이 부가적인 설정 변경은 addRule을 통해 이뤄지게 됩니다.


addRule 을 이용한 설정 몇가지만 간략하게 설명해뒀으니 참고하시길...

더보기



tvText.setText(R.string.hello_world);
텍스트 뷰에 텍스트를 입력하는 부분입니다.
인자로 텍스트 저장 부분의 id 를 넘겨줘도 되고, 아래 처럼 직접 써줘도 됩니다.
위 코드에서는 xml과 똑같이 비교하기 위해 아이디를 연결해줬습니다. XML 코드없이 만들기 위해선 직접 입력해줘야겠죠??

tvText.setText("Hello World"); 문자열을 직접 입력해서 넣어줘도 됨.





rlRelativeLayout.addView(tvText);
텍스트 아까전에 속성을 추가해주는 setLayoutParams 처럼 역시 중요한 부분입니다.
사실 간단하면서 당연한부분인데, 중요하다고 하는 점은 쉽게 지나칠수 있다는 점 때문입니다.
xml 에선 < /> 안에 넣으면 자동으로 안에 포함되기때문에 java로 짜다보면 추가해주는 걸 자꾸 깜빡하는 경우가 많습니다.
(저... 저만 그럴수도...)




setContentView(rlRelativeLayout);
xml 코드에서보면 Activity_main.xml 의 주소값을 setContentView의 인자로 집어넣어서 사용합니다.
마찬가지로 위에서 설정된 값을 모두 가지는 레이아웃을 인자로 집어 넣어주게 되면, 최초 안드로이드 예제와 똑같은 결과를 얻을수 있게 됩니다.

http://dark0946.tistory.com/119

<script type="text/javascript"><!--
google_ad_client = "ca-pub-1261983873465389";
/* 글 아래 */
google_ad_slot = "3536356550";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

Posted by 90002

Android APK 파일을 디컴파일 decompile

* 안드로이드을빨리이해하기위한방법

1. OpenSource활용

- http://code.google.com/hosting/

- http://google.com/codesearch

2. Reverse Engineering 활용하여 학습하기

- 자바 클래스 리버싱

- 안드로이드 실행파일 구조와 리버싱

* APK파일 디컴파일(Decompile)하는 방법

1. 디컴파일을 위한 툴 설치

1.ApkTool

- 다운로드 : http://code.google.com/p/android-apktool/downloads/list

- 압축풀기 : android-sdk가 설치된 platform-tools디렉토리안에 apktool디렉토리를 만들어 압축을 푼다.

apktool1.4.1.tar.bz2

apktool-install-windows-r04-brut1.tar.bz2

2.Dex2Jar

- 다운로드 : http://code.google.com/p/dex2jar/downloads/list


- 압축풀기 : android-sdk가 설치된 platform-tools디렉토리안에 dex2jar디렉토리를 만들어 압축을 푼다.

dex2jar-0.0.7.10-SNAPSHOT.zip

3.Java Decompiler

- 다운로드 : http://java.decompiler.free.fr/?q=jdgui

- 압축풀기 : 실행하기 편한 곳에 압축을 풀어 놓는다.

2. 환경변수 잡기

- adb, apktool, dex2jar 명령어를 사용하기 위한 환경변수를 잡는다.

%ANDROID_SDK%\platform-tools

%ANDROID_SDK%\platform-tools\apktool

%ANDROID_SDK%\platform-tools\dex2jar

3. apk 파일 추출

- 폰에 설치된 모든 패키리를 리스트로 보인다.

- 리스트 중에 디컴파일 할 APK파일을 정한다.

- APK파일을 추출한다. (adb shell을 종료 후 수행한다.)

4. ApkTool 실행 (java파일 외 xml, image, db등을 추출할 수 있다.)

- apktool 명령어를 사용하여 apk파일에 있는 파일을 디코딩하여 out폴더에 내보낸다.

- xml파일을 열어 내용을 확인한다.

5. Dex2Jar 실행 (Java파일을 추출할 수 있다.)

- apk파일의 확장자를 zip으로 변경한다.

- 추출한 zip파일의 압축을 풀어 classes.dex 파일을 추출한다.

- Dex2Jar를 실행한다.

- Dex2Jar를 실행하면 아래 jar파일이 생긴다.

6. JD-GDI 실행

- JD-GDI실행하여 classes.dex.dex2jar파일을 열어 소스를 분석한다.

7. Enterprise Architect를 이용하여 클래스 다이어그램으로 분석한다.

- 다운로드 : http://www.sparxsystems.com.au/products/ea/trial.html

- 설치

- 실행

- Java Decompiler에서 open할 파일을 추출한다.

- zip파일을 압축을 푼다.

- Enterprise Architect에서 classes.dex.dex2jar.src디렉토리를 import 한다.

- 클래스 다이어그램을 보고 분석한다.

-----------------------------------------------------------------------------------------------------------------------

제 11회 한국자바개발자 컨퍼런스에서 트랙1, 3번째 세션에서 Reverse Engineering, 안드로이드 학습이란 주제로 발표를 진행합니다.

리버싱이 무엇인지, 안드로이드 리버싱을 통해서 어떻게 학습을 할 수 있는지 다양한 도구와 팁들을 소개합니다.

학습을 목적으로 리버스엔지니어링이 허용되지만 기술을 복제 유혹을 받을 수도 있습니다.

법적이나, 윤리적으로 문제가 된다는 것을 명심하고, 공부한 내용을 서로 공유하며 미소 지을 수 있는 개발문화가 되길 바래봅니다. :D

발표자료와 함께 사용된 동영상 공유합니다.

발표자료 : Reverse Engineering, 안드로이드 학습

자바 클래스 리버싱

안드로이드 실행파일 구조와 리버싱

Reverse Engineering 활용한 학습 예제

  1. 분석할 앱선정과 APK 파일 추출
  2. 디컴파일 후 분석
  3. 클래스 다이어그램으로 - Enterprise Architect
  4. 의존성 검사를 통해 쉽게 - xDepend

http://blog.naver.com/PostView.nhn?blogId=man8408&logNo=110111707630

Posted by 90002

<script type="text/javascript"><!--
google_ad_client = "ca-pub-1261983873465389";
/* 글 제일 위에 */
google_ad_slot = "2059623354";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

사용자정의 다이얼로그. 즉, Custom Dialog에 대해 알아보도록 하겠습니다.

말 그대로 다이얼로그의 띄워줄 모양을 개발자가 정한대로 보여줄 수 있는 다이얼로그 입니다.

버튼과 텍스트뷰를 배치한 후 버튼 클릭 시 가운데 화면과 같은 다이얼로그를 띄워줍니다.

다이얼로그의 해당하는 입력란에 입력 후 확인버튼을 클릭하면 그 값을 텍스트뷰에 보여주는 형식의 프로그램입니다.

=============================================

Project Name : CustomDialog

Package Name : kidsbear.customdialog

android version : 2.2 (8)

java version : jdk 1.6

=============================================




1. res > layout > main.xml 파일을 작성합니다.

간단히 버튼과 텍스트뷰 1개씩을 배치하였고, 버튼 클릭 시 mOnClick() 메소드를 호출하도록 설정하였습니다.

2. res > layout > dialoglayout.xml 파일을 생성/작성합니다.

위와 같은 모양의 레이아웃을 작성합니다.

이 레이아웃은 다이얼로그 안에 보여줄 레이아웃입니다.

어려운것은 없으니 자세한 것은 아래 소스를 통해 확인하시기 바랍니다.



3. CustomDialogActivity.java 파일을 작성합니다.

1) 필요한 변수를 전역변수로 설정해 줍니다.



2) onCreate() 메소드입니다.

LayoutInFlater 객체와 텍스트뷰을 참조한 객체를 생성해줍니다.



3) 버튼 클릭 이벤트 발생 시 호출될 mOnClick() 메소드를 작성합니다.

showDialog() 메소드를 통해 다이얼로그를 생성/호출 합니다.



4) onCreateDialog() 메소드를 오버라이딩합니다.

LayoutInflater의 inflate() 메소드를 통해 우리가 만든 dialoglayout 레이아웃을 인플레이트하여 LinearLayout 객체를 생성합니다.

위에서 인플레이트한 레이아웃을 인수로 setView() 메소드를 통해 다이얼로그의 내부로 보이도록 설정합니다.

setView(View v) 메소드는 인수로 View 객체를 받기 때문에 우리가 만들 수 있는 거의 모든 레이아웃을 적용할 수 있습니다.

확인 버튼 클릭 시 LinearLayout의 위젯들을 참조한 후 값을 추출/가공하여 텍스트뷰에 보여주게 됩니다.

http://blog.naver.com/PostView.nhn?blogId=kittoboy&logNo=110133839293

<script type="text/javascript"><!--
google_ad_client = "ca-pub-1261983873465389";
/* 글 아래 */
google_ad_slot = "3536356550";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

Posted by 90002
이전버튼 1 이전버튼

블로그 이미지
90002

공지사항

Yesterday2
Today5
Total125,405

최근에 달린 댓글

최근에 받은 트랙백

글 보관함