经过多日奋战用土方法解决了很多问题后还是有个别情况会报错(如模拟器下正常,实际运行宕机)。
咨询了腾讯的客服建议删除所有之前导入的文件重新导入SDK——效果拔群,之前的很多冲突也都不报了,目测是我之前单独接MSDK时残留的文件没有处理干净;或者GCloud本身更新过程中也有目录变化;或者SDK内部本身也解决了一些冲突。
搜索到相近的文章说是SDK版本更新的影响,而Unity未跟进升级。技术对接的人说是新版信鸽带来的问题。
最终找了个介绍Manifest.xml文件元素值冲突详解的文章,了解到replace主要是多个Module指定同一个值时使用。
我发生问题的地方是信鸽的华为版本相关的meta-data设置,删掉对应replace即可。
其中Log过长在Unity界面被截断,具体细节到Editor.log文件中查看。
CommandInvokationFailure: Unable to convert classes into dex format.
[哇啦哇啦哇啦]
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/CursorAdapter;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/CursorAdapter$ChangeObserver;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/CursorAdapter$MyDataSetObserver;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/CursorFilter;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/CursorFilter$CursorFilterClient;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/ResourceCursorAdapter;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/SimpleCursorAdapter;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/SimpleCursorAdapter$CursorToStringConverter;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/widget/SimpleCursorAdapter$ViewBinder;
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Translation has been interrupted
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:614)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:310)
at com.android.dx.command.dexer.Main.runDx(Main.java:288)
at com.android.dx.command.dexer.Main.main(Main.java:244)
at com.android.dx.command.Main.main(Main.java:95)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at SDKMain.main(SDKMain.java:136)
根据already added: Landroid/support/v4/widget/CursorAdapter
推测可能含有support v4 widget
等词
直接在Unity Project窗口搜索其实马上能找到,不过
有时候手贱导入了过多重复包等打包错误显示出来再搜就太慢了,这个时候直接搜索工程目录按文件名排列查看命名相近的文件挨个处理就快很多。
IOException: Failed to Copy File / Directory from '文件路径' to '文件路径': destination path already exists.
这个报错是在上面重复引入包的排查过程中间歇出现的,原因不明的Temp文件夹无法写入。到工程目录把Temp文件夹的属性->高级属性->可以存档文件夹
打钩就行
trouble writing output: Too many field references to fit in one dex file: 147839; max is 65536. You may try using multi-dex. If multi-dex is enabled then the list of classes for the main dex list is too large.
根据StackOverflow的回答,用Unity内置构建是无法解决的。天知道哪个傻逼明知道引用的包dex list超标还提供对应Unity 2018 Internal构建的SDK文件。
另外的参考文章:《Unity打包Android APK 方法数超过64K问题》都要用到Android Studio,只在Unity内解决就是想桃子。
Unity少年不识Android 配置,分不清是自己操作错了还是SDK有问题。看文章样式和主题
去res/values/
目录找.xml
的文件,确认是否缺少条目。
我的情况是确实没得,因为新老SDK交替文件已经换了一批,残留的记录没删掉。
是个老问题了,之前直接接MSDK的时候也遇到过,因为基础知识薄弱并看不懂各种用gradle命令shell命令查找jar包内容的文章到底哪个文件重复出现过。
《这边有篇文章用了Shell》不清楚参数如何配置,也不懂Shell语法无法揣测,但是看到了一个java ... DECOMPILER
。上网一搜有这么个工具可以拆jar显示内容。
网址:Java Decompiler 甚至提供了很无脑的Windows版。
那我剩下的工作就是Everything找到所有.jar
文件往里一拖,点击search输入错误报告中的包名,定位完毕。
失败:个人的情况是文件只有一个,并没有根本解决,我单独改掉了扩展名等待下一个Bug。
gradle 构建java 项目详解相对深入了一下gradle原理,其中有一条依赖远程项目。
确实本地jar文件没有冲突,远程库却有冲突。上一段说的方法对于远程库就麻烦一些了,得手动去把依赖的远程项目文件名提取出来然后找对应的文件,才能用那个方法确定重复依赖问题。
有不少说在android/gradle.properties中添加android.enableAapt2=false
那么就参考Stackoverflow的这篇,加个Editor文件夹,加个类写上。
仔细看不是同一个事,我的报错前面有一大堆缺少资源。如No resource found that matches the given name
等。
天能想到官方给的SDK里面缺东西,大部分是样式配置,从不缺的文件里把文件
和条目
复制过来就能解决。最大的坑是每次显示在Unity界面里的数量有限,记得从Editor.log文件里翻阅所有记录。
META-INF文件冲突,在build.gradle的android下加如下信息,是我整理的已知的冲突内容。
packagingOptions {
exclude 'META-INF/androidx.legacy_legacy-support-core-utils.version'
exclude 'META-INF/androidx.vectordrawable_vectordrawable.version'
exclude 'META-INF/androidx.loader_loader.version'
exclude 'META-INF/androidx.legacy_legacy-support-v4.version'
exclude 'META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version'
exclude 'META-INF/android.arch.lifecycle_runtime.version'
exclude 'META-INF/androidx.print_print.version'
exclude 'META-INF/androidx.versionedparcelable_versionedparcelable.version'
exclude 'META-INF/MANIFEST.MF'
exclude 'META-INF/android.arch.core_runtime.version'
exclude 'META-INF/androidx.vectordrawable_vectordrawable-animated.version'
exclude 'META-INF/androidx.appcompat_appcompat.version'
exclude 'META-INF/androidx.asynclayoutinflater_asynclayoutinflater.version'
exclude 'META-INF/androidx.coordinatorlayout_coordinatorlayout.version'
exclude 'META-INF/androidx.customview_customview.version'
exclude 'META-INF/androidx.documentfile_documentfile.version'
exclude 'META-INF/androidx.drawerlayout_drawerlayout.version'
exclude 'META-INF/androidx.interpolator_interpolator.version'
exclude 'META-INF/android.arch.lifecycle_livedata.version'
exclude 'META-INF/android.arch.lifecycle_livedata-core.version'
exclude 'META-INF/androidx.recyclerview_recyclerview.version'
exclude 'META-INF/androidx.slidingpanelayout_slidingpanelayout.version'
exclude 'META-INF/androidx.core_core.version'
exclude 'META-INF/androidx.legacy_legacy-support-core-ui.version'
exclude 'META-INF/androidx.fragment_fragment.version'
exclude 'META-INF/androidx.media_media.version'
exclude 'META-INF/androidx.swiperefreshlayout_swiperefreshlayout.version'
exclude 'META-INF/android.arch.lifecycle_viewmodel.version'
exclude 'META-INF/androidx.viewpager_viewpager.version'
exclude 'META-INF/androidx.cursoradapter_cursoradapter.version'
exclude 'META-INF/proguard/androidx-annotations.pro'
}
```