2

私は少し混乱しており、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 *;
}
4

2 に答える 2

1

私たちのプロジェクトにも同様の問題がありました。Eclipse のリリース ビルドでは、左右のクラスが破棄されていました。

何らかの理由で、デバッグビルドが最初に実行され (エミュレーターで実行するまで)、リリースエクスポートが実行されると、動作が開始されました。

proguard はproject.propertiesファイルで使用するように構成されていないため、これは Eclipse のバグのように思えます。

于 2012-11-21T14:45:47.753 に答える
0

これは、ユーザーが Play ストアからダウンロードした後に入手するものと同じバイナリであることが証明できるでしょうか? Google はビルドやそのメタデータをまったくいじらないのですか?

いいえ、Google Play デベロッパー コンソールにアップロードするファイルとまったく同じ ファイルがユーザーに届きます。.apk

指定された例外について -タグの属性でApplication指定されたサブクラスが最終的な「.apk」ファイルにないことがわかります。この例外は、「時々」ではなく、アプリの特定のビルドを実行しようとするたびにスローする必要があります。android:name<application>AndroidManifest.xml

于 2012-10-29T15:02:07.890 に答える