在ClassNotFoundException的APK用Maven构建 [英] ClassNotFoundException in apk build with maven

查看:223
本文介绍了在ClassNotFoundException的APK用Maven构建的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要切换到Maven在Android开发我的构建过程。我跟着的http://www.sonatype.com/books/mvnref-book/reference/android-dev-sect-archetype.html创建的pom.xml和调整的版本了一点,所以我使用了最新版本的Andr​​oid,Maven的插件。

虽然我的apk会从我的IDE(IntellJ)中手动生成细,有与使用Maven构建的APK问题。显然,一些遗漏,不把阶级到APK。

当我检查这两个生成APK(解压缩它),我发现Maven的生成APK的classes.dex要小得多(2.6kB)比普通一(24.9kB)。显然类丢失在那里。

所以,开始此apk的时候,我得到了以下错误:

  E / AndroidRuntime(31228):致命异常:主要
E / AndroidRuntime(31228):了java.lang.RuntimeException:无法实例活动ComponentInfo {} com.mycompany.abc/com.mycompany.abc.ABCActivity:抛出java.lang.ClassNotFoundException:com.mycompany.abc.ABCActivity装载机的Dalvik .system.PathClassLoader [/mnt/asec/com.mycompany.abc-1/pkg.apk]
E / AndroidRuntime(31228):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)
E / AndroidRuntime(31228):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
E / AndroidRuntime(31228):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
E / AndroidRuntime(31228):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931)
E / AndroidRuntime(31228):在android.os.Handler.dispatchMessage(Handler.java:99)
E / AndroidRuntime(31228):在android.os.Looper.loop(Looper.java:130)
E / AndroidRuntime(31228):在android.app.ActivityThread.main(ActivityThread.java:3683)
E / AndroidRuntime(31228):在java.lang.reflect.Method.invokeNative(本机方法)
E / AndroidRuntime(31228):在java.lang.reflect.Method.invoke(Method.java:507)
E / AndroidRuntime(31228):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
E / AndroidRuntime(31228):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E / AndroidRuntime(31228):在dalvik.system.NativeStart.main(本机方法)
E / AndroidRuntime(31228):抛出java.lang.ClassNotFoundException:致com.mycompany.abc.ABCActivity装载机dalvik.system.PathClassLoader [/mnt/asec/com.mycompany.abc-1/pkg.apk]
E / AndroidRuntime(31228):在dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
E / AndroidRuntime(31228):在java.lang.ClassLoader.loadClass(ClassLoader.java:551)
E / AndroidRuntime(31228):在java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E / AndroidRuntime(31228):在android.app.Instrumentation.newActivity(Instrumentation.java:1021)
E / AndroidRuntime(31228):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
E / AndroidRuntime(31228):... 11个
W / ActivityManager(4964):力整理活动com.mycompany.abc/.ABCActivity
W / ActivityManager(4964):为HistoryRecord活动暂停超时{40902960 com.mycompany.abc/.ABCActivity}

这是我的pom.xml,关于这一点我使用: MVN安装-P标志 MVN安卓APK

 <?XML版本=1.0编码=UTF-8&GT?;
<项目的xmlns =htt​​p://maven.apache.org/POM/4.0.0的xmlns:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance
  XSI:的schemaLocation =htt​​p://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">
  < modelVersion> 4.0.0< / modelVersion>
  <&的groupId GT; com.mycompany< /的groupId>
  <&的artifactId GT; com.mycompany.abc< / artifactId的>
  <&版GT; 1.0-SNAPSHOT< /版本>
  <包装和GT;&APK LT; /包装>
  <名称>&com.mycompany.abc LT; /名称>    <依赖和GT;
        <&依赖性GT;
            <&的groupId GT; com.google.android< /的groupId>
            <&的artifactId GT; Android设备和LT; / artifactId的>
            <&版GT; 2.2.1< /版本>
            <&范围GT;及提供LT; /&范围GT;
        < /依赖性>
    < /依赖和GT;    <建立>
        <&插件GT;
            <&插件GT;
                <! - 只需阅读从文件属性 - >
                <的groupId方式>组织codehaus.mojo< /的groupId>
                <&的artifactId GT;属性 - Maven的插件< / artifactId的>
                <&版GT; 1.0-α-2'; /版本>
                <&执行GT;
                    <执行与GT;
                        <阶段>&初始化LT; /阶段>
                        <目标>
                            <&目标GT;读项目​​的属性< /目标>
                        < /目标>
                        <结构>
                            <&文件GT;
                                <文件>&android.properties LT; /文件>
                            < /文件>
                        < /结构>
                    < /执行>
                < /处决>
            < /插件>            <&插件GT;
                <&的groupId GT; com.jayway.maven.plugins.android.generation2< /的groupId>
                <&的artifactId GT; Android的Maven的插件< / artifactId的>
                <&版GT; 3.2.0< /版本>
                <结构>
                    &LT; androidManifestFile&GT; $ {} project.basedir /AndroidManifest.xml</androidManifestFile>
                    &LT; assetsDirectory&GT; $ {} project.basedir /资产&LT; / assetsDirectory&GT;
                    &LT; resourceDirectory&GT; $ {} project.basedir / RES&LT; / resourceDirectory&GT;
                    &LT; nativeLibrariesDirectory&GT; $ {} project.basedir /钢骨混凝土/主/天然的LT; / nativeLibrariesDirectory&GT;
                    &LT; SDK开发及GT;
                        &LT;平台和GT 11 LT; /平台&GT;
                    &LT; / SDK&GT;
                    &LT; deleteConflictingFiles&GT;真&LT; / deleteConflictingFiles&GT;
                    &LT; undeployBeforeDeploy&GT;真&LT; / undeployBeforeDeploy&GT;
                    &LT;装置&gt; USB&LT; /装置&gt;
                &LT; /结构&gt;
                &LT;附加功能,GT;真&LT; /扩展&GT;
            &LT; /插件&GT;            &LT;&插件GT;
                &LT;&的artifactId GT; Maven的编译器插件&LT; / artifactId的&GT;
                &LT;&版GT; 2.3.2&LT; /版本&GT;
                &LT;结构&gt;
                    &lt;信源&GT; 1.6 LT; /源&GT;
                    &lt;目标&GT; 1.6 LT; /目标与GT;
                &LT; /结构&gt;
            &LT; /插件&GT;            &LT;&插件GT;
                &LT;&的artifactId GT;的exec-Maven的插件&LT; / artifactId的&GT;
                &LT;的groupId方式&gt;组织codehaus.mojo&LT; /的groupId&GT;
                &LT;结构&gt;
                    &LT;可执行指令GT; $ {BASEDIR} /scripts/run_app.sh</executable>
                &LT; /结构&gt;
            &LT; /插件&GT;        &LT; /插件&GT;
    &LT; /构建&GT;    &LT;型材&GT;
        &LT;型材&GT;
            &LT;&ID gt;登录&LT; / ID&GT;
            &LT;建立&GT;
                &LT;&插件GT;
                    &LT;&插件GT;
                        &LT;&的groupId GT; org.apache.maven.plugins&LT; /的groupId&GT;
                        &LT;&的artifactId GT;的maven-的jarsigner,插件和LT; / artifactId的&GT;
                        &LT;&版GT; 1.2 LT; /版本&GT;
                        &LT;&执行GT;
                            &LT;执行与GT;
                                &LT;&ID GT;签署和LT; / ID&GT;
                                &LT;目标&GT;
                                    &LT;&目标gt;登录&LT; /目标&GT;
                                &LT; /目标&GT;
                                &LT;阶段&gt;包装及LT; /阶段&gt;
                                &LT;&继承GT;真&LT; /继承&GT;
                                &LT;结构&gt;
                                    &LT; archiveDirectory&GT;&LT; / archiveDirectory&GT;
                                    &所述包括(includes)GT;
                                        &LT;包括方式&gt;目标/ * APK&LT; / - 包括GT;
                                    &LT; / - 包括GT;
                                    &LT;&密钥存储GT; /path/to/debug.keystore< /密钥库&GT;
                                    &LT;&Storepass用于GT; Android设备和LT; / Storepass用于&GT;
                                    &LT;&keypass的GT; Android设备和LT; / keypass的&GT;
                                    &LT;&别名GT; androiddebugkey&LT; /别名&GT;
                                    &LT;&参数GT;
                                        &LT;&说法GT;&-sigalg LT; /参数&GT;&LT;&说法GT; MD5withRSA&LT; /参数&GT;
                                        &LT;&说法GT; -digestalg&LT; /参数&GT;&LT;&说法GT; SHA1&LT; /参数&GT;
                                    &LT; /参数&GT;
                                &LT; /结构&gt;
                            &LT; /执行&GT;
                        &LT; /处决&GT;
                    &LT; /插件&GT;
                    &LT;&插件GT;
                        &LT;&的groupId GT; com.jayway.maven.plugins.android.generation2&LT; /的groupId&GT;
                        &LT;&的artifactId GT; Android的Maven的插件&LT; / artifactId的&GT;
                        &LT;&继承GT;真&LT; /继承&GT;
                        &LT;结构&gt;
                            &LT;广告及GT;
                                &LT;调试和GT假LT; /调试&GT;
                            &LT; /标志&GT;
                        &LT; /结构&gt;
                    &LT; /插件&GT;
                &LT; /插件&GT;
            &LT; /构建&GT;
        &LT; / profile文件&GT;
    &LT; /型材&GT;&LT; /项目&GT;


解决方案

发现了问题:

 &LT; sourceDirectory&GT;&SRC LT; / sourceDirectory&GT;

构建部分失踪。想知道为什么,虽然Android的原型。(运行原型时:产生)不已经包含了,因为它在Android的pretty标准

I want to switch to maven for my build process in Android development. I followed http://www.sonatype.com/books/mvnref-book/reference/android-dev-sect-archetype.html to create the pom.xml and adjusted the version a bit so that I'm using the latest version of the android-maven-plugin.

While my apk gets build fine manually from within my IDE (IntellJ), there are problems with the apk built with maven. Obviously something's missing that doesn't put the classes into the apk.

When I check both generated apk (unzipping it), I find that the classes.dex of the maven generated apk is much smaller (2.6kB) than the regular one (24.9kB). Obviously classes are missing in there.

So, when starting this apk, I'm getting the following error:

E/AndroidRuntime(31228): FATAL EXCEPTION: main
E/AndroidRuntime(31228): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mycompany.abc/com.mycompany.abc.ABCActivity}: java.lang.ClassNotFoundException: com.mycompany.abc.ABCActivity in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.abc-1/pkg.apk]
E/AndroidRuntime(31228):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)
E/AndroidRuntime(31228):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
E/AndroidRuntime(31228):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
E/AndroidRuntime(31228):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
E/AndroidRuntime(31228):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(31228):    at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(31228):    at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime(31228):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(31228):    at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(31228):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime(31228):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime(31228):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(31228): Caused by: java.lang.ClassNotFoundException: com.mycompany.abc.ABCActivity in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.abc-1/pkg.apk]
E/AndroidRuntime(31228):    at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
E/AndroidRuntime(31228):    at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
E/AndroidRuntime(31228):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(31228):    at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
E/AndroidRuntime(31228):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
E/AndroidRuntime(31228):    ... 11 more
W/ActivityManager( 4964):   Force finishing activity com.mycompany.abc/.ABCActivity
W/ActivityManager( 4964): Activity pause timeout for HistoryRecord{40902960 com.mycompany.abc/.ABCActivity}

This is my pom.xml, on which I use: mvn install -P sign or mvn android:apk

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>com.mycompany.abc</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>apk</packaging>
  <name>com.mycompany.abc</name>

    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <version>2.2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- Simply read properties from file -->
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0-alpha-2</version>
                <executions>
                    <execution>
                        <phase>initialize</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>android.properties</file>
                            </files>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
                    <assetsDirectory>${project.basedir}/assets</assetsDirectory>
                    <resourceDirectory>${project.basedir}/res</resourceDirectory>
                    <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
                    <sdk>
                        <platform>11</platform>
                    </sdk>
                    <deleteConflictingFiles>true</deleteConflictingFiles>
                    <undeployBeforeDeploy>true</undeployBeforeDeploy>
                    <device>usb</device>
                </configuration>
                <extensions>true</extensions>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>exec-maven-plugin</artifactId>
                <groupId>org.codehaus.mojo</groupId>
                <configuration>
                    <executable>${basedir}/scripts/run_app.sh</executable>
                </configuration>
            </plugin>

        </plugins>
    </build>

    <profiles>
        <profile>
            <id>sign</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jarsigner-plugin</artifactId>
                        <version>1.2</version>
                        <executions>
                            <execution>
                                <id>signing</id>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                                <phase>package</phase>
                                <inherited>true</inherited>
                                <configuration>
                                    <archiveDirectory></archiveDirectory>
                                    <includes>
                                        <include>target/*.apk</include>
                                    </includes>
                                    <keystore>/path/to/debug.keystore</keystore>
                                    <storepass>android</storepass>
                                    <keypass>android</keypass>
                                    <alias>androiddebugkey</alias>
                                    <arguments>
                                        <argument>-sigalg</argument><argument>MD5withRSA</argument>
                                        <argument>-digestalg</argument><argument>SHA1</argument>
                                    </arguments>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                        <artifactId>android-maven-plugin</artifactId>
                        <inherited>true</inherited>
                        <configuration>
                            <sign>
                                <debug>false</debug>
                            </sign>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>

解决方案

Found the problem:

<sourceDirectory>src</sourceDirectory>

was missing in the build section. Wondering though why the Android archetype (when running archetype:generate) doesn't already include that, as it's pretty standard in Android.

这篇关于在ClassNotFoundException的APK用Maven构建的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆