2012-04-09 1 views
2

アプリケーションは、アプリケーションのインストール時にターゲットデバイス(HTC Desire HD) EclipseからのUSB。アプリケーションはEclipseからdebug/runで動作しますが、.APKはカスタムレイアウトを含むXMLレイアウトを解析するときに.classNotFoundExceptionを返します

ただし、.APKにエクスポートしてDesire HDにこの.APKをインストールすると(アプリケーションの以前のインストールを最初に手動でアンインストールした場合)、クラッシュします。

私はカスタムは明らかに発見し、.classNotFoundExceptionにつながることができない、レイアウトXMLファイルにその完全修飾名を使用して参照している、私のViewを拡張していることがわかりますLogcatのエラーを検査しました。 Logcatのエラートレースからの関心の

の2行は、次のとおりです。

04-09 21:29:01.101: E/AndroidRuntime(2157): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class com.trevp.myAppName.DashboardLayout

そして以下にさらに:

04-09 21:29:01.101: E/AndroidRuntime(2157): Caused by: java.lang.ClassNotFoundException: com.trevp.myAppName.DashboardLayout in loader dalvik.system.PathClassLoader[/data/app/com.trevp.myAppName-1.apk

このクラッシュアプ​​リケーションをEclipseのからインストールされている場合は発生しません。エクスポートされた.APKからインストールされた場合のみです。

これがProguardの問題である場合は、ここにProguard構成ファイルがあります。私はProguardを初めて使うので、デフォルトから実際に触れていません。私のProguardのバージョンは4.7です。

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

膨らんでいるXMLファイル。 (内の要素は、親FrameLayoutに子として追加されるためMergeタグが使用されている。)この上の任意のヒントを事前に

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

    <ImageView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="top|left" 
    android:scaleType="centerCrop" 
    android:id="@+id/dashLayoutImage" 
    android:src="@drawable/background2" android:drawingCacheQuality="high"/> 

    <com.trevp.myAppName.DashboardLayout 
    android:clipChildren="false" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/dashLayout" 
    android:layout_gravity="top|left" /> 

    <include 
    android:layout_gravity="top|left" 
    layout="@layout/status_bar" 
    android:id="@+id/statusBar" /> 

    <TextView 
    android:layout_gravity="bottom|left" 
    android:id="@+id/pollRate" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    > 
    </TextView> 

</merge> 

感謝。他の抽出や設定情報が必要な場合は、叫んでください。

+0

/tools/proguard/proguard-android.txtデフォルト1または$ {} sdk.dirで最適化された1によって、プロジェクト内の1を置き換えることができ引き起こしているxmlファイルを共有してくださいインフレ。 –

+0

@Anurag Ramdasan - 良い点、ありがとうございます。 XMLレイアウトを追加しました。 – Trevor

+0

アクティビティで 'DashboardLayout'オブジェクトにアクセスしようとしましたか?それを試して、それがクラスを削除しているものであるかどうか確認してください。実際には、DEXed jarを開いてクラスがあるかどうかを確認することもできます。そうでなければ、おそらくプロガードです。 – dmon

答えて

3

この問題は、新しく作成したテストプロジェクトから完全に標準のデフォルトのproguard.cfgファイルを使用して修正されました。

私の以前の質問に引用されているように、私が以前使っていた設定ファイルは、プロジェクトに手作業で追加しなければならなかったものでした。私はファイルが今どこから来たのか分かりません - 私はおそらくグーグルで、サンプルのデフォルトファイルを見つけてそれを使っただけです。

Eclipseが私のために新しいプロジェクトに投入したもので、これは働く.APKを有効にしたものです。

-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>; 
} 

-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); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

これは、-keepclass*タイプの指示にあります。

ここで、実際にProguardを設定する方法を実際に理解するために、もっと努力します!次の行を見て興味を期すため

、:彼らはViewコンストラクタ(または、それらを含むクラスを保存する)を維持するためにそこにいるよう

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

これらは見えるだけ呼び出されますクラスはXMLから参照されます。

0

attachToRootをtrueに設定していない場合は、ビューをマージしてインフレしてInflateExceptionが発生する可能性があります。

0

それとも、ただ

関連する問題