안 드 로 이 드 코드 혼동
자바 는 크로스 플랫폼 의 해석 형 언어 로 자바 소스 코드 를 중간 바이트 코드 로 컴 파일 하여 class 파일 에 저장 합 니 다.크로스 플랫폼 의 수요 로 인해 자바 바이트 코드 에는 변수 명,방법 명 등 많은 소스 코드 정보 가 포함 되 어 있 고 이런 이름 을 통 해 변수 와 방법 에 접근 할 수 있 습 니 다.이런 기 호 는 많은 의미 정 보 를 가지 고 자바 소스 코드 로 역 컴 파일 되 기 쉽 습 니 다.이러한 현상 을 방지 하기 위해 서,우 리 는 자바 혼동 기 를 사용 하여 자바 바이트 코드 를 혼동 할 수 있다.
혼동 은 발 표 된 프로그램 을 재 구성 하고 처리 한 코드 가 처리 전 코드 와 같은 기능 을 수행 하도록 하 는 것 이다.
혼 란 스 러 운 코드 는 역 컴 파일 되 기 어렵 고 역 컴 파일 에 성공 하 더 라 도 프로그램의 진정한 의 미 를 얻 기 어렵다.
혼 란 스 러 웠 던 프로그램 코드 는 여전히 원래 의 파일 형식 과 명령 집합 을 따 르 고 실행 결과 도 혼 란 스 러 웠 던 것 과 마찬가지 로 혼동 기 는 코드 에 있 는 모든 변수,함수,클래스 의 이름 을 짧 은 영문 자모 번호 로 바 꾸 었 을 뿐 해당 하 는 함수 이름과 프로그램 설명 이 없 는 상황 에서 역 컴 파일 되 더 라 도 읽 기 어 려 울 것 이다.
또한 혼동 은 거 스 를 수 없 는 것 이다.혼동 하 는 과정 에서 정상 적 인 운행 에 영향 을 주지 않 는 일부 정 보 는 영구적 으로 잃 어 버 리 고 이런 정보의 분실 은 프로그램 을 더욱 이해 하기 어렵 게 한다.
믹서 의 역할 은 코드 를 보호 하 는 것 뿐만 아니 라 컴 파일 된 프로그램의 크기 를 간소화 하 는 역할 도 한다.
위 에서 소개 한 단축 변수 와 함수 명 및 일부 정 보 를 잃 어 버 린 원인 으로 인해 컴 파일 후 jar 파일 의 부 피 는 약 25%감소 할 수 있 습 니 다.이것 은 현재 비용 이 비교적 비 싼 무선 네트워크 전송 에 어느 정도 의미 가 있 습 니 다.
혼동 파일 proguard.cfg 파라미터 상세 설명
#
-optimizationpasses 5
#
-dontusemixedcaseclassnames
# jar
-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
# native
-keepclasseswithmembernames class * { native <methods>;}
#
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
#
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
#
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# enum
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# Parcelable
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
#
-keep class MyClass;
주(본인 테스트 소득):1.이러한 설정 을 사용 한 후 APK 를 내 보 낼 때 빨간색 경고 알림 을 많이 보 냅 니 다.이 때-ignorewarnings 를 사용 하여 알림 을 무시 합 니 다.
2.정상적으로 내 보 낼 수 있 으 나 실행 할 수 없 는 것 은 로 그 를 보면 다음 과 같은 오류 정 보 를 참조 할 수 있 습 니 다.
E/AndroidRuntime(19866): FATAL EXCEPTION: Thread-103
E/AndroidRuntime(19866): java.lang.ExceptionInInitializerError
E/AndroidRuntime(19866): at com.a.a.a.b.b.a(Unknown Source)
E/AndroidRuntime(19866): at tv.hisense.android.mps.service.ay.run(Unknown Source)
E/AndroidRuntime(19866): Caused by: b.a.a.c.b: The chosen LogFactory implementation does not extend LogFactory.
Please check your configuration.
(Caused by java.lang.ClassCastException:
The application has specified that a custom LogFactory implementation should be used but Class
org.apache.commons.logging.impl.LogFactoryImpl cannot be converted to 'b.a.a.c.c'.
Please check the custom implementation.
Help can be found @http://commons.apache.org/logging/troubleshooting.html.)
E/AndroidRuntime(19866): at b.a.a.c.c.a(Unknown Source)
E/AndroidRuntime(19866): at b.a.a.c.e.run(Unknown Source)
E/AndroidRuntime(19866): at java.security.AccessController.doPrivileged(AccessController.java:45)
E/AndroidRuntime(19866): at b.a.a.c.c.a(Unknown Source)
E/AndroidRuntime(19866): at b.a.a.c.c.a(Unknown Source)
E/AndroidRuntime(19866): at b.a.a.c.c.b(Unknown Source)
E/AndroidRuntime(19866): at b.a.a.b.p.<clinit>(Unknown Source)
E/AndroidRuntime(19866): ... 2 more
상기 정 보 를 제시 하면 org.apache.comons.logging.impl.LogFactory Impl 류 참조 오류 가 발생 했 음 을 알 수 있 습 니 다.이러한 jar 패 키 지 를 찾 아 다음 세 마디 를 통 해 이 문 제 를 해결 합 니 다.
-libraryjars libs/commons-logging-1.1.1.jar # jar
-dontwarn org.apache.** #
-keep class org.apache.** {*;} #
로그 정보 에 따라 어떤 jar 가방 을 무시 하고 어떤 종 류 를 유지 하 는 지 확인 해 야 합 니 다.오류 가 없 는 가방 은 무시 하고 보류 하지 마 십시오.그렇지 않 으 면 OutOf Memory Error 가 발생 할 수 있 습 니 다.코드 혼동 방법
SDK 버 전에 따라 2 가지 코드 혼동 방식 이 다 릅 니 다.이상 의 proguard.cfg 매개 변수 에 대한 상세 한 설명 에서 언급 된 정 보 는 낮은 버 전의 SDK 에서 혼 란 스 러 운 스 크 립 트 입 니 다.사실상 높 은 버 전의 SDK 에서 혼 란 스 러 운 원리 와 매개 변수 도 낮은 버 전과 별 차이 가 없 으 며 SDK 버 전의 환경 에서 혼 란 스 러 운 스 크 립 트 를 도입 하 는 방식 만 다 릅 니 다.구체 적 인 방법 은 다음 과 같다.
저 버 전 SDK 아래 프로젝트 에 포함 proguard.cfg 와 procject.properties 파일 은 procject.properties 파일 끝 에 만 추가 합 니 다. proguard.config=proguard.cfg 에서 프로젝트 를 내 보 내 면 됩 니 다.
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
#
# proguard.config=proguard-project.txt
# Project target.
target=android-19
이상 의 설정 정 보 는 procject.properties 입 니 다. 파일 의 내용,파란색 문 자 는 코드 가 헷 갈 리 는 과정 에서 추가 해 야 할 설정 정 보 를 제공 합 니 다.그 중에서 sdk.dir 는 현재 기계 에 SDK 를 설치 하 는 경 로 를 제공 합 니 다.어떤 가방 에 있 는 파일 을 헷 갈 리 지 않 게 보관 하려 면 proguard-project.txt 파일 에 해당 하 는 패키지 이름 을 유지 하 는 문 구 를 추가 하면 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.