疑难问题汇总

目录

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中标签中添加tools:replace="android:allowBackup"。




    
    


    


同理:同样的还有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.csdn.net/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文件,设置 标记中的 android:name,如下所示:


    
        
            ...
        
    

第四步、如果你的项目替换了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.csdn.net/mysimplelove/article/details/93191748

修复方法:

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

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

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

疑难问题汇总_第1张图片

 

疑难问题汇总_第2张图片

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文件,其内容格式如下



    
        
    
    
        
    

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

3.vs激活相关

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

1.卸载并重安VS2017

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

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

你可能感兴趣的:(游戏研发备忘录,unityandroid)