2017-09-06 77 views
7

我有一个主要编写在Kotlin中的项目,但有一些Java类。项目目前进展顺利,我想补充的不同环境之间切换,为此我使用的香料的可能性:带有产品风味和Kotlin的ClassNotFoundException

productFlavors { 
     prod { 
      dimension "default" 
      buildConfigField 'boolean', 'FABRIC', 'true' 
      applicationId = "com.myapp" 
     } 

     beta { 
      dimension "default" 
      buildConfigField 'boolean', 'FABRIC', 'true' 
      applicationId = "com.myapp.beta" 
     } 

     dev { 
      dimension "default" 
      buildConfigField 'boolean', 'FABRIC', 'false' 
      applicationId = "com.myapp.dev" 
     } 

    } 

然而,当我在一个味道,不生产(不改变的applicationID运行)我得到一个ClassDefNotFoundException Java类:

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.myapp.beta.ui.view.ScrollBehavior" on path: DexPathList[[zip file "/data/app/com.myapp.beta-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.beta-1/lib/arm64, /system/lib64, /vendor/lib64]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:380) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312) 
    ... 33 more 

我使用过Android Studio 3.0测试版4科特林插件1.1.3-2版本。

构建文件:

apply plugin: 'com.android.application' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-android-extensions' 
apply plugin: 'kotlin-kapt' // Use experimental kapt implementation 

repositories { 
    mavenCentral() 
    maven { 
     url "http://dl.bintray.com/ttymsd/maven" 
    } 
    maven { url 'https://jitpack.io' } 
} 
android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 

    defaultConfig { 
     applicationId "com.myapp" 

     minSdkVersion rootProject.ext.minSdkVersion 
     targetSdkVersion rootProject.ext.targetSdkVersion 

     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     vectorDrawables.useSupportLibrary = true 
    } 

    sourceSets { 
     main.java.srcDirs += 'src/main/java' 
    } 


    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    flavorDimensions "default" 
    productFlavors { 
     prod { 
      dimension "default" 
      buildConfigField 'boolean', 'FABRIC', 'true' 
      applicationId = "com.myapp" 
     } 

     beta { 
      dimension "default" 
      buildConfigField 'boolean', 'FABRIC', 'true' 
      applicationId = "com.myapp.beta" 
     } 

     dev { 
      dimension "default" 
      buildConfigField 'boolean', 'FABRIC', 'false' 
      applicationId = "com.myapp.dev" 
     } 

    } 


    dataBinding { 
     enabled = true 
    } 

    dependencies { 
     (...) 
    } 
} 

清单:在代码

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.myapp"> 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 


    <application 
     android:name=".MyApp" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/MyTheme"> 


     <activity 
      android:name=".ui.dashboard.DashboardListActivity" 
      android:launchMode="singleTop" 
      android:configChanges="orientation|keyboardHidden|screenSize"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 


    </application> 

</manifest> 

相关部分:

<android.support.design.widget.AppBarLayout 
      android:id="@+id/appbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@color/colorPrimary" 
      android:theme="@style/MycujooPlayerTheme.AppBarOverlay" 
      app:layout_behavior=".ui.view.ScrollBehavior"> 
+0

彻底清洁和重建是否解决了这个问题?是否立即运行修复它? – nhaarman

+0

我从来没有即时运行(它很烂)。清洁和重建不能修复它 –

+0

请张贴您的清单包 – crgarridos

回答

0

你定义自己的行为为

app:layout_behavior=".ui.view.ScrollBehavior" 

这是一个相对的定义。在这种情况下,相对于应用程序包。

因此,实际使用的名称是context.getPackageName() + name,因此您定义的应用程序标识用作前缀。

要加载,你必须把它定义为一个完全合格的名称

app:layout_behavior="com.myapp.ui.view.ScrollBehavior" 

你也可以在这里使用字符串资源的正确的行为。

0

这不是一个科特林问题。

产生的原因:抛出java.lang.ClassNotFoundException:找不到类 “com.myapp 测试 .ui.view.ScrollBehavior”

从Android doc

每个Android应用程序都有一个唯一的应用程序ID,看起来像Java程序包的名称,比如com.example.myapp。此ID唯一标识的设备上,并在谷歌Play商店

<manifest package="com.myapp" > 

,有时我甚至见过(从来不使用这个)您的应用程序:

<manifest package="${applicationId}" > 

改变就意味着你正在改变您的应用程序包的参考。位于com.myapp的课程将被搜索到com.myapp.beta。然后你的课程将不会被找到。

一着,被定义风味(我推迟了简单他人值)工作方式:

prod { 
    applicationId = "com.myapp" 
} 

beta { 
    applicationId = "com.myapp.beta" 
} 

dev { 
    applicationId = "com.myapp.dev" 
} 

或pusblish建立后仅

beta { 
    applicationIdSuffix ".beta" 
} 

dev { 
    applicationIdSuffix ".dev" 
} 

编辑。gradle这个

注意补充一个后缀或一个完整的applicationID:

//This will be append to your application id 
//applicationIdSuffix = "com.myapp.beta", should be 
applicationIdSuffix = ".beta" 

//This will replace your application Id 
applicationId "com.myapp.beta" 
+0

对不起,我更换了一般的应用程序的实际名称时出错,所以问题是通用的。我实际上有你指定的值。 –

+2

应用程序ID不会取代软件包名称。如果你在'com.example.foo'包中放置一个类,它将停留在那里。 'R'类将始终在AndroidManifest.xml中指定的包中生成。 **千万不要做这样的疯狂的东西:**'' –

+0

好吧,那么为什么这个错误发生在我身上呢? –