Android - 缺少应用程序子类

时间:2012-10-29 14:56:28

标签: java android adt google-play classnotfoundexception

我有点困惑,对Eclipse,ADT和Google Play一直存在的问题感到有些恼火。

我正在运行OS X 10.8.2,Eclipse 4.2.1和ADT 20.0.3。

以下是导致问题的工作流程:

  • Developer Alpha负责构建用于内部/外部发布的Android应用程序。
  • 其他开发人员在app上工作,将更改推送到GitHub。
  • 开发者Alpha执行标准的pull / mergetool等
  • Alpha打开Eclipse,刷新主项目,以及两个库项目(ActionBarSherlock和FacebookSdk)
  • Alpha运行项目>清洁>所有
  • 此时运行会创建一个在模拟器和硬件中都能正常运行的应用程序,范围从OS 2.3.3到4.0.1
  • Alpha运行Android工具>导出签名APK,输入关键通行证等
  • 生成的版本会通过电子邮件发送给用户,或上传到Google。请注意,它正在运行与合并后的模拟器/硬件中运行的完全相同的代码。
  • 以下情况发生,有时候:

跟踪:

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate application com.COMPANY.android.APPLICATION.application.APPLICATIONApplication: java.lang.ClassNotFoundException: com.COMPANY.android.APPLICATION.application.APPLICATIONApplication
    at android.app.LoadedApk.makeApplication(LoadedApk.java:482)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4089)
    at android.app.ActivityThread.access$1300(ActivityThread.java:132)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4575)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.OO4usa.android.fanzlive.application.FanzliveApplication
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    at android.app.Instrumentation.newApplication(Instrumentation.java:942)
    at android.app.LoadedApk.makeApplication(LoadedApk.java:477)
    ... 11 more

现在,我的问题是,为什么Application子类没有打包/可见?

更糟糕的是,我们正在使用Acra,并且捕获崩溃的注释是缺少的应用程序,因此,没有崩溃报告。

最后,我想通过运行:

,我们总是可以尝试测试构建的APK
adb install ~/path/to/app.apk

但是,这可验证地与用户从Play商店下载后获得的二进制文件相同吗?谷歌会不会搞乱构建或其元数据?

编辑: 清单的相关位

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.COMPANY.android.APPLICATION"
    android:versionCode="7"
    android:versionName="1.3.3" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="14" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

    <application
        android:name=".application.APPLICATIONApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.APP_green" >

        <!-- activities -->

        <!-- snip -->

        <!-- services -->

        <!-- snip -->

    </application>

</manifest>

编辑: 自动生成的proguard.cfg

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

2 个答案:

答案 0 :(得分:1)

我们的项目遇到了类似的问题。 Eclipse中的发布版本是左右丢弃类。

出于某种原因,当首次完成调试构建(一直在模拟器上运行它),然后然后一个版本导出已完成它开始工作。

这听起来像Eclipse中的一个错误,因为甚至没有配置proguard用于我们的project.properties文件。

答案 1 :(得分:0)

  

这可验证的是用户将获得的二进制文件   他们从Play商店下载它?谷歌会搞乱构建   或其元数据?

不,用户将完全 相同 .apk文件,您将上传到Google Play Developer Console

关于指定的异常 - 它会告诉您Applicationandroid:name <application>的{​​{1}}属性中指定的AndroidManifest.xml子类在最终'.apk'文件中缺失{{1}}。在您尝试运行应用的特定版本时,应该抛出次,而不是“有时”。