使用android studio 导出apk项目时候报这个错误,求大神解答!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用android studio 导出apk项目时候报这个错误,求大神解答!相关的知识,希望对你有一定的参考价值。
Error:android Dex: [720P] Unable to execute DX
Error:Android Dex: [720P] com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
Error:Android Dex: [720P] at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
Error:Android Dex: [720P] at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
Error:Android Dex: [720P] at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
Error:Android Dex: [720P] at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
Error:Android Dex: [720P] at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
Error:Android Dex: [720P] at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
Error:Android Dex: [720P] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
Error:Android Dex: [720P] at com.android.dx.command.dexer.Main.run(Main.java:246)
Error:Android Dex: [720P] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error:Android Dex: [720P] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Error:Android Dex: [720P] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Error:Android Dex: [720P] at java.lang.reflect.Method.invoke(Method.java:606)
Error:Android Dex: [720P] at org.jetbrains.android.compiler.tools.AndroidDxRunner.runDex(AndroidDxRunner.java:161)
Error:Android Dex: [720P] at org.jetbrains.android.compiler.tools.AndroidDxRunner.main(AndroidDxRunner.java:294)
Error:Android Dex: [720P] at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:121)
2.Unity3D端代码要在Unity中开发
3.Android和Unity3D端,两边都需要加入一些代码从而可以使之关联交互。
4.将Android端代码编译成jar文件以插件形式放入到Unity端中
5.在Unity中将整个项目Build成apk文件,然后安装到手机或模拟器里运行
本文主要讲解1,2,3。对于4,5建议大家去看雨松MOMO的Unity博客的第17篇和第18篇。
UnityPlay:
在编写Android端和Unity3d端代码前,有必要先了解一下可以使两部分交互的类UnityPlay。
个人理解UnityPlay是个Unity提供给外部交互的一个接口类。
为什么是“个人理解”?这我不得不爆粗口了,TMD官网根本就没有相关的API和文档(如果大家有谁找到一定给我来一份,就当我骂自己了)。
在关联Android时,想拿到UnityPlay以及相关类的jar包可以从下面的地址找到:Unity安装路径\Editor\Data\PlaybackEngines\androidplayer\bin在bin文件夹下有一个classes.jar的jar文件,它就是我们想要的。
而在bin同目录下有一个src文件,点击到最后有3个类,分别是UnityPlayerActivity.java,UnityPlayerProxyActivity.java,UnityPlayerNativeActivity.java。前两个打开个后只有一行代码,说的是UnityPlayerActivity和UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity。而打开UnityPlayerNativeActivity中居然有代码,而且我估计这应该是UnityPlayerNativeActivity的源码。
由于关于UnityPlay的资料我只找到这么一个,所以我把UnityPlayerNativeActivity中的代码都贴出来,如果我注解有不对的地方希望大家指正。
/**
* UnityPlayerActivity,UnityPlayerProxyActivity都继承自UnityPlayerNativeActivity
* 而UnityPlayerNativeActivity继承自NativeActivity
* 在该类里定义了一些和ANDROID生命周期相同的回调方法,留给自定义的Activity子类重写。
*/
public class UnityPlayerNativeActivity extends NativeActivity
//UnityPlayer的引用,并且我们不能改变这个引用变量的名字,它被native code所引用
protected UnityPlayer mUnityPlayer;
protected void onCreate (Bundle savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// 设置显示窗口参数
getWindow().takeSurface(null);
setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
getWindow().setFormat(PixelFormat.RGB_565);
// 创建一个UnityPlayer对象,并赋值给全局的引用变量
mUnityPlayer = new UnityPlayer(this);
//为UnityPlayer设置一些参数
if (mUnityPlayer.getSettings ().getBoolean ("hide_status_bar", true))
getWindow ().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1);
boolean trueColor8888 = false;
// UnityPlayer.init()方法需要在将view附加到layout之前调用。它将会调用native code
mUnityPlayer.init(glesMode, trueColor8888);
// 从UnityPlayer中获取到Unity的View视图
View playerView = mUnityPlayer.getView();
// 将Unity视图加载到根视图上
setContentView(playerView);
// 使Unity视图获取焦点
playerView.requestFocus();
protected void onDestroy ()
// 当Activity结束的时候调用UnityPlayer.quit()方法,它会卸载之前调用的native code
mUnityPlayer.quit();
super.onDestroy();
// 下面几个方法都是ANDROID相关回调方法,确保在ANDROID执行相应方法时UnityPlayer也需调用相应方法
protected void onPause()
super.onPause();
mUnityPlayer.pause();
protected void onResume()
super.onResume();
mUnityPlayer.resume();
public void onConfigurationChanged(Configuration newConfig)
super.onConfigurationChanged(newConfig);
mUnityPlayer.configurationChanged(newConfig);
public void onWindowFocusChanged(boolean hasFocus)
super.onWindowFocusChanged(hasFocus);
mUnityPlayer.windowFocusChanged(hasFocus);
public boolean dispatchKeyEvent(KeyEvent event)
if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
return mUnityPlayer.onKeyMultiple(event.getKeyCode(), event.getRepeatCount(), event);
return super.dispatchKeyEvent(event);
参考技术A 整个project包含好几个module,其中有一个jar包同时存在于两个module的libs下,在项目build的时候,两个相同的jar都被打包到dex文件中,编译器搞不定,就出了这么个错误了。解决的办法也比较简单:删除重复的jar,只保留一个!追问
在哪删除呢?
新手,不懂呢!
androidstudio项目签名打包生成apk出错整理
参考技术A 本人由于一些误操作接触到打包文件的问题,故作此文避免再次踩坑。1.入口:build->generate signed bundle/APK,打开后如下图1.1:
2.选中apk打包,进入next:
3.选择打包类型:
4.箭头所指即为生成的混淆+签名后的打包apk文件。(*签名文件不可以随便更改,如果有申请第三方的功能,都需要这个签名文件去检验的,比如说集成了微信支付,我们换签名文件的话,微信那边就会检验不通过)
5.本文重点并非上述步骤,而是我自己重新生成了一个密钥后,打包文件变成了.aab后缀文件。于是我想研究下它的打包过程和原理:
5.1在我们的build.gradle中可以更新打包文件版本号名称(自己配一下):
5.2签名文件会在此处进行对应生成信息:
5.3当然,你的项目文件也会对应生成相应的签名文件,例如我此处的文件为yoocarjks.jks:
5.4自己配一下打包生成文件的命名:
以上over
6.*问题点:
6.1.签名文件生成的乱码是些啥?
6.2.由于我当时把项目扔垃圾桶了,还有些文件并没有搞清楚是干嘛的,如下图:
buildoutputcleanuo.lock/executionhistory.bin/executionhistory.lock/filehashes.bin/filehashes.lock/outputfiles.bin/xxx.app.iml这些文件分别干嘛的,从包名看像是打包生成的文件。
作此文激励下自己空了去学习查阅下,若有知道的小伙伴欢迎留言分享~此文会继续追更~
7.1关于xxx.app.iml看到一篇不错的出错解决方案:
https://blog.csdn.net/qq_38998213/article/details/81907253
设计原理如下:
这个文件,后续遇到问题我再深入了解下
以上是关于使用android studio 导出apk项目时候报这个错误,求大神解答!的主要内容,如果未能解决你的问题,请参考以下文章