有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java应用程序在Eclipse中调试/运行,但是。APK给了我们更多的帮助。分析包含自定义视图的XML布局时发生classNotFoundException

当应用程序从Eclipse通过USB安装时,我的应用程序将在我的目标设备(HTC Desire HD)上调试并运行良好

但是,当我导出到。然后安装这个。我的Desire HD上的APK(首先手动卸载了以前安装的应用程序),它崩溃了

在检查了Logcat中的错误后,我可以看到我的自定义扩展View,在布局XML文件中使用其完全限定名引用,显然找不到,并导致.classNotFoundException

Logcat错误跟踪中的两行内容是:

04-09 21:29:01.101: E/AndroidRuntime(2157): Caused by: 安卓.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 安卓.app.Activity
-keep public class * extends 安卓.app.Application
-keep public class * extends 安卓.app.Service
-keep public class * extends 安卓.content.BroadcastReceiver
-keep public class * extends 安卓.content.ContentProvider
-keep public class * extends 安卓.app.backup.BackupAgentHelper
-keep public class * extends 安卓.preference.Preference
-keep public class com.安卓.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(安卓.content.Context, 安卓.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(安卓.content.Context, 安卓.util.AttributeSet, int);
}

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

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

正在膨胀的XML文件。(Merge标记被使用,因为其中的元素作为子元素添加到父FrameLayout。)

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

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

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

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

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

</merge>

提前感谢您提供的任何提示。如果需要任何其他摘录或配置信息,请呼喊


共 (3) 个答案

  1. # 1 楼答案

    或者,您可以用默认值或${sdk.dir}/tools/proguard/proguard android中的优化值替换项目中的值。txt

  2. # 2 楼答案

    现在,通过使用从新创建的测试项目中获取的完全标准和默认的proguard.cfg文件,这个问题已经得到了解决

    正如我在最初的问题中引用的那样,我之前使用的配置文件是一个我不久前不得不手动添加到项目中的文件,因为它丢失了。我不确定这个文件是从哪里来的,现在我很可能在谷歌上找到了一个默认文件示例,然后就使用了它

    这是Eclipse为我在新项目中投入的一个,它使一个工作环境得以实现。阿普克

    -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引用类时才会被调用

  3. # 3 楼答案

    在使用merge扩展视图时未将attachToRoot设置为true可能是导致InflateException的一个原因