Android Studio에서 Unity 애플리케이션 용 Android 플러그인을 개발 중입니다. 플러그인은 Google Fit API에 액세스하고 Unity 애플리케이션에 표시 할 수있는 정보를 제공하는 것을 목표로합니다. 이 게시물의 끝에 Java 파일과 내 Gradle 파일 및 Manifest 파일을 포함 시켰습니다.Unity 플러그인의 NoClassDefFoundError 및 ClassNotFoundException
logInUnity()
방법이 적절하게 호출되는
package com.kasperiekqvist.player;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import com.google.android.gms.common.api.GoogleApiClient;
import com.unity3d.player.UnityPlayer;
import java.text.SimpleDateFormat;
import java.util.Date;
public class UnityPlayerActivity extends com.unity3d.player.UnityPlayerActivity {
private GoogleApiClient mClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
logInUnity("onCreate", null);
super.onCreate(savedInstanceState);
checkPermissions();
}
/* SNIP */
private boolean checkPermissions() {
int permissionState = ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
boolean hasPermission = permissionState == PackageManager.PERMISSION_GRANTED;
logInUnity("checkPermissions", new String[] { "ACCESS_FINE_LOCATION:" + hasPermission });
return hasPermission;
}
private void logInUnity(String methodName, String[] linesToLog) {
if(methodName != null) {
String message = "UnityPlayerActivity:" + methodName + " was called at ";
message += new SimpleDateFormat("MM-dd HH:mm:ss").format(new Date());
if(linesToLog != null) {
for(int i = 0; i < linesToLog.length; i++) {
message += ";" + linesToLog[i];
}
}
UnityPlayer.UnitySendMessage("JavaCallback", "LogInUnity", message);
}
}
}
UnityPlayerActivity.java 파일. 내 Debug.Log()
메서드를 사용하여 내 LogInUnity()
메서드 내 C# 스크립트에서 일을 로깅 오전. adb logcat -s Unity delvikvm DEBUG
명령을 사용할 때 명령 프롬프트에서 모든 것을 볼 수 있습니다.
문제는 Android 지원 라이브러리에 액세스하는 것입니다. 내 checkPermissions
메서드에서 ActivityCompat.checkSelfPermission()
을 호출하면 내 Activity가 즉시 강제 종료됩니다. 나는 아래의 충돌에 대한 정보를 포함시켰다.
충돌 정보는
10-15 19:57:53.843 18197 18197 E AndroidRuntime: FATAL EXCEPTION: main
10-15 19:57:53.843 18197 18197 E AndroidRuntime: Process: com.kasperiekqvist.androidpluginproject, PID: 18197
10-15 19:57:53.843 18197 18197 E AndroidRuntime: java.lang.Error: FATAL EXCEPTION [main]
10-15 19:57:53.843 18197 18197 E AndroidRuntime: Unity version : 2017.2.0f3
10-15 19:57:53.843 18197 18197 E AndroidRuntime: Device model : OnePlus ONEPLUS A5000
10-15 19:57:53.843 18197 18197 E AndroidRuntime: Device fingerprint: OnePlus/OnePlus5/OnePlus5:7.1.1/NMF26X/09131759:user/release-keys
10-15 19:57:53.843 18197 18197 E AndroidRuntime:
10-15 19:57:53.843 18197 18197 E AndroidRuntime: Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/app/ActivityCompat;
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at com.kasperiekqvist.player.UnityPlayerActivity.checkPermissions(UnityPlayerActivity.java:74)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at com.kasperiekqvist.player.UnityPlayerActivity.onCreate(UnityPlayerActivity.java:27)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6743)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2715)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2848)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.app.ActivityThread.-wrap12(ActivityThread.java)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1552)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6334)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.app.ActivityCompat" on path: DexPathList[[zip file "/data/app/com.kasperiekqvist.androidpluginproject-2/base.apk"],nativeLibraryDirectories=[/data/app/com.kasperiekqvist.androidpluginproject-2/lib/arm, /data/app/com.kasperiekqvist.androidpluginproject-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
10-15 19:57:53.843 18197 18197 E AndroidRuntime: ... 14 more
10-15 19:57:53.843 18197 18197 D AppTracker: App Event: crash
10-15 19:57:53.846 1804 16770 W ActivityManager: Force finishing activity com.kasperiekqvist.androidpluginproject/com.kasperiekqvist.player.UnityPlayerActivity
10-15 19:57:53.848 1804 16770 D ActivityTrigger: ActivityTrigger activityPauseTrigger
10-15 19:57:53.849 18197 18197 I Process : Sending signal. PID: 18197 SIG: 9
10-15 19:57:53.851 4741 6303 D OPReportService: addMonitorFolder onEvent [email protected]_57_53_851.txt, event:128
10-15 19:57:53.860 1804 4733 D EmbryoManager: prepare com.kasperiekqvist.androidpluginproject
10-15 19:57:53.860 1804 4733 I ActivityManager: Process com.kasperiekqvist.androidpluginproject (pid 18197) has died
10-15 19:57:53.860 1804 4733 D ActivityManager: get process top duration : com.kasperiekqvist.androidpluginproject, duration : 45
10-15 19:57:53.860 1804 4733 D ActivityManager: cleanUpApplicationRecord -- 18197
내 Gradle을 파일의 의존성에 compile 'com.android.support:support-v4:25.3.1'
포함했다. 내가 한 연구 결과에 따르면 안드로이드 서포트 라이브러리가 필자의 jar 파일에 포함되어 있지 않다는 것이 문제라고 생각합니다. 나는 그것에 대해 잘못 될 수 있습니다.
그럼에도 불구하고 나는 시험 할 물건이 부족합니다. 스택 오버플로 (Stack Overflow)에서 같은 오류가있는 많은 유사한 문제를 발견했으며 이러한 질문에 대한 답변에서 제안 된 많은 것들을 사용하여 문제를 해결하려고했습니다. 그러나 지금까지 아무도 일 해왔다.
명확하게하기 위해 ActivityCompat.checkSelfPermission()
메서드 호출을 추가하기 전에 모든 것이 제대로 작동했습니다. 따라서 문제는 지원 라이브러리에 있어야합니다.
build.gradle 파일
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "26.0.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.google.android.gms:play-services-fitness:11.0.4'
compile 'com.android.support:support-v4:25.3.1'
}
의 AndroidManifest.xml 나는 Play Services Resolver for Unity를 사용하여 내 문제를 해결하기 위해 관리
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kasperiekqvist.androidpluginproject" xmlns:tools="http://schemas.android.com/tools" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="true" android:banner="@drawable/app_banner">
<activity android:name="com.kasperiekqvist.player.UnityPlayerActivity" android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<meta-data android:name="unity.build-id" android:value="c9792a78-0123-4f4b-be86-1b85de56f689" />
<meta-data android:name="unity.splash-mode" android:value="0" />
<meta-data android:name="unity.splash-enable" android:value="True" />
<meta-data android:name="android.max_aspect" android:value="2.1" />
</application>
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="25" />
<uses-feature android:glEsVersion="0x00020000" />
<uses-feature android:name="android.hardware.vulkan" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
</manifest>
가능한 중복 NoClassDefFoundError in Java?] (https://stackoverflow.com/questions/34413/why-am-i-getting-a-noclassdeffounderror-in-java) –
그 질문에 대한 답으로 제 문제를 해결할 수 없었습니다. 그러나 나는 그것이 가능하지 않다고 주장하지 않는다. 나는 내 자신의 솔루션을 발견하고 그것을 아래에 포함 시켰습니다. – Kasperi