2

我有点困惑,对我在 Eclipse 、 ADT 和 Google Play 上遇到的问题感到有点恼火。

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

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

  • 开发人员 Alpha 负责构建 Android 应用以供内部/外部发布。
  • 其他开发人员在应用程序上工作,将更改推送到 GitHub。
  • Developer 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 商店下载后获得的二进制文件相同?Google 会完全弄乱构建或其元数据吗?

编辑: 清单的相关位

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

2 回答 2

1

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

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

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

于 2012-11-21T14:45:47.753 回答
0

这是否与用户从 Play 商店下载后获得的二进制文件相同?Google 会完全弄乱构建或其元数据吗?

不,用户将获得您上传到Google Play 开发者控制台完全相同的文件。 .apk

关于指定的异常 - 它告诉您在最终的“.apk”文件中缺少标签属性中Application指定的子类。每次您尝试运行应用程序的特定构建时都应该抛出此异常,而不是“有时”。android:name<application>AndroidManifest.xml

于 2012-10-29T15:02:07.890 回答