目录
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激活相关
可先参考: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先备份)
设置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:icon, android:theme,android:allowBackup"
同一项目使用不同版本的Unity打开并上传了设置,导致了莫名奇妙的黑屏。
使用了一些解决方案,如更改tarsdk,重新将写入权限打开等等,有时有效,有时无效。先记录下。
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
熟悉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后,编译顺利通过。
(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类,那么还要更改这个类,添加扩展以支持MultiDexApplication
public class MyApplication extends MultiDexApplication { ... }
更多可以参考Google官方的设置建议:https://developer.android.com/reference/androidx/multidex/MultiDexApplication
Unity Forum上对这个问题的讨论:
https://forum.unity.com/threads
原因分析:
https://blog.csdn.net/mysimplelove/article/details/93191748
修复方法:
1、连接adb.exe工具,运行应用至无响应处。
在log信息中查找"ANR"相关, 这里看到应用无响应相关信息,已保存至手机目录 '/data/anr/traces.txt'
2、 在手机目录下,查看ANR无响应原因
3、对照应用源码逻辑,修复导致无响应的异常、或死循环
步骤一
build-gradle 中配置 multiDexEnabled = true
defaultConfig {
multiDexEnabled true
}
步骤二
Application 中重写 attachBaseContext
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
MultiDex.install(base)
}
工程文件夹应该会有个大红感叹号。右击工程文件夹,properties 选择java build class,查看各选项卡,有红色错误提醒的remove之即可。
解决方案:把混淆关了
release { minifyEnabled false }
在 vs2017中,高级保存选项默认被隐藏了
Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符。在Visual Studio 2017中,该命令没有默认显示在“文件”菜单中。用户需要手工设置,才能显示该命令。操作方法如下:
(1)单击“工具”|“自定义”命令,弹出“自定义”对话框。
(2)单击“命令”标签,进入“命令”选项卡。
(3)在“菜单栏”下拉列表中,选择“文件”选项。
(4)单击“添加命令”按钮,弹出“添加命令”对话框。
(5)在“类别”列表中,选择“文件”选项;在“命令”列表中,选择“高级保存选项”选项。
(6)单击“确定”按钮,关闭“添加命令”对话框。
(7)选中“控件”列表中的“高级保存选项”选项,单击“上移”或者“下移”按钮,调整该命令的位置。
(8)单击“关闭”按钮,完成“高级保存选项”命令的添加操作。
(9) 文件- 点击高级保存,将编码格式改成 UTF-8(带签名)。
最近在开发中要用到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也可以正常使用了~
今早打开VS2017提示许可证已过期,也无法更新,搜索了一下解决方法,在这里分享一下:
1.卸载并重安VS2017
2.安装后打开VS2017,点击帮助=》注册产品,输入序列号NJVYC-BMHX2-G77MM-4XJMR-6Q8QF(企业版),
KBJFW-NXHK6-W4WJM-CRMQB-G3CDH(专业版),其他版本可自行搜索,然后产品就激活了,可以继续使用。