Java Android-缺少应用程序子类
我对Eclipse、ADT和GooglePlay的一个问题有点困惑,而且有点恼火 我正在运行OSX10.8.2、Eclipse4.2.1和ADT20.0.3 以下是导致问题的工作流:Java Android-缺少应用程序子类,java,android,adt,google-play,classnotfoundexception,Java,Android,Adt,Google Play,Classnotfoundexception,我对Eclipse、ADT和GooglePlay的一个问题有点困惑,而且有点恼火 我正在运行OSX10.8.2、Eclipse4.2.1和ADT20.0.3 以下是导致问题的工作流: 开发者Alpha负责构建用于内部/外部发布的Android应用程序 其他开发人员在应用程序上工作,将更改推送到GitHub 开发人员Alpha执行标准的拉/合并工具等 Alpha打开Eclipse,刷新主项目和两个库项目(ActionBarSherlock和FacebookSdk) Alpha运行一个项目>清理>
- 开发者Alpha负责构建用于内部/外部发布的Android应用程序
- 其他开发人员在应用程序上工作,将更改推送到GitHub
- 开发人员Alpha执行标准的拉/合并工具等
- Alpha打开Eclipse,刷新主项目和两个库项目(ActionBarSherlock和FacebookSdk)
- Alpha运行一个项目>清理>全部
- 此时运行将创建一个在模拟器和硬件(从OS 2.3.3到4.0.1)中都能正常工作的应用程序
- Alpha运行Android工具>导出签名APK,输入密钥传递等
- 生成的构建将通过电子邮件发送给用户,或上传到谷歌。请注意,它运行的代码与刚刚在模拟器/硬件后期合并中运行的代码完全相同
- 有时会发生以下情况:
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
现在,我的问题是,为什么应用程序子类没有打包/可见
更糟糕的是,我们正在使用Acra,捕捉崩溃的注释位于丢失的应用程序上,因此没有崩溃报告
最后,我认为我们可以通过运行以下程序来测试构建的APK:
adb install ~/path/to/app.apk
但是,用户从Play store下载后将获得的二进制文件是否可以验证?谷歌会不会搞乱这个构建或者它的元数据
编辑:清单的相关位
编辑:自动生成的proguard.cfg
-优化过程5
-dontusemixedcaseclassnames
-DontskipnonPublicLibraryClass
-不要翻转
-冗长的
-优化!代码/简化/算术,!字段/*,!类/合并/*
-keep public class*扩展android.app.Activity
-keep public class*扩展android.app.Application
-keep public class*扩展了android.app.Service
-keep public class*扩展了android.content.BroadcastReceiver
-keep public class*扩展了android.content.ContentProvider
-keep public class*扩展了android.app.backup.BackupAgentHelper
-keep public class*扩展了android.preference.preference
-保持公共类com.android.vending.licensing.ILicensingService
-KeepClassSwithMemberNames类*{
本地人;
}
-keepclassswithmembers类*{
public(android.content.Context、android.util.AttributeSet);
}
-keepclassswithmembers类*{
public(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers类*扩展了android.app.Activity{
public void*(android.view.view);
}
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
-keep class*实现android.os.Parcelable{
公开静态最终android.os.Parcelable$Creator*;
}
这是否可以验证为用户将获取的相同二进制文件
他们是从游戏商店下载的吗?谷歌会干扰这个构建吗
还是它的元数据
不,用户将获得与您将上载到您的计算机的文件完全相同的文件
关于指定的异常-它告诉您,
AndroidManifest.xml
的android:name
属性中指定的Application
子类在final.apk文件中丢失。每次尝试运行应用程序的特定版本时,而不是“有时”,都应抛出此异常 我们的项目也遇到了类似的问题。Eclipse中的版本构建从左到右丢弃类
出于某种原因,当第一次完成调试构建时(一直到在模拟器上运行它),然后完成发布导出时,它开始工作
这听起来像是Eclipse中的一个bug,因为proguard甚至没有配置为在我们的
项目.properties
文件中使用。您可以附加您的AndroidManifest.xml文件吗?@Hit:Done,尽管值得注意的是,这不是一个新的应用程序,它只是一个新版本(6个游戏中断,我刚刚提交7个)。这和versionName
是清单中唯一更改的内容。您是否使用Proguard或其他模糊处理程序?@Hit:不是故意的,但在项目的根目录中有一个自动生成的模糊处理程序,我已经更新了我的问题。IMHO this:.application.APPLICATIONApplication
似乎很错误^^^我不太明白。我的理解是,我可以省略包的第一部分,只要它们是常见的。我的软件包进入com.COMPANY.android.APPLICATION
,然后进入.activity
,.provider
等。因此,将应用程序定义为.APPLICATION.APPLICATIONApplication
应该不是问题。此外,这个设置已经运行了将近一年,跨越了应用程序的6个版本。而且,当从Eclipse运行时,代码将正常运行。它似乎被完全、随机地限制在构建一个有符号的APK上。此外,正如我发布的摘录所示,我正在我的清单中定义我的包
,因此根据文档连接时,所有路径都是正确的。您是正确的,您可以使用“.subpackage.ClassName”作为应用程序类名。但我也有完全相同的问题,除了Eclipse也会发生。由于某些原因,Android builder根本不包括大块的应用程序类。你得到了有效的解决方案吗?对不起,我的问题是一个损坏的.classpath文件;输出被放在错误的目录中,这并不是ADT的错误:-),但还有一件事需要检查您是否有类似的问题。
<?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>
-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 *;
}