疑难问题汇总

Unity Android SDK 常见问题与解决方案
本文总结了Unity在构建Android游戏时遇到的常见问题,包括打包APK失败、AndroidManifest设置异常、MultiDex启用、ANR、NoClassDefFoundError等,并提供了详细的解决步骤。

目录

unity-android sdk 相关问题记录

1.打包AndroidAPK常见问题:

2.AndroidManifest设置android:allowBackup="false"报错

3.由于权限问题导致的黑屏

4.Unity Grade 的相关异常和报错

5.启用MultiDex解决Unity2019.3.x构建Android游戏时Dex 64K引用限制问题

下面是分别在Unity 2019.3.x之后及之前的版本中启用MultiDex的方法:

6.安卓,应用程序无响应(ANR)

7.java.lang.NoClassDefFoundError: android.support.v4.content.FileProvider 错误解决方案

8.eclipse导出jar时出现Class files on classpath not found or not accessible for ...

9.打正式包 运行报错 No pending exception expected: java.lang.ClassNotFoundException: Didn't find class "

编辑器工具使用问题

1.VS2017中文编码格式导致UGUI乱码(将编码格式改为UTF-8)

2.Unity GB2132的多平台下的编码问题

3.vs激活相关


unity-android sdk 相关问题记录

1.打包AndroidAPK常见问题:

可先参考:https://www.cnblogs.com/guxin/p/8649834.html

没解决的继续往下看,错误格式大概好多种(先弹无关的错误如a,然后弹b),反正打不出apk,新建项目都不可以(环境要有,怀疑没搭建对的,不用怀疑了,不可能,不会搭建的看我的文章有游戏环境搭建):

a.FormatException: Input string was not in the correct format System.Int32.Par

a1:CommandInvokationFailure: Gradle build failed._

b.UnityEditor.BuildPlayerWindow+BuildMethodException: Build failed with N errors.

解决方案:

打开androidSDK的路径,点击SDK Manager.exe,将默认选择的更新到最新。

(大概是下面的原因导致的,但是不要用下面的方法)

原因:Android版本较新,Unity版本太旧(如4.X),Unity打包APK时调用Android工具使用的命令已被安卓弃用了(而Unity不知道)。

办法:替换Android/Sdk/tools文件夹下的所有内容为老版本的tools。(记得把原来的tools先备份)

2.AndroidManifest设置android:allowBackup="false"报错

设置android:allowBackup="false"的必要性

Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中AndroidManifest.xml文件中的allowBackup属性值[1] ,其属性值默认是true。当allowBackup标志为true时,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。

Android属性allowBackup安全风险源于adb backup容许任何一个能够打开USB 调试开关的人从Android手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即可在其他Android手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。

尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此为了安全起见,开发者务必将allowBackup标志值设置为false来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。

设置android:allowBackup="false"出错的情况

一般是引用的第三方开源库的AndroidManifest.xml文件设置android:allowBackup="true"了,导致两者不统一,由于第三方库大多是通过api、implementation方式引用的,无法修改其AndroidManifest.xml文件。

解决方案

在自己项目的AndroidManifest.xml中<application>标签中添加tools:replace="android:allowBackup"。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="ccccccc"
    >

    <!--设置android:allowBackup="false",保证安全
        https://blog.youkuaiyun.com/qq_31387043/article/details/51452782
        https://blog.youkuaiyun.com/bgc525725278/article/details/71171241-->
    <application
        android:name=".MyApplication"
        android:allowBackup="false"
        tools:replace="android:allowBackup"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/TranslucentTheme">


    </application>

</manifest>
同理:同样的还有tools:replace="android:icon, android:theme,android:allowBackup" 

3.由于权限问题导致的黑屏

同一项目使用不同版本的Unity打开并上传了设置,导致了莫名奇妙的黑屏。

使用了一些解决方案,如更改tarsdk,重新将写入权限打开等等,有时有效,有时无效。先记录下。

4.Unity Grade 的相关异常和报错

unity could not find com.android.tools.build:gradle:3.2.1

解决方案1:更新Unity到新版本,Unity自身grade模板文件有问题

一般处理方法(不推介):

在设置中勾选,然后在项目中打开mainTemplate.gradle文件修改。

没有这个设置的参考进行配置:

https://blog.youkuaiyun.com/osuckseed/article/details/93089977

在repositories 中添加  

使用阿里云地址
    maven{ url 'https://maven.aliyun.com/repository/google' }
        maven{ url 'https://maven.aliyun.com/repository/jcenter' }

buildscript {
    repositories {
		maven{ url 'https://maven.aliyun.com/repository/google' }
		maven{ url 'https://maven.aliyun.com/repository/jcenter' }
        //mavenCentral()
        //google()
        //jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'
**BUILD_SCRIPT_DEPS**}
}

allprojects {
    repositories {
        //mavenCentral()
		maven{ url 'https://maven.aliyun.com/repository/google' }
		maven{ url 'https://maven.aliyun.com/repository/jcenter' }
        //google()
        //jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}

解决方案2

5.启用MultiDex解决Unity2019.3.x构建Android游戏时Dex 64K引用限制问题

熟悉Android开发的同学对这个错误应该不陌生,Android 5.0之前的版本(API level < 21)使用Dalvik runtime 来执行代码,默认限制每个APK 只能使用一个classes.dex 文件,而DEX规范又将单个DEX文件内引用的方法总数限制为65536个,所以如果你游戏中使用了较多的第3方SDK,很容易就会超过这个限制。

(1)在Player Settings中将支持的最低Android API 级别设定为21及以上。Android API Level 21及更高版本支持从APK文件中加载多个DEX文件,因此不会受64K的限制。

(2)使用Custom Gradle 配置文件并启用MultiDex支持(在PlayerSettings>Publish Settings>Build 设置中勾选Custom Gradle Template,然后修改项目目录Assets/Plugins/Android/mainTemplate.gradle启用MultiDex支持)

(3)修改Unity Editor 默认的Gradle配置文件并启用MultiDex支持(Unity安装目录/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/mainTemplate.gradle)

我们项目之前使用的是第(3)种方法,即修改Unity Editor默认的Gradle配置文件mainTemplate.gradle,启用MultiDex,这种方法的好处是多个项目可以共享这个配置,坏处是每次升级Unity时都要重新修改一次。

于是我们按之前的方法修改了Unity3.6f的mainTeamplate.gradle文件并重新编译,但发现问题依然存在,经上网搜索查询后发现:原来在Unity3.x以上版本中,Unity增加了baseProjectTemplate.gradle 和 launcherTemplate.gradle 两个配置文件(我还搞不清楚增加的这两个配置文件的具体作用是什么,猜想launcherTemplate.gradle可能是用于构建独立应用时使用的,哪位同学如果知道还请赐教)。修改launcherTemplate.gradle启用MultiDex后,编译顺利通过。

下面是分别在Unity 2019.3.x之后及之前的版本中启用MultiDex的方法:

(1)在Unity 2019.3.x之后的版本(以2019.3.6f版本为例) ,修改
/Applications/Unity/Hub/Editor/2019.3.6f/PaybackEngines/AndroidPlayer/Tools/GradleTemplate/launcherTemplate.gradle

(2)在Unity 2019.3.x之前的版本(以2019.2.12f版本为例),修改
/Applications/Unity/Hub/Editor/2019.2.12f/PaybackEngines/AndroidPlayer/Tools/GradleTemplate/mainTeamplate.gradle

两个版本的配置文件,需要修改的地方都是相同的,如下:

第一步、在defaultConfig配置块中,增加“multiDexEnabled true”

android {
        defaultConfig {
            ...
            multiDexEnabled true
            minSdkVersion **MINSDKVERSION**
            targetSdkVersion **TARGETSDKVERSION**
            ...
        }
        ...
    }

第二步、如果你的项目没有使用AndroidX,那么添加以下支持库依赖项:

dependencies {
      implementation 'com.android.support:multidex:1.0.3'
}

如果项目使用了AndroidX,那么添加下面的支持库依赖项

dependencies {
        implementation 'androidx.multidex:multidex:2.0.1'
}

第三步、修改位于项目目录Asset/Plugins/Android/的AndroidManifest.xml文件,设置<application> 标记中的 android:name,如下所示:

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>

第四步、如果你的项目替换了Application类,那么还要更改这个类,添加扩展以支持MultiDexApplication

public class MyApplication extends MultiDexApplication { ... }

更多可以参考Google官方的设置建议:https://developer.android.com/reference/androidx/multidex/MultiDexApplication

Unity Forum上对这个问题的讨论:
https://forum.unity.com/threads

6.安卓,应用程序无响应(ANR)

原因分析:

https://blog.youkuaiyun.com/mysimplelove/article/details/93191748

修复方法:

1、连接adb.exe工具,运行应用至无响应处。

在log信息中查找"ANR"相关, 这里看到应用无响应相关信息,已保存至手机目录 '/data/anr/traces.txt'

2、 在手机目录下,查看ANR无响应原因

 

3、对照应用源码逻辑,修复导致无响应的异常、或死循环

7.java.lang.NoClassDefFoundError: android.support.v4.content.FileProvider 错误解决方案

步骤一

build-gradle 中配置 multiDexEnabled = true

defaultConfig {
	 multiDexEnabled true
}

步骤二

Application 中重写 attachBaseContext

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(base)
    }
 

8.eclipse导出jar时出现Class files on classpath not found or not accessible for ...

工程文件夹应该会有个大红感叹号。右击工程文件夹,properties 选择java build class,查看各选项卡,有红色错误提醒的remove之即可。

9.打正式包 运行报错 No pending exception expected: java.lang.ClassNotFoundException: Didn't find class "

解决方案:把混淆关了

release {
    minifyEnabled false
}

编辑器工具使用问题

1.VS2017中文编码格式导致UGUI乱码(将编码格式改为UTF-8)

在 vs2017中,高级保存选项默认被隐藏了
Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符。在Visual Studio 2017中,该命令没有默认显示在“文件”菜单中。用户需要手工设置,才能显示该命令。操作方法如下:

(1)单击“工具”|“自定义”命令,弹出“自定义”对话框。
(2)单击“命令”标签,进入“命令”选项卡。
(3)在“菜单栏”下拉列表中,选择“文件”选项。
(4)单击“添加命令”按钮,弹出“添加命令”对话框。
(5)在“类别”列表中,选择“文件”选项;在“命令”列表中,选择“高级保存选项”选项。
(6)单击“确定”按钮,关闭“添加命令”对话框。
(7)选中“控件”列表中的“高级保存选项”选项,单击“上移”或者“下移”按钮,调整该命令的位置。
(8)单击“关闭”按钮,完成“高级保存选项”命令的添加操作。
  (9) 文件- 点击高级保存,将编码格式改成 UTF-8(带签名)。

2.Unity GB2132的多平台下的编码问题

最近在开发中要用到GB2312字符编码(CP936),在C#代码中便有了如此代码 
NotSupportedException: CodePage 936 not supported 
谷歌后便将I18N.DLL和I18N.CJK.DLL从Unity安装目录 
(Editor\Data\Mono\lib\mono\unity和Editor\Data\Mono\lib\mono\2.0) 
两个目录下都存在,拷贝到项目目录Asserts目录下,重新编译出包,正常运行。 
在出iOS包时,又再次出现 
NotSupportedException: CodePage 936 not supported 
前面虽然已经把相关库文件放到项目之中,但仔细查看xcode工程目录,其下并没有 
I18N.DLL 和 I18N.CJK.DLL 文件的任何影子。此时便想到我们的unity项目中使用的 
stripping level可能会有影响,索性暂时disable stripping,尝试重新出iOS包,发现 
一切正常,再看xcode工程目录下果然也有了I18N.DLL 和 I18N.CJK.DLL。 


那么,问题又来了,如果仍想继续使用stripping,有没有办法? 
unity 官方手册中提到,可以通过添加白名单的方式,在使用stripping时,忽略掉指定 
的库。方式是在Assets根目录下添加link.xml文件,其内容格式如下

<?xml version="1.0" encoding="utf-8"?>
<linker>
    <assembly fullname="I18N">
        <type fullname="I18N.Common.Manager" preserve="all"/>
    </assembly>
    <assembly fullname="I18N.CJK">
        <type fullname="I18N.CJK.CP936" preserve="all"/>
    </assembly>
</linker>

使用CP936,只需要添加上述内容。 
如此,将该link.xml文件添加到Assets根目录下后,开启stripping后,CP936也可以正常使用了~

3.vs激活相关

今早打开VS2017提示许可证已过期,也无法更新,搜索了一下解决方法,在这里分享一下:

1.卸载并重安VS2017

2.安装后打开VS2017,点击帮助=》注册产品,输入序列号NJVYC-BMHX2-G77MM-4XJMR-6Q8QF(企业版),

KBJFW-NXHK6-W4WJM-CRMQB-G3CDH(专业版),其他版本可自行搜索,然后产品就激活了,可以继续使用。

<think>我们首先需要明确用户的问题:在Unity项目中集成Android的ARR SDK插件。根据引用内容,ARR可能是笔误,实际应为AAR(Android Archive)文件,这是Android库的标准分发格式。用户可能想集成一个以AAR文件形式提供的Android SDK插件到Unity中。 从引用中我们可以提取关键信息: 1. 引用[1]提到第三方jar包(类似地,AAR也适用)需要将assets文件夹放入特定路径:`Assets\Plugins\Android\assets`(注意:Unity不处理AAR中的资源,只处理代码)[^1]。 2. 引用[2]提供了集成AAR文件的具体步骤:将AAR放入`Assets/Plugins/Android`目录,并创建AndroidManifest.xml文件[^2]。 3. 引用[3]提到在Unity中接入微信登录SDK时,需要在指定包名下创建Java类,且包名和类名必须固定[^3]。 因此,集成Android AAR SDK插件的步骤可以总结如下: **步骤1:准备AAR文件** - 获取需要集成的Android SDK的AAR文件。 **步骤2:将AAR文件放入Unity工程** - 在Unity项目的`Assets`文件夹下创建路径:`Plugins/Android`(如果不存在则创建)。 - 将AAR文件放入此目录。 **步骤3:处理资源文件(如果AAR包含assets)** - 如果AAR文件中包含assets资源,需要手动解压AAR(AAR本质是一个压缩包),将其中的assets文件夹复制到Unity工程的`Assets/Plugins/Android/assets`目录下(如引用[1]所述)[^1]。 **步骤4:配置AndroidManifest.xml** - 在`Plugins/Android`目录下创建或修改`AndroidManifest.xml`文件,添加必要的权限和Activity声明。引用[2]给出了一个示例模板[^2]: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxxx.androidplugin" android:versionCode="1" android:versionName="1.0"> <application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true"> <activity android:name="com.XXXX.unityplugin.UnityPlugin" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` 注意:需要将包名和Activity类名替换为实际值。 **步骤5:处理回调(如果需要)** - 如果SDK需要回调Unity,可能需要创建继承自`UnityPlayerActivity`的Activity(如引用[1]第2点所述)[^1]。 - 或者,按照引用[3]的方法,在指定包名下创建固定名称的Java类来处理回调[^3]。 **步骤6:解决依赖冲突** - 如果AAR依赖其他库,可能需要将这些依赖库(如其他AAR或JAR)也放入`Plugins/Android`目录。 - 注意避免重复的类或资源,防止构建失败(如引用[1]提到的dex构建错误)[^1]。 **步骤7:在Unity中调用SDK功能** - 编写C#脚本通过`AndroidJavaClass`和`AndroidJavaObject`调用Java方法。 **注意事项:** - 包名一致性:确保Unity项目的包名(在Player Settings中设置)与AndroidManifest.xml中的包名以及SDK要求的包名一致。 - 主线程问题:避免在Unity主线程中阻塞,防止无法与Android通信(引用[1]第5点)[^1]。 - 资源处理:特别注意AAR中的资源(assets、res等)需要手动处理,Unity不会自动打包它们。 下面是一个简单的示例,展示如何在Unity中调用AAR中的方法: ```csharp // 在Unity C#脚本中调用Android方法 public class SDKManager : MonoBehaviour { void Start() { // 调用AAR中的静态方法 using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.example.sdk.SDKClass")) { pluginClass.CallStatic("init", "YourAppId"); } } // 示例:调用实例方法 public void CallSDKMethod() { using (AndroidJavaObject pluginInstance = new AndroidJavaObject("com.example.sdk.SDKClass")) { pluginInstance.Call("methodName", "parameter"); } } } ``` 如果遇到问题,可参考以下排查: - 检查日志:使用`adb logcat`查看运行时错误。 - 确认权限:在AndroidManifest.xml中添加所需权限。 - 类名和方法名:确保调用时使用的类名和方法名与AAR中的完全一致。 §§相关问题§§ 1. Unity集成Android SDK时如何处理AAR文件中的资源? 2. 如何解决Unity与Android SDK之间的通信问题? 3. 在Unity中调用Android SDK方法的最佳实践是什么? 4. 如何调试Unity集成Android SDK时的常见错误?</think>### Unity 集成 Android AAR SDK 插件指南 #### 一、基础集成步骤 1. **准备 AAR 文件** 获取 SDK 提供的 AAR 文件(例如 `sdk_name.aar`)。 2. **创建 Unity 目录结构** 在 Unity 项目中创建路径: `Assets/Plugins/Android/` 📁 将 AAR 文件放入此目录。 3. **处理资源文件**(关键步骤) - 解压 AAR 文件(后缀改为 .zip) - 将其中的 `assets/` 文件夹复制到: `Assets/Plugins/Android/assets/` ⚠️ 否则可能出现资源加载失败(如银联支付的 data.bin 问题)[^1]。 4. **配置 AndroidManifest.xml** 在 `Assets/Plugins/Android/` 下创建 `AndroidManifest.xml`,参考模板: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yourcompany.unityplugin"> <application> <activity android:name="com.sdk.package.MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` 📌 需修改 `package` 和 `android:name` 与实际 SDK 匹配[^2]。 #### 二、关键注意事项 1. **主线程通信** ⛔ 避免在 Android 主线程执行耗时操作,否则会阻塞 Unity 通信[^1]: ```java // 在Android插件中 new Thread(() -> { // 执行SDK调用 UnityPlayer.UnitySendMessage("GameObject", "Callback", result); }).start(); ``` 2. **包名一致性** - Unity Player Settings 的包名需与 `AndroidManifest.xml` 的 `package` 一致 - SDK 要求的回调类必须位于指定包名下(如微信登录 SDK)[^3]: ``` com.tencent.mm.opensdk.openapi.WXAPIFactory ``` 3. **依赖冲突解决** 若出现 DEX 错误: - 检查重复的 .jar 文件 - 在 `mainTemplate.gradle` 中添加排除规则: ```gradle dependencies { implementation (files('libs/sdk.aar')) { exclude group: 'com.android.support', module: 'appcompat-v7' } } ``` #### 三、Unity 调用示例 ```csharp // C# 调用 Android SDK public class SDKManager : MonoBehaviour { private AndroidJavaObject _plugin; void Start() { #if UNITY_ANDROID AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); _plugin = new AndroidJavaObject("com.sdk.package.SDKEntry", activity); #endif } public void CallSDKMethod() { _plugin?.Call("sdkMethod", "param"); } // Android回调到Unity的方法(方法名需匹配) void OnSDKCallback(string result) { Debug.Log("Received: " + result); } } ``` #### 四、常见问题解决 | 问题现象 | 解决方案 | |---------|----------| | 闪退无日志 | 检查 `assets/` 是否遗漏[^1] | | `ClassNotFoundException` | 确认 AAR 包含目标类,包名正确 | | 构建失败 `DEX error` | 排除重复依赖库[^1] | | 回调不触发 | 确保 GameObject 名称和方法名匹配 | > 💡 最佳实践:优先参考 SDK 官方源码而非文档[^1],复杂 SDK 建议通过 Android Studio 调试后再集成到 Unity
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值