繁体   English   中英

具有IntelliJ Idea ClassNotFoundException的Android上的Scala

[英]Scala on Android with IntelliJ Idea ClassNotFoundException

我尝试将sbt和maven用于android-scala,我非常喜欢maven进行整个发布(ProGuard-ing scala standar lib等)。 但是我想在我的IDE-IntelliJ IDEA中进行轻量级的重新编译周期进行开发。

问题是Scala文件无法编译。 我这样配置我的项目:

  • 创建了android项目
  • 添加了scala方面
  • 将scala编译器设置为全局
  • 添加了对scala库(全局)的依赖关系并将其设置为“提供”

我添加了一个scala对象,并从java Activity中引用了它。 ClassNotFoundException并强制关闭。 它可以干净地编译(并且相当方便)。

我以相同的方式并使用相同的全局库创建了一个普通的旧Java项目,它可以正常工作。 对apk的检查显示,其中包含scala source(!)文件。 因此,显然它没有尝试进行编译。

哦,我的电话已经从Play商店预装了Scala安装程序。

我使用IntelliJ IDEA 11社区。 几个月前,我第一次尝试了此方法,并且效果很好。

更新它可以在其他计算机上运行。

您可能不得不摆弄“ proguard.cfg”文件。

这是我在使用带有IntelliJ IDE的Scala 2.10和Android的项目中使用的(更改第一个选项以匹配您的包名称):

##
## Keep classes of named package
##
-keep public class **.keithpinson.**
## ## ## ## ## ## ## ## ## ## ## ## ##


##
## RELEASE ONLY
##
##-optimizationpasses 3
##-overloadaggressively
##-repackageclasses ''
##-allowaccessmodification
##-optimizations !code/simplification/arithmetic
##         ,!field/*,!class/merging/*,!code/allocation/variable
##-keepattributes *Annotation*

##
## DEBUG ONLY
##
-dontobfuscate
-dontoptimize
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
## -printmapping mapping.txt


##
## ALL VERSIONS
##
-dontpreverify
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames


## Keep Limited Serializable Capability
##-keepclassmembers class * implements java.io.Serializable {
##    static long serialVersionUID;
##    private void writeObject(java.io.ObjectOutputStream);
##    private void readObject(java.io.ObjectInputStream);
##    java.lang.Object writeReplace();
##    java.lang.Object readResolve();
##}

## Keep All Serializable Capability
##-keep class * implements java.io.Serializable { *; }"





##
## ANDROID SETTINGS
##
-dontwarn com.google.common.collect.MinMaxPriorityQueue
-dontwarn com.google.common.primitives.UnsignedBytes$*

-dontnote android.app.backup.BackupAgentHelper
-dontnote com.android.vending.licensing.ILicensingService

-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>;
}

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-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 *;
}

# R classes may be built out of sequence so don't proguard them
-keep public class **.R { *; }
-keepclassmembers class **.R$* {
    public static <fields>;
}

# Removes all calls to Log. Delete the methods you want to keep.
-assumenosideeffects class android.util.Log {
    public static int v(...);
    #public static int d(...);
    public static int i(...);
    #public static int w(...);
    #public static int e(...);
    #public static int wtf(...);
}

## Fixes ==> Warning: ... can't find referenced class javax.xml.stream.events.XMLEvent
## -dontwarn javax.xml.**


## If using Guice
## -keep class com.google.common.base.Finalizable* {
##   <fields>;
##   <methods>;
## }
##
## -keep class com.google.common.base.internal.Finalizer {
##   <fields>;
##   <methods>;
## }


##
## SCALA SETTINGS
##
-dontwarn **$$anonfun$*
-dontwarn scala.android.**
-dontwarn scala.beans.ScalaBeanInfo
-dontwarn scala.collection.generic.GenTraversableFactory
-dontwarn scala.collection.immutable.RedBlack$Empty
-dontwarn scala.concurrent.forkjoin.**
-dontwarn scala.reflect.**
-dontwarn scala.sys.process.**
-dontwarn scala.tools.**,plugintemplate.**


#(org.xml.sax.EntityResolver)Class.forName(variable).newInstance()
-dontnote org.xml.sax.EntityResolver

#(org.apache.james.mime4j.storage.StorageProvider)Class.forName(variable).newInstance()
-dontnote org.apache.james.mime4j.storage.DefaultStorageProvider

-dontnote scala.android.app.Activity


## Keep All Scala Classes
##-keep class scala.** { *; }

-keep class scala.android.package**
-keep class * extends scala.android.app.Activity

## Fixes ==> Warning: ... can't find referenced class sun.misc.Unsafe
-libraryjars libs/jsr305-2.0.1.jar
-dontwarn sun.misc.Unsafe


-keep class * extends scala.runtime.MethodCache {
    public <methods>;
}

-keepclassmembers class * {
    ** MODULE$;
}

-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
    long eventCount;
    int workerCounts;
    int runControl;
    scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
    scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack;
}

-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread {
    int base;
    int sp;
    int runState;
}

-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask {
    int status;
}

-keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue {
    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head;
    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail;
    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe;
}

取消选中在Android facet上运行ProGuard时,似乎会使用系统proguard配置优化jar,简单取消选中似乎不起作用,因此您需要使用一些自定义的proguard配置,请尝试一下,它对我有用用您的包裹替换替换品

当然,您可以尝试Keith的配置。

-dontobfuscate
-dontoptimize
-dontpreverify

-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers

-dontwarn

#scala.Enumeration accesses a field 'MODULE$' dynamically
-dontnote scala.Enumeration

#(org.xml.sax.EntityResolver)Class.forName(variable).newInstance()
-dontnote org.xml.sax.EntityResolver

#(org.apache.james.mime4j.storage.StorageProvider)Class.forName(variable).newInstance()
-dontnote org.apache.james.mime4j.storage.DefaultStorageProvider

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
            SourceFile,LineNumberTable,Annotation,EnclosingMethod

-keep public class REPLACE WITH YOUR PACKAGE

https://plus.google.com/106066742926663025812/posts/41XoDPeDEqc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM