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

好吧,那麼爲什麼這個錯誤發生在我身上呢? –