网络流量,UDP数据异常

【问题】:wetest测试,应用流量异常。

【分析】:使用UCap抓包,发现以下数据。

1
105	1.740443	10.2.0.1	225.0.0.222	UDP	196	44596 → 54997 Len=154

【结论】:打包Dev版本时,开启了 Script Debugging / Autoconnect profiler。Unity会向225.0.0.222端口54997发送广播数据。

Android 8.0 启动异常

【问题】:应用在android 8.0 以上版本启动后黑屏。

【分析】:正常情况,启动后会弹出权限提示(Unity默认,未关闭)。android 8.0 上启动后,直接黑屏。抓取log,发现以下日志:

1
E/Unity(2150): Unable to query for permission: Fragment null must be a public static class to be  properly recreated from instance state. 

【结论】:Unity 5.6.3P3 版本的bug。导致Unity权限请求失败,应用卡死。

行尾(EOL)不一致问题

【问题】:应用通过vs修改后,Unity提示行尾不一致。

1
2
There are inconsistent line endings in the 'Assets/xxxx.cs' script. Some are Mac OS X (UNIX) and some are Windows.
This might lead to incorrect line numbers in stacktraces and compiler errors. Many text editors can fix this using Convert Line Endings menu commands.

【分析】: Unity3D编辑器创建的脚本文件是以”LF”结尾(Unix平台), MonoDevelop IDE创建的也是以“LF”结尾(Unix平台),Visual Studio 创建、保存的文件是以“CR LF”结尾(Windows平台),由于换行编码不一致导致报以上警告。

CR:回车(\r)
LF:换行(\n)

【解决方法】:

  1. 统一采用 win 平台行尾(“CR LF”)。将Unity安装目录\Editor\Data\Resources\ScriptTemplates\目录下的所有文件用修改为win行尾编码。
  2. 统一采用 linux 平台行尾(“LF”)。安装vs插件(Strip’em),通过vs编辑的文件,保存为linux行尾编码。

Android 编译出错:Invalid command dx

【问题】:Unity 打包 apk,在最后的 java 编译阶段报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CommandInvokationFailure: Unable to convert classes into dex format.
D:\Program Files\Java\jdk1.8.0_231\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir="D:/Android/SDK\tools" -Dfile.encoding=UTF8 -jar "D:\Program Files\Unity5.6\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar" -

stderr[
Error:Invalid command dx
]
stdout[

]
exit code: 64
at UnityEditor.Android.Command.Run (System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) [0x00000] in <filename unknown>:0
at UnityEditor.Android.AndroidSDKTools.RunCommandInternal (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) [0x00000] in <filename unknown>:0
at UnityEditor.Android.AndroidSDKTools.RunCommandSafe (System.String javaExe, System.String sdkToolsDir, System.String[] sdkToolCommand, Int32 memoryMB, System.String workingdir, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) [0x00000] in <filename unknown>:0
UnityEditor.BuildPipeline:BuildPlayerInternalNoCheck(String[], String, String, BuildTargetGroup, BuildTarget, BuildOptions, Boolean)
UnityEditor.BuildPlayerWindow:BuildPlayerWithDefaultSettings(Boolean, BuildOptions, Boolean) (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:485)
UnityEditor.BuildPlayerWindow:BuildPlayerWithDefaultSettings(Boolean, BuildOptions) (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:339)
UnityEditor.BuildPlayerWindow:GUIBuildButtons(IBuildWindowExtension, Boolean, Boolean, Boolean, BuildPlatform) (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:1390)
UnityEditor.BuildPlayerWindow:ShowBuildTargetSettings() (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:1317)
UnityEditor.BuildPlayerWindow:OnGUI() (at C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindow.cs:913)
System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)
System.Reflection.MonoMethod:Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
System.Reflection.MethodBase:Invoke(Object, Object[]) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
UnityEditor.HostView:Invoke(String, Object) (at C:\buildslave\unity\build\Editor\Mono\HostView.cs:262)
UnityEditor.HostView:Invoke(String) (at C:\buildslave\unity\build\Editor\Mono\HostView.cs:255)
UnityEditor.HostView:OnGUI() (at C:\buildslave\unity\build\Editor\Mono\HostView.cs:84)

【分析】: dx 存在于 {android sdk}\build-tools{版本号}\lib 目录。高版本的 build-tools 不包含此工具。

【解决方法】: 通过 SDK Management 安装旧版本的 build-tools。(或者升级高版本 Unity)也可通过修改 project.properties ,添加 sdk.buildtools = x.x.x 指定版本编译。