我有点困惑,对我在 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 *;
}