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)
여기에서 프로 가드 오류 출력을 표시합니다. –
'project.properties'의'proguard.config' 매개 변수가 어떻게 보이는지 보여 줄 수 있습니까? –
@AntonSavin proguard.config = proguard.cfg – Bevor