2014-10-24 7 views
0

ProGuard에서 코드를 난독 화하려고 시도하지만, 그렇게하면 더 이상 AndroidManifest에 정의 된 초기 활동 (ClassNotFoundException)을 찾을 수 없습니다.ProGuard 난독 화로 ClassNotFoundException이 발생합니다.

가 활동 보이는이 방법 :

public class LoadingActivity extends Activity 
{ 
    private static final String TAG = LoadingActivity.class.getSimpleName(); 
    private int effectiveWidth; 
    private int effectiveHeight; 
    private AsyncTask<Void, Void, Void> bitmapLoaderTask; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_loading); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

     initSpecs(); 
    } 

    @Override 
    protected void onPause() 
    { 
     super.onPause(); 

     if (bitmapLoaderTask != null) 
     { 
      bitmapLoaderTask.cancel(true); 
     } 
    } 

    @Override 
    protected void onStart() 
    { 
     super.onStart(); 

     if (ResizedBitmapMapping.isStillHoldingAllImages()) 
     { 
      Logger.log(TAG, "ResizedBitmapMapping still contains all images, skip loading...", LogController.isLoggingEnabled(), Log.DEBUG); 

      startMenu(); 
     } 
     else 
     { 
      bitmapLoaderTask = new BitmapLoaderTask(getResources(), effectiveWidth, effectiveHeight, this); 
      bitmapLoaderTask.execute(); 
     } 
    } 

    @SuppressWarnings("deprecation") 
    private void initSpecs() 
    { 
     PackageNameHolder.setPackageName(getPackageName()); 

     WindowManager windowManager = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE); 
     Point size = new Point(); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) 
     { 
      windowManager.getDefaultDisplay().getSize(size); 

      effectiveWidth = size.x; 
      effectiveHeight = size.y; 
     } 
     else 
     { 
      Display display = windowManager.getDefaultDisplay(); 

      effectiveWidth = display.getWidth(); 
      effectiveHeight = display.getHeight(); 
     } 
    } 

    public void startMenu() 
    { 
     final Intent gameIntent = new Intent(this, MenuActivity.class); 
     startActivity(gameIntent); 
     overridePendingTransition(0, 0); 
    } 

    public void cancel() 
    { 
     finish(); 
    } 
} 

내 proguard.cfg은 다음과 같습니다 : 테스트를 위해

-dontoptimize 
-dontshrink 
-verbose 

-keep class com.chartboost.** { *; } 

-keep class * extends java.util.ListResourceBundle { 
    protected Object[][] getContents(); 
} 

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 

-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 

-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 

내가 다음

-keep class com.myproject.** { *; } 

을 추가, 응용 프로그램 작업, 그러나 그것은 분명하지 않습니다. 어떤 아이디어가 제대로 난독 화 되는가? 실제로 이것은 프로 가드가 신경 써야 할 부분입니다.

10-25 00:29:04.600: E/AndroidRuntime(3299): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mydomain.myapp/com.mydomain.myapp.LoadingActivity}: java.lang.ClassNotFoundException: com.mydomain.myapp.LoadingActivity in loader dalvik.system.PathClassLoader[/data/app/com.mydomain.myapp-2.apk] 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1680) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.os.Looper.loop(Looper.java:130) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at java.lang.reflect.Method.invoke(Method.java:507) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at dalvik.system.NativeStart.main(Native Method) 
10-25 00:29:04.600: E/AndroidRuntime(3299): Caused by: java.lang.ClassNotFoundException: com.mydomain.myapp.LoadingActivity in loader dalvik.system.PathClassLoader[/data/app/com.mydomain.myapp-2.apk] 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at java.lang.ClassLoader.loadClass(ClassLoader.java:551) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672) 
10-25 00:29:04.600: E/AndroidRuntime(3299):  ... 11 more 

[업데이트]
나는 그것이 시작하지만 다음 다음을 찾을 수없는

-keep public class com.mydomain.myapp.LoadingActivity 

를 추가하는 경우 : 응용 프로그램을 시작하는 동안

오류 메시지입니다 활동, 난독 화 된 활동을 위해 AndroidManfest에서 검색하기 때문에?

10-25 13:20:16.159: E/AndroidRuntime(3195): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.mydomain.myapp/com.mydomain.myapp.G}; have you declared this activity in your AndroidManifest.xml? 
10-25 13:20:16.159: E/AndroidRuntime(3195):  at com.mydomain.myapp.LoadingActivity.a(Unknown Source) 
10-25 13:20:16.159: E/AndroidRuntime(3195):  at com.mydomain.myapp.e.a.a(Unknown Source) 
10-25 13:20:16.159: E/AndroidRuntime(3195):  at com.mydomain.myapp.e.a.onPostExecute(Unknown Source) 
+0

여기에서 프로 가드 오류 출력을 표시합니다. –

+0

'project.properties'의'proguard.config' 매개 변수가 어떻게 보이는지 보여 줄 수 있습니까? –

+0

@AntonSavin proguard.config = proguard.cfg – Bevor

답변

2

proguard.config 매개 변수는

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

또는 최적화를위한

해야

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

등 필요한 설정이 포함되어 있습니다이 방법 : 순간

# We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 
+0

-keepclassmembers를 추가했는데 proguard.config = $ {sdk.dir} /tools/proguard/proguard-android.txt:proguard.cfg로 변경했지만이 방법도 작동하지 않습니다. 같은 문제. – Bevor

0

I 부분적으로 말야. fident를 다음 해결책과 함께 사용하는 것이 좋지만 더 나은 난독 화를 선호합니다.

-dontoptimize 
-dontshrink 
-verbose 
-flattenpackagehierarchy 

-keepnames class com.mydomain.myapp.** { *; } 

#...and some more classes for Google Services API 
관련 문제