2012-07-20 3 views
4

ICS (4.0.3 - 레벨 15)를 타겟팅하는 첫 번째 앱을 코딩하고 있습니다. 나는 액션 바를 얻었고 나는 그들이 훌륭하다고 생각한다. 그러나 나는 처음으로 단편을 연구하고 있으며, 내가 좋아하는지 여부는 아직 확실하지 않습니다. 내가 현재 작업하고있는 응용 프로그램은 화면 요구 사항에 꽤 동적이지 않기 때문에 조각이 필요하지 않습니다. 표준 활동이 잘 작동합니다. 큰 그러나 내가 PreferencecFragment 및 헤더 PreferenceActivity 사용해야합니다. 환경 설정 정의 xml 파일에 대한 이전 활동 형태는 가치가 떨어졌습니다. 그래서 나는 환경 설정 디스플레이를 위해 환경 설정 조각을 구글의 힘으로 사용하는 방법을 배웠다. (단, 헤더를 표시하는 방법을 알아내는 방법을 알아 낸 사람이 누구인지를 배우기 위해 두 가지를 사용했습니다. 하나의 조각 클래스를 가리키는 것으로 충분했지만 한 헤더로 두 번 선택해야만했습니다. .)Proguard가없는 기기에서 PreferenceActivity with PreferenceFragment가 실패합니다.

약 3 일 전까지는 에뮬레이터를 사용하여 모든 것이 작동했습니다. 테스트를 장치로 옮기면 헤더 (PreferenceActivity 클래스)가 표시된 환경 설정 화면을 얻을 수 있습니다. 그러나 PreferencesFragment 클래스를 호출하는 헤더를 선택하면 "미안, 앱이 중지되었습니다."라는 메시지가 나타났습니다. 에뮬레이터를 다시 실행하면 모든 것이 올바르게 작동합니다. APK를 생성 할 때 Proguard를 사용하고 있음을 알게되었습니다. Proguard가 꺼져있을 때 설정을 포함하여 모든 것이 작동했는데 Crittercism 충돌 보고서에서 Proguard가 켜져있을 때 발생하는 오류는 클래스를 찾을 수 없습니다. 발견되지 인라인 PreferenceFragment 클래스이다. 헤더

android:fragment="com.mycompany.projectname.FragmentPreferences$SettingsFragment" 

를 사용하여 예를 들어

인라인 SettingsFragment 클래스가 발견되지 장치에서 실행중인 Android OS.

Proguard를 끄고 APK를 다시 설치하면 위의 헤더가 정상적으로 작동합니다. Proguard의 유무에 관계없이 PreferenceActivity 클래스 FragmentPreferences가 항상 발견되고 헤더가 표시됩니다. 표시된 헤더 (SettingsFragment의 호출)를 선택할 때 실패합니다. ...

저는 -dontoptimize 및 -dontshrink를 시도했지만 Proguard가 작동하지 않습니다. 내 Proguard 설정은 표준입니다. 즉, Eclipse 마법사 (ADT R20 - 가장 최신의 기능)를 사용하여 새 앱을 만들 때 생성됩니다. 프로젝트 속성에서

:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 

target=Google Inc.:Google APIs:15 

In proguard-project: 

-keepattributes SourceFile, LineNumberTable 

-dontshrink 

-dontoptimize 

모든 표준 활동을 (아무 조각) 기본 설정으로 잘 작동 여기에 내가 실행하기 위해 노력하고있어 설정은 다음과 같습니다. Proguard를 난독 화로 제한하려는 시도에서 -dont가 추가되었습니다. 인라인 프래그먼트 클래스가 호출 될 때 설정은 여전히 ​​불어납니다.

현재 Proguard가 꺼진 상태에서 APK가 생성됩니다. 제작 준비가되면 다시 켜보고 싶습니다.

은 (BTW, 나는 외부 클래스에 PreferenceFragment 클래스를 이동 Proguard와이 호출 될 때 그들은 여전히 ​​작동하지 않습니다.) 내가 여기만큼 물건보다 더 입력 한 아직도 내 질문을하지 않은

. 좋아요, 질문으로 닫으십시오 :

공유 환경 설정 조각 클래스를 표시하는 데 필요한 올바른 Proguard 설정을 아는 사람이 있습니까? 그리고이 문제가 일반 조각 사용으로 확장된다면 그 설정은 무엇입니까?

답변

5

코드 대신 레이아웃이나 다른 리소스로 참조되는 조각을 포함하여 ProGuard가 자신의 클래스를 제거하지 못하도록하려면 -keep class your.package.goes.here.** { *; }을 사용합니다.

나는 ProGuard 전문가가 아니기 때문에 "Buick으로 날아 다니는 것"일지 모른다.하지만 내 PreferenceFragments을 포함하여 나를 위해 작동한다.

+0

난독 화 - project.txt을 변경합니다. 윌 당신이 알려 드리겠습니다. 나는 바퀴벌레에 산탄 총을 사용하는 것을 선호하지만. 텍사스와 그 모든 것. –

+0

의견을 남기고 뷰익을 사용했습니다. 잘됐다. 심지어는 글꼴을 제거하기 때문에 이제는 글꼴을 최적화하고 축소 할 수 있습니다. –

+0

@HowardHodson : 바퀴벌레에 대한 새로운 무기가 생겼습니다. 다행! :-) – CommonsWare

1

내가 한번해볼 께

-keep public class * extends android.preference.Preference 
-keep public class * extends android.preference.PreferenceFragment 
-keep public class * extends android.preference.PreferenceActivity 
관련 문제