我正在尝试使用Maven构建我的Android应用程序.我使用的是android-maven-plugin版本3.0.2(已经尝试过3.0.0).一切顺利,但我的/ libs文件夹中的.so文件没有附加.文件夹结构如下:
-android
--src
--assets
--res
--libs
----armeabi
----armeabi-v7a
Run Code Online (Sandbox Code Playgroud)
我正在关注其中一个本机库示例中给出的pom.xml .APK编译很好,除了我称之为本机函数的部分之外几乎所有内容都运行.
从样本看,它看起来不像需要做任何事情.我感觉只有一个这样的文件被附加.有没有其他人遇到同样的问题?
我有一个使用maven-android插件的android项目设置.此插件遵循maven输出文件夹以获取文件的位置R.java(即target/generated-sources/r).
但是,在Eclipse中使用此项目时,我无法配置aapt依赖该文件夹.
即使我手动进入项目属性并手动设置文件夹,ADT插件也会进入并重置一些设置(即将/gen文件夹添加回源文件夹,并将输出文件夹还原/bin/classes为/target/classes),而离开maven /target/generated-sources/r文件夹并打破项目的构建.
我想在Eclipse ADT中使用默认的Maven文件夹结构.有关如何做到这一点的任何想法?
谢谢
回应评论:
/gen,因此如果target/generated-sources/r由于重复的类定义而仍然存在R.java ,则Eclipse无法编译.我有一个依赖第三方,仅二进制JNI库的android项目。使用ant,我可以将.so放到libs /中,将标头放到jni /中,然后完成。
但是,我的其余android项目都使用maven,并且我希望能够将此库集成到我现有的基于maven的项目中,就像我使用任何其他库一样(例如,带有<dependency />条目,库是从公司服务器自动下载的) 。
我曾尝试使用手动上传的.so文件,mvn deploy:deploy-file有-Dpackaging=so和-Dclassifier=armeabi,和在一个zip上传的标题和使用部署-Dpackaging=har。但是NDK仍然无法检测到库和标头。
我的Android.mk是
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := my-dependency
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
和我pom中的依赖
<dependency>
<groupId>com.thirdparty.my-dependency</groupId>
<artifactId>my-dependency</artifactId>
<version>1.0</version>
<classifier>armeabi</classifier>
<type>so</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在Android的Maven中部署这样的第三方库的最佳方法是什么?
在我正在开发的应用程序(这是我的第一个Android应用程序)中,我使用android-maven-plugin和maven-android-sdk-deployer.应用程序运行良好(使用ActionBarActivity的MainActivity已正确显示),直到我添加了google-play-servies库.之后我得到以下异常(除了向pom.xml添加必需的依赖项外,应用程序没有任何更改):
E/AndroidRuntime( 2146): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.acts.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
E/AndroidRuntime( 2146): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
E/AndroidRuntime( 2146): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
E/AndroidRuntime( 2146): at android.app.ActivityThread.access$800(ActivityThread.java:144)
E/AndroidRuntime( 2146): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
E/AndroidRuntime( 2146): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 2146): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime( 2146): at android.app.ActivityThread.main(ActivityThread.java:5221)
E/AndroidRuntime( 2146): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 2146): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 2146): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
E/AndroidRuntime( 2146): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
E/AndroidRuntime( 2146): Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or …Run Code Online (Sandbox Code Playgroud) android android-appcompat google-play-services android-maven-plugin
我是maven的新手并试图配置它用android-maven-plugin构建我的android项目.我在assets目录中有一个application.properties文件,其中包含不同的应用程序设置.我想从我的pom中获取这些价值.在属性文件中,我将一个属性定义为
myFilteredProperty=${helloFromPOM}
Run Code Online (Sandbox Code Playgroud)
并在POM中定义相同的属性:
<properties>
<helloFromPOM>MY PROPERTY</helloFromPOM>
</properties>
Run Code Online (Sandbox Code Playgroud)
切换资产dir上的过滤
<build>
...
<resources>
<resource>
<directory>${project.basedir}/assets</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
Run Code Online (Sandbox Code Playgroud)
并为android-maven-plugin的示例配置recources 插件
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但是当我试图在我的应用程序中使用此属性显示Toast时,我看到$ {helloFromPOM}而不是MY PROPERTY.
在我的maven生成的目标目录中,我在两个地方看到这个属性文件:
首先是错误的,它包含$ {helloFromPOM}而不是MY PROPERTY.其次,apk文件内部是正确的.但是当我在设备上安装这个apk时,它显示错误的值$ {helloFromPOM}.
我做错了什么?
编辑
谢谢你的回答,我尝试了,但得到这个错误:
[ERROR]生成源时出错.org.apache.maven.plugin.MojoExecutionException:在com.jayway.maven.plugins.android.phase01generatesources.GenerateSourcesMojo.generateR(GenerateSourcesMojo.java:338)在com.jayway.maven.plugins.android.phase01generatesources.GenerateSourcesMojo.execute( GenerateSourcesMojo.java:102)在org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)在org.apache .maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)在org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)在org.apache.maven.lifecycle.internal.LifecycleModuleBuilder .buildProject(LifecycleModuleBuilder.java:84)在org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)在org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183 )org.apache.maven.lifecycle.internal.LifecycleS tarter.execute(LifecycleStarter.java:161)org.apache.maven.maven.DefaultMaven.doExecute(DefaultMaven.java:320)org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)atg.apache.maven .cli.MavenCli.execute(MavenCli.java:537)org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)org.apache.maven.cli.MavenCli.main(MavenCli.java:141 )在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在java.lang.reflect中.方法.invoke(Method.java:597)org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java: 230)org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)org.codehaus.classworlds .Launche r.main(Launcher.java:47)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 25)at java.lang.reflect.Method.invoke(Method.java:597)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)引起:com.jayway.maven.plugins .android.ExecutionException:ANDROID-040-001:无法执行:Command = cmd.exe/X/C""C:\ Program Files\Android\android-sdk\platform-tools\aapt.exe"package -m - JD:\ projects\myapp\target\generated-sources\r -MD:\ projects\myapp\AndroidManifest.xml -SD:\ projects\myapp\target\filtered-assets --auto-add-overlay -AD:\ projects\myapp\assets -I"C:\ Program Files\Android\android-sdk\platforms\android-8\android.jar"",结果= 1在com.jayway.maven.plugins.android.CommandExecutor …
我正在开发一个Android库(SiriRestClient),其工件通过Maven进行管理,我正在使用Eclipse进行开发.我将工件打包为JAR文件,因为我在项目中没有任何资产,只有Java类,并且存在使用Eclipse/Maven/ADT将包装工件打包为apklibs的问题.
我还在开发一个依赖于SiriRestClient库的Android用户界面应用程序(SiriRestClientUI).我通过Maven管理对SiriRestClient库的依赖.
两个项目都在Eclipse中独立构建和部署.
问题:
自从我开始通过Maven管理SiriRestClient库对SiriRestClient库的依赖,如果我在Eclipse中同时打开了库项目和SiriRestClientUI,那么NoClassDefFoundError当我尝试将SiriRestClientUI应用程序部署到设备时,我会得到一个.
例如:
11-01 16:11:52.288: E/AndroidRuntime(9409): java.lang.NoClassDefFoundError: edu.usf.cutr.siri.android.client.config.SiriJacksonConfig
11-01 16:11:52.288: E/AndroidRuntime(9409): at edu.usf.cutr.siri.android.ui.MainActivity.onCreate(MainActivity.java:100)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.app.Activity.performCreate(Activity.java:4470)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.app.ActivityThread.access$600(ActivityThread.java:128)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.os.Looper.loop(Looper.java:137)
11-01 16:11:52.288: E/AndroidRuntime(9409): at android.app.ActivityThread.main(ActivityThread.java:4514)
11-01 16:11:52.288: E/AndroidRuntime(9409): at java.lang.reflect.Method.invokeNative(Native Method)
11-01 16:11:52.288: E/AndroidRuntime(9409): at java.lang.reflect.Method.invoke(Method.java:511) …Run Code Online (Sandbox Code Playgroud) 我使用android-release archetype生成了我的项目.
在其文档中指示在文件中添加android-release配置settings.xml文件.
我~/.m2/settings.xml看起来像这样:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>android-release</id>
<properties>
<sign.keystore>absolute path</sign.keystore>
<sign.alias>my_alias</sign.alias>
<sign.storepass>pass</sign.storepass>
<sign.keypass>pass</sign.keypass>
</properties>
</profile>
</profiles>
</settings>
Run Code Online (Sandbox Code Playgroud)
我的父pom.xml文件几乎与原型(版本1.0.8)生成的文件相同:
<?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>myapp-android</groupId>
<artifactId>myapp-android-parent</artifactId>
<version>1.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>myapp-android - Parent</name>
<modules>
<module>myapp-android</module>
<module>myapp-android-it</module>
</modules>
<scm>
<url>....</url>
<connection>....</connection>
<developerConnection>....</developerConnection>
<tag>HEAD</tag>
</scm>
<properties>
<platform.version>4.1.1.4</platform.version>
<android.dex.optimize>false</android.dex.optimize>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>ignition-releases</id>
<url>http://nexus.qype.com/content/repositories/releases</url>
</repository>
<repository>
<id>central</id>
<url>http://repo1.maven.org/maven2</url>
</repository>
<repository>
<id>com.jakewharton</id>
<url>http://r.jakewharton.com/maven/release</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies> …Run Code Online (Sandbox Code Playgroud) android jarsigner maven maven-archetype android-maven-plugin
我正在尝试使用以下方法开发Android应用程序:
Eclipse的月神4.4.0最新的ADT插件(https://dl-ssl.google.com/android/eclipse/)的Maven + Android的Maven的插件4.0.0-rc.2
在Eclipse IDE中,如果AndroidManifest.xml和res文件夹位于android项目的根目录中,一切正常.但是,如果这两个不在android项目的根目录中,则会显示错误,指出缺少这些文件.
有没有办法,在ADT插件中配置AndroidManifest.xml和res文件夹的位置?基本上,我想将它移动到src/main目录.
原因是,因为android-maven-plugin ver 4.x要求AndroidManifest.xml和res文件夹应该在src/main目录中,否则它不会构建.有没有办法在android-maven-plugin 4.x ++中配置AndroidManifest.xml和res文件夹的位置?
在我们的Android应用程序中,我们打开位于assets/config/notification.wav中的wav文件.要打开并播放声音,我们使用以下代码:
String soundClipPath = "config/notification.wav"
AssetFileDescriptor afd = mContext.getAssets().openFd(soundClipPath);
int soundID = mSoundPool.load(afd, 1);
Run Code Online (Sandbox Code Playgroud)
这已经解决了大约一年的任何问题.突然间,这已停止工作了.我们还没有更新构建之间的任何依赖关系.我能找到的唯一区别是,构建工作是从去年开始.如果我们在netbeans中本地构建apk,但是当我们使用hudson构建apk时它不起作用.我试过以下没有运气:
使用上面的代码时,我们得到以下stacktrace:
java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
at android.content.res.AssetManager.openAssetFd(Native Method)
at android.content.res.AssetManager.openFd(AssetManager.java:331)
...
Run Code Online (Sandbox Code Playgroud)
尝试从res/raw文件夹加载时,以下内容:
android.content.res.Resources$NotFoundException: File res/raw/notification.wav from drawable resource ID #0x7f040000
at android.content.res.Resources.openRawResourceFd(Resources.java:981)
at android.media.SoundPool.load(SoundPool.java:191)
...
Run Code Online (Sandbox Code Playgroud)
有人可以帮我们解决这个奇怪的问题....
最好的祝福,
亨里克
android filenotfoundexception android-assets android-maven-plugin
所以我在我编写的模块中有一些类来帮助进行Robolectric样式单元测试,我希望能够在一堆其他模块中共享这个模块.这个模块有自己的单元测试,我把它设置为apklib.我正在使用maven-android-plugin.问题似乎是它不能识别测试范围内的apklibs.有没有解决方法,或者我错过了什么?
我注意到的一件事是,如果我运行命令mvn install,所有构建和我的所有测试运行正常,但如果我这样做mvn test说它找不到类.
我配置了一些插件目标,在我的构建生命周期的某些阶段(maven android应用程序)中执行.但我认为我在配置插件时遇到了一个错误,并希望确保它们真正被调用.我发现这个命令将打印所有生命周期阶段和目标:mvn help:describe -Dcmd=install但它没有显示我配置的目标.因此,我有两个问题:
mvn help:describe -Dcmd=install命令是否显示我在<build>/<plugins>/<plugin>/<executions>/<execution>
pom标签内配置的目标?
如何确保在构建生命周期中调用阶段和阶段期间调用的目标?
更新 我正在尝试配置maven-android-plugin并希望在包阶段执行zipalign目标
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>3.2.0</version>
<extensions>true</extensions>
<configuration>
<sdk>
<platform>8</platform>
</sdk>
<emulator>
<avd>2.3.3_API-10</avd>
</emulator>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
<assetsDirectory>${project.build.directory}/filtered-assets</assetsDirectory>
<androidManifestFile>${project.build.directory}/filtered-manifest/AndroidManifest.xml</androidManifestFile>
<zipalign>
<skip>false</skip>
<verbose>${build.verbosity}</verbose>
<inputApk>${project.build.directory}/${project.artifactId}-${build.version.name}.apk</inputApk>
<outputApk>${project.build.directory}/${project.artifactId}-${build.version.name}-aligned.apk</outputApk>
</zipalign>
</configuration>
<executions>
<execution>
<id>zipalign</id>
<phase>package</phase>
<goals>
<goal>zipalign</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud) android ×10
maven ×9
adt ×1
android-ndk ×1
eclipse ×1
eclipse-adt ×1
jarsigner ×1
java ×1
m2eclipse ×1
maven-plugin ×1
unit-testing ×1