안 드 로 이 드 코드 혼동

코드 혼동 이란 무엇 입 니까?
자바 는 크로스 플랫폼 의 해석 형 언어 로 자바 소스 코드 를 중간 바이트 코드 로 컴 파일 하여 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 에서 프로젝트 를 내 보 내 면 됩 니 다.
  • 고 버 전 SDK 에서 프로젝트 에는 proguard-project.txt 와 procject.properties 파일 이 동시에 포함 되 어 있 습 니 다.이 때 proguard-project.txt 파일 에서 다음 과 같은 정 보 를 설정 한 다음 프로젝트 Export 를 사용 하면 됩 니 다.다음은 실제 파일 로 설명 하 겠 습 니 다
  • # 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 파일 에 해당 하 는 패키지 이름 을 유지 하 는 문 구 를 추가 하면 됩 니 다.

    좋은 웹페이지 즐겨찾기