android app 코드 혼동 실례 상세 설명

새로운 작업 을 받 아 기 존 항목 을 코드 혼동 합 니 다.이전에 혼동 에 대해 알 고 있 었 지만 상세 하고 완전 하지 못 해서 어떤 것들 이 헷 갈 리 는 것 을 아 는 것 은 비교적 까다롭다.그러나 다행히 현재 의 프로젝트 는 그리 복잡 하지 않 아서(헷 갈 리 는 것 에 대해 서 는)앞 당 겨 완성 하 였 습 니 다~현재 총 결 된 것 입 니 다. 
제1 부분
작업 프로 세 스 소개(eclipse):
1.혼동 기 열기:프로젝트 루트 디 렉 터 리 에 있 는 procject.properties 파일 을 찾 아"\#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt"줄 앞의"\#"를 삭제 하면 됩 니 다.
2.혼동 프로필 수정:프로젝트 루트 디 렉 터 리 에 있 는 proguard-project.txt 파일 을 찾 아 코드 를 수정 하 는 것 이 가장 관건 입 니 다.
3.관련 파일 을 저장 한 후 오류 가 발생 했 을 때 사용 합 니 다.주로 내 보 낸 apk 파일,프로젝트 루트 디 렉 터 리 에 있 는 proguard 디 렉 터 리 에 있 는 파일(주로 mapping.txt)과 프로젝트 소스 코드 가 있 습 니 다.
4.프로젝트 실행 과정 오류 처리:오류 정보 와 3 단계 에 저 장 된 mapping 에 따라 오류 위 치 를 찾 습 니 다.
이것 을 알 고 우 리 는 그것 을 전개 했다.eclipse 를 열 고 새 항목 을 만 듭 니 다.기본적으로 proguard-project.txt 와 procject.properties 를 만 듭 니 다.코드 를 작성 한 다음 proguard-project.txt 의"\#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt"줄 앞의"\#"을 삭제 하고 마지막 으로 내 보 내 면 코드 에 대한 혼동 을 실현 할 수 있 습 니 다.proguard-project.txt 의 내용 을 작성 하지 않 았 더 라 도.다음은 제 테스트 코드 입 니 다.

public class MainActivity extends Activity {
 
  private String mName;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    mName = ttdevs;
 
    getString(mName);
    setName(mName);
    showDialog();
    // testError();
  }
 
  public String getString(String name) {
    return hello + name;
  }
 
  public void setName(String name) {
    System.out.println(I'm + name);
  }
 
  private void showDialog() {
    new Handler().postDelayed(new Runnable() {
 
      @Override
      public void run() {
        ScoreAlertDialog.showDialog(MainActivity.this);
      }
    }, 2000);
  }
 
  public static class ScoreAlertDialog {
 
    public static void showDialog(final Activity activity) {
      if (activity.isFinishing()) {
        return;
      }
      try {
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setTitle(alert_title);
        builder.setNegativeButton(cancel, null);
        builder.setPositiveButton(submit, new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            try {
              Toast.makeText(activity, Welcome, Toast.LENGTH_LONG).show();
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
        builder.show();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
 
  private void testError() {
    try {
      int error = 1 / 0;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 

포장,역 컴 파일,마지막 으로 우 리 는 다음 과 같은 코드 를 얻 었 습 니 다.

위의 코드 를 분석 하면 사용자 정의 방법 명 은 모두 특별한 의미 가 없 는 짧 은 자모 로 바 뀌 었 지만 activity 의 onCreate()방법 은 변 하지 않 았 음 을 알 수 있 습 니 다.마지막 testerror()방법 은 우리 가 호출 하지 않 았 기 때문에 삭제 되 었 다.이것 이 바로 기본 적 인 혼동 처리 전략 이다.여기 보니까 헷 갈 리 는 게 작은 케이스 네~
계속 아래로 내 려 가면 로그아웃 한 testError()를 열 고 포장 을 실행 할 때 오류 가 발생 합 니 다.오류 정 보 는 다음 과 같 습 니 다.

java.lang.ArithmeticException: divide by zero
  at com.ttdevs.proguard.MainActivity.b(Unknown Source)
  at com.ttdevs.proguard.MainActivity.onCreate(Unknown Source)
  at android.app.Activity.performCreate(Activity.java:4531)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
  at android.app.ActivityThread.access$600(ActivityThread.java:139)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:154)
  at android.app.ActivityThread.main(ActivityThread.java:4945)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  at dalvik.system.NativeStart.main(Native Method)
이 예 는 비교적 간단 하기 때문에 어디 에 문제 가 생 겼 는 지 쉽게 알 수 있 지만 우리 가 표현 하고 자 하 는 문 제 를 설명 할 수 있다.헷 갈 린 코드 의 잘못된 정 보 를 어떻게 복원 하 는 지 설명 할 수 있다.이 목적 을 달성 하기 위해 서 는 안 드 로 이 드-sdk-windows oolsproguardin etrace.bat,mapping.txt 와 위의 오류 정보(log.txt)가 필요 합 니 다.다음 명령 을 실행 합 니 다(window 시스템):
retrace.bat mapping.txt log.txt

 
위의 그림 에서 오류 로그 의 b()방법 이 실제 코드 의 setName()방법 을 잘 볼 수 있 습 니 다.
여기 서 주의해 야 할 것 은 apk 를 내 보 낼 때마다 프로젝트 디 렉 터 리 에 있 는 proguard 폴 더 아래 에 대응 하 는 mapping 파일 을 생 성 하기 때문에 모든 apk 에 대응 하 는 mapping 파일 을 저장 해 야 합 니 다.이로써 전체 혼 란 스 러 운 절차 소 개 를 마 쳤 다.
참고:
공식 문서:http://developer.android.com/tools/help/proguard.html
공식 문서 의 번역:http://www.cnblogs.com/over140/archive/2011/04/22/2024528.html (자신 이 하 나 를 뒤 지 려 고 했 는데 옛날 에 농민 아저씨 가 번역 을 하 셨 다 는 것 을 알 게 되 었 습 니 다.여기 서 직접 인용 하고 감 사 드 립 니 다)
제2 부분
첫 번 째 부분 에 서 는 어떻게 조작 하 는 지,공식 문 서 를 참조 하면 기본적으로 파악 할 수 있다.나머지 도 가장 어 려 운 것 은 proguard-project.txt 파일 의 작성 입 니 다.이 부분 에 대해 서 는 두 가지 처리 전략 이 있 습 니 다.다른 사람 이 쓴 것 을 직접 작성 하고 사용 합 니 다.먼저 다른 사람 이 쓴 것 을 어떻게 사용 하 는 지 말 합 니 다.우리 가 인용 한 제3자 라 이브 러 리 는 오픈 소스 든 닫 힌 소스 든 특별한 상황 이 있 으 면 우 리 는 그의 User Guide 에서 헷 갈 리 는 코드 설정 을 찾 을 수 있 습 니 다.예 를 들 어 우리 가 유명한 guillep PullToRefresh 를 인용 하면 우 리 는 그의 문서 에서 다음 과 같은 코드 를 찾 을 수 있 습 니 다.

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
 
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
 
-keepclasseswithmembernames class * {
  native <methods>;
}
 
-keepclasseswithmembernames class * {
  public <init>(android.content.Context, android.util.AttributeSet);
}
 
-keepclasseswithmembernames class * {
  public <init>(android.content.Context, android.util.AttributeSet, int);
}
 
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}
 
-keep class * implements android.os.Parcelable {
 public static final android.os.Parcelable$Creator *;
}</init></init></methods>
이 부분의 코드 가 있 으 면 우 리 는 직접 복사 해서 우리 의 프로젝트 에 삽입 하면 된다.이런 방식 은 역시 copy 식 이다.그럼 코드 를 어떻게 쓰 는 지 헷 갈 리 는 지 작은 예 를 들 어 보 겠 습 니 다.아니면 첫 번 째 부분의 예 를 들 어 우 리 는 이 프로젝트 의 proguard-project.txt 파일 에 다음 과 같은 몇 줄 을 추가 합 니 다(proguard-project.txt 에서'\#'은 주석 을 대표 합 니 다).

# -keep public class com.ttdevs.proguard.** { *; }
# -keepclasseswithmembers public class com.ttdevs.proguard.** { *; }
 
-keep public class com.ttdevs.proguard.MainActivity {
  java.lang.String getString(java.lang.String);
}
그리고 우 리 는 apk 를 내 보 낸 다음 에 역 컴 파일 을 해서 다음 과 같은 코드 를 얻 을 수 있 습 니 다.

이전의 것 과 비교 해 보면,우 리 는 그 중의 getString 방법 이 혼동 되 지 않 았 다 는 것 을 발견 했다.맞습니다.위의 proguard-project.txt 는 MainActivity 를 유지 하 는 getString()방법 을 헷 갈 리 지 말 라 는 뜻 입 니 다.위 와 같은 혼동 코드 에 주석 이 달 린 두 줄 이 각각 어떤 효과 가 있 는 지 시험 해 보 세 요.
여기까지 말 하면 ProGuard 의 핵심 부분 과 관련 되 기 시 작 했 고 나머지 는 ProGuard 의 문 서 를 연구 하고 파악 한 그의 문법 을 사용 하 는 것 이다.완전한 ProGuard 의 번역 문 서 를 찾 으 려 고 했 지만 N 을 찾 아 보 니 하나 도 발견 되 지 않 았 고 흩 어 진 번역 도 매우 적 었 습 니 다.최근 시간 이 촉박 한 데다 가 능력 이 한계 가 있어 서 자주 사용 하 는 명령 몇 개 를 번역 하 는 것 도 힘 들 었 습 니 다.그래서 자세히 읽 으 려 는 생각 은 잠시 뒤로 미 룰 수 밖 에 없 었 습 니 다.여기 서 keep 명령 을 간단하게 소개 합 니 다.
-keep [,modifier,...] class_specification
코드 에 접근 점 으로 보 존 된 클래스 나 클래스 의 구성원(속성 과 방법)을 지정 합 니 다.예 를 들 어 하나의 응용 을 유지 하기 위해 서 는 주 류 와 그의 main 방법 을 지정 할 수 있다.라 이브 러 리 를 처리 하기 위해 서 는 그의 Public 방문 요 소 를 상세 하 게 설명해 야 합 니 다.
또한 keep 의 간단 한 개술 과 문법 규범 도 있다.Class Specification 에 서 는 구조 방법,속성 과 방법,*와"*"의 차이 점 등 을 알려 줍 니 다.예 를 들 어*는 모든 클래스 와 일치 하지만 가방 의 구분자 가 포함 되 지 않 습 니 다.**는 모든 클래스 와 일치 하 며 임의의 수량의 가방 구분자 가 포함 되 어 있 습 니 다.따라서 위 에서 설명 한 코드 의 뜻 은 다음 과 같 습 니 다.첫 번 째 줄:come.ttdevs.proguard 의 모든 클래스 와 하위 패키지 의 모든 방법 이 헷 갈 리 지 않 습 니 다.두 번 째 줄 은 com.ttdevs.proguard 의 모든 클래스 와 하위 패키지 의 모든 방법 과 구성원 변 수 를 혼동 하지 않 습 니 다.
//TODO 디 테 일 도 많 습 니 다.예 를 들 어-libraryjars,-montwarn,-keepattributes 등 이 있 습 니 다.
이 글 을 통 해 독자 들 이 코드 의 혼동 을 하 는 데 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기