У меня возникла следующая проблема: есть приложение, которое состоит из двух связанных проектов: основной и порт для андроида. Порт для андроида собираю ant-ом, им же и подписываю. Файл apk нормально создается, когда сбросить этот файл на устройство и запустить, приложение нормально устанавливается и работает. Но когда приложение публикуется на Google Play, при запуске появляется сообщение про неожиданное завершение работы программы. LogCat показывает
ошибку10-16 10:21:49.059: E/AndroidRuntime(10140): FATAL EXCEPTION: main
10-16 10:21:49.059: E/AndroidRuntime(10140): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.fractal.labs.fruity.hunter.free/com.fractal.labs.fruity.hunter.free.FruityHunterActivity}: java.lang.ClassNotFoundException: com.fractal.labs.fruity.hunter.free.FruityHunterActivity in loader dalvik.system.PathClassLoader[/data/app/com.fractal.labs.fruity.hunter.free-1.apk]
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1680)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.app.ActivityThread.access$1500(ActivityThread.java:123)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.os.Handler.dispatchMessage(Handler.java:99)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.os.Looper.loop(Looper.java:130)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.app.ActivityThread.main(ActivityThread.java:3835)
10-16 10:21:49.059: E/AndroidRuntime(10140): at java.lang.reflect.Method.invokeNative(Native Method)
10-16 10:21:49.059: E/AndroidRuntime(10140): at java.lang.reflect.Method.invoke(Method.java:507)
10-16 10:21:49.059: E/AndroidRuntime(10140): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
10-16 10:21:49.059: E/AndroidRuntime(10140): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
10-16 10:21:49.059: E/AndroidRuntime(10140): at dalvik.system.NativeStart.main(Native Method)
10-16 10:21:49.059: E/AndroidRuntime(10140): Caused by: java.lang.ClassNotFoundException: com.fractal.labs.fruity.hunter.free.FruityHunterActivity in loader dalvik.system.PathClassLoader[/data/app/com.fractal.labs.fruity.hunter.free-1.apk]
10-16 10:21:49.059: E/AndroidRuntime(10140): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
10-16 10:21:49.059: E/AndroidRuntime(10140): at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
10-16 10:21:49.059: E/AndroidRuntime(10140): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
10-16 10:21:49.059: E/AndroidRuntime(10140): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672)
10-16 10:21:49.059: E/AndroidRuntime(10140):… 11 more
Вот манифест
AndroidManifest.xml <?xml version=«1.0» encoding=«utf-8»?>
<manifest xmlns:android=«
schemas.android.com/apk/res/android»
package=«com.fractal.labs.fruity.hunter.free»
android:versionCode=«2»
android:versionName=«1.0» >
<uses-sdk android:minSdkVersion=«7» />
<uses-permission android:name=«android.permission.VIBRATE»/>
<uses-permission android:name=«android.permission.INTERNET»/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".FruityHunterActivity"
android:label="@string/app_name" android:screenOrientation=«landscape»>
<intent-filter>
<action android:name=«android.intent.action.MAIN» />
<category android:name=«android.intent.category.LAUNCHER» />
</intent-filter>
Вот класс стартовой деятельности
FruityHunterActivity.javapackage com.fractal.labs.fruity.hunter.free;
import java.util.Locale;
import android.os.Bundle;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.fractal.labs.fh.FrontController;
public class FruityHunterActivity extends AndroidApplication {
/** Called when the activity is first created. */
Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initialize(FrontController.getInstance(Locale.getDefault(), false, false), false);
}
}
Вот вырезка из build.xml
<target name="build.free.nohd" depends="make.symlinks.free.nohd">
<mkdir dir="${export.path}"/>
<exec command="${android.command.dir}/android update project -p ${android.free.nohd}"/>
<exec command="ant release" dir="${android.free.nohd}"/>
<exec command="jarsigner -keystore ${keystore.name} -signedjar ${android.free.nohd.release}.noalign -storepass ${keystore.pass} -keypass ${alias.pass} ${android.free.nohd.nosign} ${alias.name}"/>
<exec command="${android.command.dir}/zipalign -f -v 4 ${android.free.nohd.release}.noalign ${android.free.nohd.release}"/>
</target>
Что интересно, перед этим все нормально работало, и на google play заливалось и устанавливалось без проблем. Сборка производилась с помощью Eclipse. Да и сейчас все работает нормально ровно до момента заливки на Google Play. То есть, может, google play как-либо обрабатывает apk, и это нужно как-то учитывать?
Еще такой вроде мелкий вопрос. Как правильно в манифесте именовать деятельность: .Activity, Activity, com.app.Activity? на том же StackOverflow пишут разные варианты, какая между ними разница.
Сборка android проекта в Eclipse имеет какие-либо подводные камни? Например, в случае сборки двух связанных проектов. Я добавил просто в ant.properties строчку source.dir=../FruityHunterDesktop/src/com/ Если у кого есть опыт сборки антом, просьба поделиться примерами кусков build.xml.