2011-02-15 6 views
1

아래의 Proguard 구성을 사용하여 앤트 빌드를 생성했습니다.이 빌드는 "android"명령 줄 도구로 생성 된 것으로, 꽤 직설적으로 보입니다. 그러나이 스크립트를 사용하여 앱을 빌드하면 앱이 실행될 때 앱이 터지며 일련의 널 포인터 예외가 발생합니다 (난독 처리 과정에서 코드에 버그가 추가됨). 이 응용 프로그램을 수정하려면 Proguard를 실행하지 않고 응용 프로그램을 다시 빌드하면됩니다.Proguard를 Android와 함께 사용하고 앱의 기능 무결성을 보호하는 방법?

Proguard를 Android 앱과 함께 사용하는 사람에게 다음과 같은 조언을하기 바랍니다. a) 앱이 최적화되고 난이도가 적당하지만 b) 기능적 무결성이 손상되지 않았습니까?

-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 *; 
} 
+0

정확한 오류 란 무엇인가요? –

답변

3

Configuring Pro-guard section에 나열된 규칙을 따르십시오. 열쇠는 xml의 클래스에 대한 참조입니다. 따라서 매니페스트에 코드에 명시 적으로 사용되지 않은 리시버 또는 서비스가있는 경우 Proguard에서 제거 할 수 있습니다. 여기에는 맞춤보기와 같은 레이아웃의 수업도 포함됩니다.

+0

힌트 "사용자 정의보기"에 감사드립니다. 앱을 시작하자마자 내 릴리스 빌드가 충돌하는 맞춤보기를 추가 한 이후로 주목을 받았습니다. –

5

경험 한 사례에 대한 해결책을 찾았습니다. 나는 다른 사람들이 유용하다고 생각하기 때문에 해결책을 문서화 할 것이다.

JSON API 호출과 페이로드를 유지하는 데 특별히 사용되는 두 개의 클래스가 있습니다. 그 클래스를 난독 화에서 제외하지 않았으므로 클래스 멤버 이름이 JSON 매개 변수 이름과 일치하지 않으므로 GSON 파서가 객체를 올바르게 만들지 못했습니다.

GSON 또는 JSON 매개 변수 이름과 클래스 멤버 이름이 일치하는 다른 도구를 사용하여 JSON 데이터를 deserialize하여 개체를 만들 때 ProGuard가 이름을 바꾸지 않는 경우이 이야기의 도덕적 인면이 있습니다. 모든 탈식 된 물체가 비어 있었기 때문에 내가보고 있던 null 참조 예외가있었습니다.

나는 ClassNotFoundException이 발생하지 않는다고 말해야하는데, 이것은 다른 문제이며, 처음에는 설명 할 수없는 런타임 오류처럼 보였지만 단지 흥미로운 조합이었습니다.

관련 문제