2

アプリケーションが Eclipse から USB 経由でインストールされている場合、アプリケーションはターゲット デバイス (HTC Desire HD) で完全に正常にデバッグおよび実行されます。

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

Logcat でエラーを調べたところView、レイアウト XML ファイルで完全修飾名を使用して参照されているカスタム拡張が明らかに見つからず、.classNotFoundException.

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 ファイル。(Mergeタグが使用されるのは、その中の要素が子として親に追加されるためFrameLayoutです。)

<?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>

これに関するヒントを事前にありがとう。他の抜粋や構成情報が必要な場合は、声をかけてください。

4

3 に答える 3

3

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

元の質問で引用したように、以前使用していた構成ファイルは、欠落していたため、少し前に手動でプロジェクトに追加する必要があったものでした。ファイルがどこから来たのかはわかりません。おそらくGoogleでサンプルのデフォルトファイルを見つけて、それを使用しました。

これは、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の設定方法を実際に理解するために、さらに努力します!

興味を引くために、次の行を見てください。

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

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

Viewこれらは、クラスが XML から参照されたときにのみ呼び出されるコンストラクターを保持する (またはそれらを含むクラスを保持する) ためにあるように見えます。

于 2012-04-10T16:56:09.530 に答える
0

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

于 2012-04-09T20:53:59.993 に答える
0

または、プロジェクト内のものを ${sdk.dir}/tools/proguard/proguard-android.txt のデフォルトのものまたは最適化されたものに置き換えることができます

于 2013-10-01T10:42:48.443 に答える