MMS는 좀 어려운데, 검색하면 PduParser 등을 이용해야 하는 걸로 많이 나오는데, 딸린 파일이 엄청 많다.

안드로이드 기본 소스에는 들어가있는 것처럼 나오던데, 이상하게 저 클래스를 쓸 수가 없더라.

그렇다고 17MB짜리 jar를 추가해서 쓰기도 좀 그렇고….

 

*LG G2에서는 MMS의 발신자 정보 들어있는 곳에 수신자 전화번호가 보여서 가져올 수가 없다.

출처 : http://susemi99.kr/664

apk 파일을 디컴파일을 해보고 싶은 마음이 생겼습니다.

개발할 어플이 있는데 좀 롤모델이 될만한 어플이 있어

한번 내부를 들여다 보고 싶었기 때문이죠

그래서 방법을 공유합니다.

일단 완전하게 빼낼수는 없는점 참고하세요

 

1. PC 상에서 디컴파일 하는 방법

pc 상에서 apk 파일을 가지고 디컴파일을 할수 있습니다.

우선 apk 파일을 빼내야 합니다.

apk 파일을 빼내는건 아주 쉽습니다.

구글 플레이에서 많은 어플들이 있는데요

그중에서도 난 아래 어플을 많이 사용하고 있습니다.

'앱 추출' 이라는 어플입니다.

사용방법은 너무 간단해서 따로 설명하지는 않겠습니다.

뺴낸 apk 파일을 컴퓨터로 옮깁니다.

이제 작업할 프로그램을 다운 받습니다.

경로가서 다운받아도 되고 첨부로 받아도 됩니다.

 

dex2jar : https://code.google.com/p/dex2jar/ => dex 파일을 jar 파일로 변환해주는 툴입니다

dex2jar.zip

 

 

JD-GUI : http://jd.benow.ca/ =>  java 디컴파일 툴입니다.

jd-gui-0.3.6.windows.zip

 

이제 준비는 완료

dex2jar 파일압축을 풀고 cmd 창을 열어 해당 경로로 이동합니다.

그리고 아래 처럼 명령어를 날립니다. remote 는 apk 파일 명칭입니다.

dex2jar.bat remote.apk

아 위명령어는 옛날버전이군요.. 다시 날립니다.

d2j-dex2jar remote.apk

작업이 끝나면 폴더에 아래처럼 jar 파일이 생성됩니다.

이제 jar 파일을 JD-GUI 툴로 보면됩니다.

jd-gui.exe 를 실행하고

jar 파일을 엽니다.

흠.. 역시 어플 만드는 사람들이 바보가 아니라서 디컴파일해도 알수없도록 되어있네요

하지만 내부 소스는 그대로 보이긴합니다. 참고용으로는 사용이 가능합니다. ^^

 

2. 핸드폰으로 어플을 통해 디컴파일 하는 방법

전 이 방법이 제일 편한것 같습니다.

apk 파일을 뺴낼필요가 없습니다. 그냥 어플만 다운받고 설치된 어플 중에 하나를 선택하면됩니다.

Show Java 라는 어플을 다운받습니다.

실행합니다.

전 지금 디컴파일 한게 많아서 그런데 최초에는 아무것도 없습니다.

오른쪽 하단의 + 버튼을 눌러  Pick from Installed 를 선택합니다.

그러면 설치된 어플을 쭉 찾아서 보여줍니다.

디컴파일 하고자 하는 어플을 선택합니다.

아래처럼 어떤 디컴파일러를 쓸꺼냐고 물어봅니다.

전 JeDX 0.6.1 을 자주 사용합니다.

선택하고 나면 아래처럼 나타나면서 디컴파일을 진행합니다.

디컴파일이 완료되었습니다.

위 PC 로 진행한것 보다 더 보기가 편한것 같습니다.

그런데 이걸 핸드폰으로 보면 의미가 없겠죠

상단의 공유 모양 버튼을 클릭합니다.

그러면 아래 그림처럼 열심히 공유하기 위한 준비를 합니다.

아마도 압축을 하는것 같습니다.

아래처럼 이제 공유하고자 하는 곳을 선택하게되면 디컴파일한 결과가 압축되어 전달됩니다.

그럼 PC 에서 해당 파일을 압축을 풀어서 보면 됩니다.

정말... 쉽습니다...

 

// 웹페이지 띄우기

Uri uri = Uri.parse("http://www.google.com");

Intent it  = new Intent(Intent.ACTION_VIEW,uri);

startActivity(it);

 

 

// 구글맵 띄우기

Uri uri = Uri.parse("geo:38.899533,-77.036476");

Intent it = new Intent(Intent.Action_VIEW,uri);

startActivity(it);

 

 

// 구글 길찾기 띄우기

Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=출발지주소&daddr=도착지주소&hl=ko");

Intent it = new Intent(Intent.ACTION_VIEW,URI);

startActivity(it);

 

 

// 전화 걸기

Uri uri = Uri.parse("tel:xxxxxx");

Intent it = new Intent(Intent.ACTION_DIAL, uri); 

startActivity(it); 

 

 

Uri uri = Uri.parse("tel.xxxxxx");

Intent it = new Intent(Intent.ACTION_CALL,uri);

// 퍼미션을 잊지 마세요. <uses-permission id="android.permission.CALL_PHONE" />

 

 

// SMS/MMS 발송

Intent it = new Intent(Intent.ACTION_VIEW);  

it.putExtra("sms_body", "The SMS text");  

it.setType("vnd.android-dir/mms-sms");  

startActivity(it); 

 

 

// SMS 발송

Uri uri = Uri.parse("smsto:0800000123");  

Intent it = new Intent(Intent.ACTION_SENDTO, uri);  

it.putExtra("sms_body", "The SMS text");  

startActivity(it); 

 

 

// MMS 발송

Uri uri = Uri.parse("content://media/external/images/media/23");  

Intent it = new Intent(Intent.ACTION_SEND);  

it.putExtra("sms_body", "some text");  

it.putExtra(Intent.EXTRA_STREAM, uri);  

it.setType("image/png");  

startActivity(it);

 

 

// 이메일 발송

Uri uri = Uri.parse("mailto:xxx@abc.com");

Intent it = new Intent(Intent.ACTION_SENDTO, uri);

startActivity(it);

 

 

Intent it = new Intent(Intent.ACTION_SEND);  

it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");  

it.putExtra(Intent.EXTRA_TEXT, "The email body text");  

it.setType("text/plain");  

startActivity(Intent.createChooser(it, "Choose Email Client")); 

 

 

Intent it = new Intent(Intent.ACTION_SEND);    

String[] tos = {"me@abc.com"};    

String[] ccs = {"you@abc.com"};    

it.putExtra(Intent.EXTRA_EMAIL, tos);    

it.putExtra(Intent.EXTRA_CC, ccs);    

it.putExtra(Intent.EXTRA_TEXT, "The email body text");    

it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");    

it.setType("message/rfc822");    

startActivity(Intent.createChooser(it, "Choose Email Client"));  

 

 

// extra 추가하기

Intent it = new Intent(Intent.ACTION_SEND);  

it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");  

it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");  

sendIntent.setType("audio/mp3");  

startActivity(Intent.createChooser(it, "Choose Email Client"));

 

 

// 미디어파일 플레이 하기

Intent it = new Intent(Intent.ACTION_VIEW);

Uri uri = Uri.parse("file:///sdcard/song.mp3");

it.setDataAndType(uri, "audio/mp3");

startActivity(it);

 

 

Uri uri = Uri.withAppendedPath(

  MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");  

Intent it = new Intent(Intent.ACTION_VIEW, uri);  

startActivity(it); 

 

 

// 설치 어플 제거

Uri uri = Uri.fromParts("package", strPackageName, null);  

Intent it = new Intent(Intent.ACTION_DELETE, uri);  

startActivity(it);

 

 

// APK파일을 통해 제거하기

Uri uninstallUri = Uri.fromParts("package", "xxx", null);

returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

 

 

// APK파일 설치

Uri installUri = Uri.fromParts("package", "xxx", null);

returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

 

 

// 음악 파일 재생

Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");

returnIt = new Intent(Intent.ACTION_VIEW, playUri);

 

 

// 첨부파일을 추가하여 메일 보내기

Intent it = new Intent(Intent.ACTION_SEND); 

it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 

it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3"); 

sendIntent.setType("audio/mp3"); 

startActivity(Intent.createChooser(it, "Choose Email Client"));

 

 

// 마켓에서 어플리케이션 검색

Uri uri = Uri.parse("market://search?q=pname:pkg_name"); 

Intent it = new Intent(Intent.ACTION_VIEW, uri); 

startActivity(it); 

// 패키지명은 어플리케이션의 전체 패키지명을 입력해야 합니다.

 

 

// 마켓 어플리케이션 상세 화면

Uri uri = Uri.parse("market://details?id=어플리케이션아이디"); 

Intent it = new Intent(Intent.ACTION_VIEW, uri); 

startActivity(it);

// 아이디의 경우 마켓 퍼블리싱사이트의 어플을 선택후에 URL을 확인해보면 알 수 있습니다.

 

 

// 구글 검색

Intent intent = new Intent();

intent.setAction(Intent.ACTION_WEB_SEARCH);

intent.putExtra(SearchManager.QUERY,"searchString")

startActivity(intent);

sendSMS(PhoneNum, message); // 번호와 메시지로 호출 하시면 됩니다.

 

    //---SMS 전송---
    private void sendSMS(String phoneNumber, String message)
    {       
        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";
                
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);
 
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);
 
        //---when the SMS has been sent---
        registerReceiver(new BroadcastReceiver(){
         
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS sent",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(getBaseContext(), "Generic failure",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(getBaseContext(), "No service",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(getBaseContext(), "Null PDU",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(getBaseContext(), "Radio off",
                                Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(SENT));
                
        //---when the SMS has been delivered---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS delivered",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(getBaseContext(), "SMS not delivered",
                                Toast.LENGTH_SHORT).show();
                        break;                       
                }
            }
        }, new IntentFilter(DELIVERED));
                
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);        
    }       

 

+ Recent posts

티스토리 툴바