java - Android - 缺少应用程序子类

标签 java android adt google-play classnotfoundexception

我对 Eclipse、ADT 和 Google Play 遇到的一个问题感到有点困惑,而且有点恼火。

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

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

  • 开发人员 Alpha 负责构建用于内部/外部发布的 Android 应用。
  • 其他开发者开发应用,将更改推送到 GitHub。
  • 开发人员 Alpha 执行标准的 pull/mergetool 等操作
  • Alpha 打开 Eclipse,刷新主项目和两个库项目(ActionBarSherlock 和 FacebookSdk)
  • Alpha 运行一个项目 > Clean > All
  • 此时运行创建的应用程序可以在模拟器和硬件中正常运行,范围从 OS 2.3.3 到 4.0.1
  • Alpha 运行 Android Tools > Export Signed APK,放入 key 传递等。
  • 生成的版本通过电子邮件发送给其他人,或上传到 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 商店下载后获得的二进制文件相同? Google 会完全破坏构建或其元数据吗?

编辑: list 的相关部分

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

最佳答案

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

出于某种原因,当首次完成调试构建(一直到在模拟器上运行它),然后然后完成发布导出时,它开始工作.

这听起来像是 Eclipse 中的错误,因为混淆器甚至没有配置为在我们的 project.properties 文件中使用。

关于java - Android - 缺少应用程序子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124098/

相关文章:

java - 在 JTable 中插入后如何进行排序(RowSort)?

java - 运行测试时从项目根目录而不是模块加载 Spring Boot 文件系统资源/配置

android - 为什么这个屏幕,而应用程序每次都打开

android - Project.properties 文件而不是 default.properties 文件

java - 关闭 CallableStatement

java - 分页数据最多 10 行,使用 recyclerview 中的 load more

android - 如何制作安卓:layout_gravity ="bottom|center_horizontal" stays at bottom

android - 如何阻止焦点在 ENTER 上的 EditText 字段之间移动

java - 安全异常 : Unable to find field for dex. jar android

android - 我无法运行项目 Eclipse、ADT、Google Android Maps V2