scala+maven开发android程序
Shiva Wu
转载请注明出处
0、前言
刚刚入了一个android手机,想玩一玩开发。
本想用eclipse了事,如果只用java的话,eclipse的adt确实很不错,还有可视化的界面设计。无奈scala-ide太不给力,卡的要命,而且根本不能正常识别scala写出来的Activity,无奈放弃。
引用
IDEA也尝试了一下,IDEA的scala插件一向是最稳定的,不过IDEA本身实在是慢,而且启动模拟器程序部署不上去,打开模拟器之后IDEA就一直在Waiting for device中,不知道什么情况,估计linux下没这个问题。
以上问题如果谁知道怎么办麻烦告知。
还有一篇用ant做scala on android开发的文章,
http://chneukirchen.org/blog/archive/2009/04/programming-for-android-with-scala.html,很专业。
言归正传。
emacs的scala-mode+ensime还是很不错的,可以和sbt、maven结合。于是决定尝试maven。
顺便说,maven-scala-plugin的continuous build在windows下有问题,但是ensime本身提供了这个功能,所以也没有关系。
引用
使用的系统环境:
1、生成archetype
archetype参考了java的,具体看这里:
https://github.com/akquinet/android-archetypes
这里使用简单的quickstart,执行
mvn archetype:generate -DarchetypeGroupId=de.akquinet.android.archetypes -DarchetypeArtifactId=android-quickstart -DarchetypeVersion=1.0.4 -DgroupId=com.ga -DartifactId=hello -Dversion=1.0-SNAPSHOT
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Archetype repository missing. Using the one from [de.akquinet.android.archetypes:android-quickstart:1.0.4] found in ca
talog remote
[INFO] Using property: groupId = com.ga
[INFO] Using property: artifactId = hello
[INFO] Using property: version = 1.0-SNAPSHOT
[INFO] Using property: package = com.ga
[INFO] Using property: platform = 7
Confirm properties configuration:
groupId: com.ga
artifactId: hello
version: 1.0-SNAPSHOT
package: com.ga
platform: 7
Y: :
[WARNING] Don't override file D:\Temp\hello\pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.052s
[INFO] Finished at: Mon Jan 17 16:50:10 CST 2011
[INFO] Final Memory: 5M/10M
[INFO] ------------------------------------------------------------------------
还说不要改动pom.xml,这里只好无视了。
2、加入scala nature
引用
1、首先在pom.xml加入scala-library依赖,将原来的dependencies tag改成
<properties>
<encoding>UTF-8</encoding>
<scala.version>2.8.1</scala.version>
</properties>
<repositories>
<repository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
</dependencies>
2、加上scala-plugin的依赖,在build标签中:
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-make:transitive</arg>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
3、由于我用2.2的系统,所以把platform标签改成8。
4、下面删掉原来的HelloAndroidActivity.java,创建HelloAndroidActivity.scala。
package com.ga
import android.app.Activity
import android.os.Bundle
import android.util.Log
class HelloAndroidActivity extends Activity {
override def onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
}
}
这个时候使用mvn compile编译应该是通过的,前提是Android SDK已经装好,可能还要在环境变量里面设置一下ANDROID_HOME。
3、打包发布
这个时候使用mvn package,经过漫长的等待之后,应该会出现错误。
究其原因,dx.bat不能正确打包scala-library,主要集中在scala.actors和scala.concurrency。这里有一个issue提交,
http://code.google.com/p/android/issues/detail?id=7147,2.7.7版本是正常的,可能2.8.1改动了代码就又有问题了。
Anyway,即使能够正确运行,打出来的包的大小也是很恐怖的。所以要减肥。
这里使用proguard 4.4,虽然最新版是4.5.1,但是maven repo上没有更新,不知道为什么,如果想用最新版可以将相应的版本install的本地仓库上。
引用
首先在pom.xml里面加入proguard-maven-plugin的依赖,这个插件也很久没有更新,有些功能上的缺陷,留待后面谈。
<plugin>
<groupId>com.pyx4me</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.4</version>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<maxMemory>512m</maxMemory>
<injar>android-classes</injar>
<inFilter>
!scala/Enumeration**,!scala/collection**
</inFilter>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
<exclusions>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
</exclusion>
</exclusions>
<!--<proguardInclude>${basedir}/proguard.conf</proguardInclude>-->
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard</artifactId>
<version>4.4</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
比较一下上面的代码和wiki页面上的不同。
- 使用版本4.4
- 将-Xmx参数设到512m,实际不需要,下面解释。
- 加入了scala-library的exclusion。这个原因是,android-plugin会把整个scala-library解压到classes里面,但这个jar包还在依赖中,所以也会以libraryjars的形式输入给proguard,会导致大片的duplicated classes definition,而且读入两遍之后会出现OutOfMemoryError,这也是2的目的。这里把它从libraryjars中排除就彻底解决了这个问题。
- 去掉了keep class等,把它放到了一个新的文件中,这样更容易配置,因为插件给出的设置选项还是有限。其次,wiki上的配置是错误的,会把scala-library整个精简掉,导致程序崩溃。下载附件中的proguard.conf,和pom.xml放在一起,如果想要使用其他文件名,参见上面注释的proguardInclude。
- 加入了scala.Enumeration和scala.collection的filter,前者会生成大把莫名其妙的warning,而且Enumeration已经是不推荐使用的类了;后者由于太大了,为了减小体积。此条为个人喜好,不加也没有问题。
这个时候执行mvn package就可以看到生成的hello-1.0-SNAPSHOT.apk,大小为70k,还算可以。
启动一个模拟器,然后mvn android:deploy就可以部署上去了。实际还可以直接部署到真机上,windows用一个usb driver,官网有下,还没有尝试过。
放一张截图。
4、优化
上面的过程实际还可以优化,一个完整的mvn clean package android:deploy还是要花上将近一分钟的时间。
主要还是集中在proguard的打包上,而且这也涉及到发布程序的时候的大小。
引用
目前想到的可以加速的几点:
- 每次android-plugin都会把所有的依赖库解压一遍,这个非常慢,可以作为一个feature request提出来,对于库依赖这个插件没有处理好。
- rt.jar的读取也是很慢的,可以在rt.jar加入过滤(java/**,javax/**),这个也是官网推荐的。但是由于proguard-maven-plugin不支持这个选项,所以可以把-libraryjars rt.jar(filter)加入到proguard.conf里面,去掉上面的libs标签。有一利就有一弊,这样的话就不能跨平台,因为rt.jar的路径是固定的。
- filter掉一部分scala-library,篇头提到的scala-android.jar应该也是做了同样的事情。甚至可以直接做一个精简的jar出来install到本地仓库上,这样也可以减小第一条浪费的时间。前面也提到actors和concurrency不能被dx正确打包,所以估计这两个特性是不能用了。collection虽然很强大,但是本身也太大了,如果注重效率还是用java的容器吧。
- proguard还有obfuscate和optimize特性可以用,都能减小大小,不过optimize可能会让程序崩溃。上面的程序obfuscate后变成50K,可以运行。optimize后40K,但是会崩溃,可能需要调整一些细微的参数。
如果有更好的方法建议欢迎讨论。
- 大小: 24.6 KB
分享到:
相关推荐
【标题】"play2-maven-plugin-1.0.0-alpha9.zip" 是一个与Play框架相关的Maven插件的版本包,它主要用于构建和管理基于Play 2.x的Java或Scala应用程序。Play框架是一个开源的Web应用框架,遵循模型-视图-控制器(MVC...
### Kotlin for Java or Android 中文开发文档 #### 概述 Kotlin 是一种现代的、静态类型的编程语言,设计初衷是为了提升 Java 开发者的生产力,同时也保持与 Java 的完全兼容性。Kotlin 提供了一系列创新的功能,...
《kotlin-for-android-developers》这本书是专门针对Android开发者使用Kotlin语言的指南。Kotlin是一种运行在Java虚拟机上的静态类型...通过掌握这些知识点,Android开发者可以更高效地利用Kotlin进行应用程序的开发。
它由JetBrains团队开发,并得到了Google的支持,在Android开发领域尤为突出。 ##### 1. **Kotlin用于服务器端** - **表现力强**:Kotlin提供了诸如类型安全构建器、委托属性等功能,这使得开发者能够创建既强大又...
IntelliJ IDEA是一款由JetBrains公司开发的集成开发环境(IDE),被广泛应用于Java、Kotlin、Groovy、Scala等多种编程语言的开发。这个“intellijidea开发工具文档.rar”压缩包显然包含了有关IntelliJ IDEA的详细...
通过`maven`构建工具,可以轻松地将`fastjson-1.2.75.jar`添加到项目依赖中,从而在Spark作业或Scala程序中使用Fastjson的功能。 总的来说,Fastjson是Java开发者处理JSON数据的利器,无论是在小型项目还是大数据...
开发人员利用Maven作为构建工具,并遵循Java 11、Scala 12和Kotlin 1.5的语法规范。项目结构包含了一个基本的Maven配置文件pom.xml和源代码目录src,展示了如何在Spring Boot环境中整合不同的编程语言和技术。对于想...
3. **移动应用**:Android操作系统使用JAVA语言作为主要开发语言,开发者可以利用Android SDK和各种工具进行APP开发。 4. **大数据处理**:Apache Hadoop、Spark等大数据处理框架大量使用JAVA,使得JAVA在大数据领域...
- Android Studio:用于Android开发,基于IntelliJ IDEA社区版进行迭代。 IntelliJ IDEA被认为是Java开发领域中最佳的IDE之一,它支持企业级、移动和Web应用的开发,并且内置了对最新技术框架的支持。 ### ...
5. **使用场景**:这个库对于开发跨平台的应用程序特别有用,例如消息传递应用、社交媒体客户端或任何需要在不同设备上显示一致emoji的地方。它可以帮助开发者避免因字体兼容性问题导致的用户体验差异。 6. **API...
而使用Kotlin来构建Android APP更是能够大大提升开发效率和程序的可维护性。 在进行服务器端开发时,Kotlin有着强大的表现力,能够编写出简洁且表达力强的代码。Kotlin的新式语言特性例如类型安全的构建器和委托...
Kotlin语法简洁,表达能力强,易于学习,非常适合进行服务器端开发以及Android应用开发。 Kotlin的基本语法包括了一些基本的类型声明、控制流语句、类和对象的定义、接口和继承、可见性修饰符、扩展、数据类、密封...
Kotlin语言,作为Google官方推荐的Android开发语言,正逐渐取代Java成为Android开发的主流选择。Kotlin以其简洁、安全、表达能力强等特点受到广大开发者的青睐。由于它能与Java完全互操作,开发者们能够将已有的Java...
它于2016年被Google宣布为Android官方开发语言,并且被广泛用于服务器端开发、Android开发以及Web开发等多种场合。Kotlin的设计目标是解决Java语言中的一些痛点,并与Java保持高度的互操作性。 Kotlin的核心特性...
此外,Kotlin也非常适合开发Android应用程序。它提供了Android Studio官方支持,可以使用Java开发的所有库和框架。Kotlin在编写界面时更为简洁,并且其对null安全的处理减少了空指针异常的风险。 Kotlin还支持...
- **Android Studio**:由 Google 基于 IntelliJ IDEA 社区版进行二次开发而成,专门用于 Android 应用开发。 ##### 2. IntelliJ IDEA 介绍 IntelliJ IDEA 被誉为最佳 Java 开发工具之一,在智能代码辅助、代码...
- **Android Studio**:由 Google 基于 IntelliJ IDEA 社区版定制开发而成,专为 Android 应用程序设计。 - **PhpStorm**:PHP 专用开发工具。 - **RubyMine**:针对 Ruby 及 Rails 的 IDE。 - **PyCharm**:Python ...
此外,Kotlin特别关注开发Android应用和企业级应用。 ### 工具和文档 Kotlin支持多种构建工具,如Maven、Ant和Gradle。官方提供了丰富的文档资源,包括语言指南、API参考和FAQ,帮助开发者了解和学习Kotlin语言。 ...