我有一个主要在Kotlin中编写的项目,但是有一些java类。项目现在已经很先进了,我想增加在不同环境之间切换的可能性,为此我使用了各种口味:
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)时,我得到一个java类的ClassDefNotFoundException:
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
我正在使用带有Kotlin插件版本1.1.3-2的Android Studio 3.0 beta 4。
构建文件:
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"
app:layout_behavior=".ui.view.ScrollBehavior">
答案 0 :(得分:2)
您将行为定义为
app:layout_behavior=".ui.view.ScrollBehavior"
这是一个相对定义。在这种情况下,相对于应用程序包。
因此实际使用的名称是context.getPackageName() + name
,因此您定义的应用程序ID将用作前缀。
要加载正确的行为,您必须将其定义为完全限定名称
app:layout_behavior="com.myapp.ui.view.ScrollBehavior"
此外,您可以在此处使用字符串资源。
答案 1 :(得分:0)
这不是Kotlin问题。
引起:java.lang.ClassNotFoundException:未找到类“com.myapp。 beta .ui.view.ScrollBehavior”
来自android doc
每个Android应用都有一个看似Java包名称的唯一应用ID,例如com.example.myapp。此ID可在设备和Google Play商店中唯一标识您的应用
var data = $('#scheduler-table > div.row > div:nth-child(4) > div').filter(function() {
return $(this).data('date') == '8.09.2017';
}).data();
或有时我甚至见过(从不使用此内容):
<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 build.gradle之后编辑
注意添加后缀或完整的applicationId:
beta {
applicationIdSuffix ".beta"
}
dev {
applicationIdSuffix ".dev"
}
或
//This will be append to your application id
//applicationIdSuffix = "com.myapp.beta", should be
applicationIdSuffix = ".beta"