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 등 이 있 습 니 다.
이 글 을 통 해 독자 들 이 코드 의 혼동 을 하 는 데 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.