私は少し混乱しており、Eclipse、ADT、および Google Play で発生している問題に少しイライラしています。
OS X 10.8.2、Eclipse 4.2.1、および ADT 20.0.3 を実行しています。
以下は、問題の原因となっているワークフローです。
- 開発者のアルファは、内部/外部リリース向けの Android アプリのビルドを担当しています。
- 他の開発者はアプリで作業し、変更を GitHub にプッシュします。
- Developer Alpha は標準のプル/マージツールなどを行います
- Alpha は Eclipse を開き、メイン プロジェクトと 2 つのライブラリ プロジェクト (ActionBarSherlock と FacebookSdk) を更新します。
- Alpha は Project > Clean > All を実行します
- この時点で実行すると、OS 2.3.3 から 4.0.1 までの範囲で、シミュレーターとハードウェアの両方で正常に動作するアプリケーションが作成されます。
- Alpha は Android Tools > Export Signed 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
さて、私の質問は、アプリケーションのサブクラスがパッケージ化されていない/表示されていないのはなぜですか?
さらに悪いことに、私たちは 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 *;
}