Android 안드로이드2014. 11. 24. 16:39

안드로이드 허니콤 API 11 이상에서 actionbar를 바로 사용할 수 있다. 그러나 안드로이드 API버전 11미만에서 액션바를 사용하려면 몇 가지 작업이 필요하다.


import android.support.v7.app.ActionBarActivity;

import android.support.v7.app.ActionBar;


그리고 Activity는 ActionBarActivity를 상속받는다.

public class MyActivity extends ActionBarActivity { } 로 고친다.


....


액션바를 사용하려고 위 임포트 구문을 먼저 코드 앞머리에 두었다.

그리고 android-support-v7-appcompat를 임포트 했다. 

그랬더니....


[2014-11-24 16:09:17 - google-play-services_lib] Unable to resolve target 'android-9'

[2014-11-24 16:10:12 - android-support-v7-appcompat] E:\JavaAndroid\adt-bundle-windows-x86-20140702\sdk\extras\android\support\v7\appcompat\res\values-v21\styles_base.xml:75: error: Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.ActionButton'.

............

.......

....


위와 같은 에러가 주르륵 나왔다.

아직 해결법을 찾지 못했다.

다만 구글링을 하면서 를 http://stackoverflow.com/questions/18293088/adding-support-libraries-to-android-project 를 발견했다.


이쯤에서 말하고 넘어가야할 중요한 점은 위 에러가 지금 진행중인 프로젝트에서 발생한 것이 아니다. 구글에서 만든 안드로이드 android-support-v7-appcompat 라이브러리에 빨간바탕에 흰색 X마크가 붙으면서 에러가 뜬다. 구글로 해결책을 찾아보니 대부분 minSdkVersion, targetSdkVersion를 낮추거나 높이거나와 같은 답변 일색이다. 영어가 짧은 나로서는 그렇게 이해했다. 프로젝트에 생긴 에러가 아니고 추가한 라이브러리에 뜨는 오류임을 이해못 한 답변이 많다.


갈길이 앞으로 창창 대로다?. 아스팔트나 꽃길까지는 아니라도 신작로는 될줄 알았다. 지원(서포트 support) 라이브러리를 깔자 마자 뜨는 에러! 불과 몇일 전에 안드로이드 SDK도 업데이트했었다.


....

........


2시간 정도 시간과 시간을 보내고 에러를 사라지게 만들었다. 해결이라고 보기에는 언어적으로 어폐다. 폴더를 뒤적거려 ADT를 업데이트하기 전 appcompat_v7 폴더를 찾아내 프로젝트뷰에 임포트했기 때문이다. 이클립스 프로젝트뷰에는 appcompat_v7 대신 android-support-v7-appcompat로 표시가 된다. 당분간은 Unable to resolve target 'android-9'과 같은 에러가 아래로 죽 뜨지 않는 appcompat_v7를 잘 보관해두는 쪽으로 가닥을 잡았다.

Posted by 코드버무려
Android 안드로이드2014. 11. 24. 14:18

















public class CustomView extends View {

private Path drawPath;


  //커스텀뷰를 만들 때 Paint 객체는 두개가 필요하다.

  //하나는 drawBitmap()함수에 인자로 넣는 mBitmapPaint.

  //두번째는 나머지 모든 그릴 위치에 쓰일 drawPaint다.

private Paint drawPaint, mBitmapPaint;  //커스텀뷰를 만들 때 Paint 객체는 두개가 필요하다.

private Canvas mCanvas;

private Bitmap mBitmap;

int iDisplayWidth, iDisplayHeight;

public MemoingView(Context context, AttributeSet attrs){

   super(context, attrs);    

      

//현재 화면의 크기를 구할 때 사용

   Display display=((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

   iDisplayWidth = display.getWidth();

   iDisplayHeight = display.getHeight();

   

   

    drawPath = new Path();

   

    drawPaint = new Paint();    

    drawPaint.setAntiAlias(true);

    drawPaint.setColor(0xffff0000);

    drawPaint.setStyle(Paint.Style.STROKE);

    drawPaint.setStrokeJoin(Paint.Join.ROUND);

    drawPaint.setStrokeCap(Paint.Cap.ROUND);

   

    mBitmapPaint = new Paint(Paint.DITHER_FLAG);

 

    mBitmap = Bitmap.createBitmap(iDisplayWidth, iDisplayHeight, Bitmap.Config.ARGB_8888);

    mCanvas = new Canvas(mBitmap);

}


    

    @Override

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

    super.onSizeChanged(w, h, oldw, oldh);

    }

    


    

    @Override

    protected void onDraw(Canvas canvas) {

    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);    

    canvas.drawPath(drawPath, drawPaint);

 

    }    

    

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    float touchX = event.getX();

    float touchY = event.getY();

   

    switch (event.getAction()) {

    case MotionEvent.ACTION_DOWN:

       drawPath.moveTo(touchX, touchY);

       break;

    case MotionEvent.ACTION_MOVE:

       drawPath.lineTo(touchX, touchY);

       break;

    case MotionEvent.ACTION_UP:

    drawPath.lineTo(touchX, touchY);

       mCanvas.drawPath(drawPath, drawPaint);

       drawPath.reset();

       break;

    default:

       return false;

    }

   

    invalidate();

    return true;

    }





Posted by 코드버무려
Android 안드로이드2014. 11. 22. 10:27

복사 붙여넣기

카피앤드파스트

평소 붙여넣기 빠르게 하고자 여기에 만들어서 등록.



ClipboardManager mClipboardManager;
mClipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);


String getTextFromClipboard(){
if(IsDebugging) Log.d(TAG, "getTextFromClipboard()");

String strPasted = null;
ClipData clipData = mClipboardManager.getPrimaryClip();

if(!(mClipboardManager.hasPrimaryClip())){
Toast.makeText(this, "hasPrimaryClip()", Toast.LENGTH_SHORT).show();

} else if (!(mClipboardManager.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))) {
Toast.makeText(this, "pcd()", Toast.LENGTH_SHORT).show();

ClipData.Item item = clipData.getItemAt(0);
strPasted = item.getText().toString();
} else {
Toast.makeText(this, "pt()", Toast.LENGTH_SHORT).show();

ClipData.Item item = clipData.getItemAt(0);
strPasted = item.getText().toString();
}

return strPasted;
}



CPCEditText et = (CPCEditText) findViewById(R.id.et_sourcetext);
et.setText(mSourceText);
et.setOnCCPListener(new CPCEditText.OnCCPListener() {
@Override
public void onCut() {
if(IsDebugging) Log.d(TAG, "onCut()");
if(IsDebugging) Toast.makeText(mStaticContext, "onCut()", Toast.LENGTH_SHORT).show();
}

@Override
public void onCopy() {
if(IsDebugging) Log.d(TAG, "onCopy()");
if(IsDebugging) Toast.makeText(mStaticContext, "onCopy()", Toast.LENGTH_SHORT).show();
}

@Override
public void onPaste() {
if(IsDebugging) Log.d(TAG, "onPaste()");
if(IsDebugging) Toast.makeText(mStaticContext, "onPaste()", Toast.LENGTH_SHORT).show();

String strPasted = getTextFromClipboard();

insertSomeText(strPasted);
}
});



Posted by 코드버무려
Android 안드로이드2014. 11. 22. 10:10

안드로이드 스튜디오

안드로이드스튜디오

안드로이드스투디오

안드로이드스튜이도

android studio

androidstudio


안드로이드 스트디오를 깔고 실행해 본 느낌은 좋다라는 인상이다. 실행해서 키보드 타입이 가능한 에디터 창이 뜰 때 까지 시간이 좀 오래걸렸다. 이 부분에서는 이클립스만큼 빠르지 못했고 최적화가 더 필요해 보인다.


안드로이드 스튜디오에 물리디바이스를 물렸다. 프로젝트 템플릿으로 제공하는 몇 가지를 만들고 스마트폰에 올렸다. 이상없이 작동했다.


AVD를 켜고 컴파일해서 실행하니 에러가 났다. 런타임오류다. AVD에 올려놓은 기존 앱을 실행했더니 실행오류가 발생했다. 이클립스에서 만들어 놓은 AVD를 android studio에 열어서 생기는 문제 같다. 피씨를 끄고 이클립스를 통해서 AVD를 돌리니 잘 돌아갔다.


AVD는 안드로이드 스트디오에 맞는 것으로 새로 만들어야 하나보다!!!


구글링으로 정말 그런 것인지 찾아보지 않았으나 지금으로서는 여기까지가 추측할 수 있는 단계다. 안드로이드스투디오 비하여 이클립스는 속도가 빠르고 가벼웠음을 새삼 발견했다. 그러나 eclipse에서는 잔가지 오류를 익숙하지 못하면 접할 수 있다. 그 내용은 여기서 ( http://santerminal.tistory.com/entry/sdfa-1 ) 볼 수 있다. 조금만 손을 더 보면 될 것 같은데 Google는 이클립스와 ANT 개선을 중지하고 Android Studio와 Gradle로 간다고 한다.


지금 안드로이드 스튜디오 모습은 내일 언제가는 더 가볍고 빨라질 것이다. 구글 힘이 밀고있으니까.

Posted by 코드버무려
Android 안드로이드2014. 11. 21. 07:50


역코드난독화 

코드 난독화 

proguard 

역난독화 

dex2jar Jad 

자바디컴파일러 

classes.dex Dalvik 

DeObfuscate 

Obfuscate  

Obfuscation  

DeObfuscation



안드로이드 앱을 작성하고 업로드하면서 이 번에 코드 난독화에 대하여 생각해보았다.


3개월 이상 시간이 흘렀다. 개괄적인 형태로 살이 붙지 않는 앱이라 넓게 내놓기에는 다듬어야 할 부분이 많지만 기본은 다 갖춘 앱이다. 지금까지는 코드 난독화가 불필요했지만 이제는 심도있게 생각해볼 때 이다. 그래서 만들어 놓은 apk파일을 역코드난독화 했더니 일부 에러를 빼고는 그대로 나왔다. 역난독화를 처음 시도해보는 것이라 에러가 나왔으나 경험자가 했으면 100% 나왔으리. 이클립스에 안드로이드 개발툴 ADT가 제공하는기본적인 proguard도 적용하지 않았다. 지금부터는 적용하고 업하는 쪽으로 정책을 잡았다.


만들어놓은 코드를 난독화 해제하는 과정이다. 다음에 반복할 일을 간단히 정리하였다.



dex2jar 

: Dalvik에서 작동하는 classes.dex 파일을 Class압축파일을 포함한 jar 파일로 변환

: https://code.google.com/p/dex2jar/downloads/list 



Jad : 자바디컴파일러 

http://varaneckas.com/jad/



디컴파일할 apk파일의 확장자를 zip으로 바꾸고 압축해제해서 classes.dex 파일을 얻는다.



콘솔 창에 d2j-dex2jar.bat classes.dex를 실행

또는 

콘솔 창에 dex2jar.bat classes.dex를 실행

같은 폴더에 classes-dex2jar.jar 파일이 생성된다.

# d2j-dex2jar.bat과 dex2jar.bat의 결과는 비슷하다. 사용해보고 에러가 적은 쪽을 택하자.




class파일을 사람이 읽고 이해할 수 있는 java 텍스트 파일로 만들자.

콘솔 창에 jad -o -sjava MainActivity.class를 실행



MainActivity.java가 생긴다. 텍스트 편집기로 열어서 읽고 편집할 수 있다.

Posted by 코드버무려