Cocos-Lua IDE中打包android apk失败---一步一步揭开CocosIDE打包apk的过程

最近的cocos-Lua项目,打包android apk的时候老是失败,主要是dex过程中报错以下错误:

-dex:
      [dex] input: D:\projecty\projects\MonsterRun\trunk\MonsterRun\frameworks\runtime-src\proj.android\bin\classes
      [dex] input: D:\projecty\projects\MonsterRun\trunk\MonsterRun\frameworks\cocos2d-x\cocos\platform\android\java\bin\classes.jar
      [dex] input: D:\projecty\projects\MonsterRun\trunk\MonsterRun\frameworks\runtime-src\proj.android\libs\SDK__fat.jar
      [dex] Pre-Dexing D:\projecty\projects\MonsterRun\trunk\MonsterRun\frameworks\cocos2d-x\cocos\platform\android\java\bin\classes.jar -> classes-94a403c7f61e5d2c23fce32f778410b5.jar
      [dex] Pre-Dexing D:\projecty\projects\MonsterRun\trunk\MonsterRun\frameworks\runtime-src\proj.android\libs\SDK__fat.jar -> SDK__fat-93bf3f9d975b6198d3f96d98441a23d2.jar
       [dx] 
       [dx] trouble processing:
       [dx] bad class file magic (cafebabe) or version (0033.0000)
       [dx] ...while parsing com/squareup/okhttp/Address.class
       [dx] ...while processing com/squareup/okhttp/Address.class
       [dx] 
       [dx] trouble processing:
       [dx] bad class file magic (cafebabe) or version (0033.0000)
       [dx] ...while parsing com/squareup/okhttp/Authenticator.class
       [dx] ...while processing com/squareup/okhttp/Authenticator.class
       [dx] 
       [dx] trouble processing:
       [dx] bad class file magic (cafebabe) or version (0033.0000)
       [dx] ...while parsing com/squareup/okhttp/Cache$1.class
       [dx] ...while processing com/squareup/okhttp/Cache$1.class


我看到,全是okhttp的报错,那么就需要翻看okhttp首页看看,它对jdk是否有所要求。

OkHttp supports Android 2.3 and above. For Java,the minimum requirement is 1.7.


所以我认为一定是因为java jdk的版本导致的,因为我在导出sdk的jar包的时候,有指定了jdk的版本,而cocosIde的项目也有设置jdk的选项。

我在打包sdkjar包中的混淆中指定了javac编译java文件的版本:



而在cocosIDE中也有设置jdk的环境变量:


由此我就猜想,可能与java的jdk的版本有关。因为java的jdk版本对工程的使用往往都出现很多坑,例如在eclipse中用jdk7打的jar包,可能无法被在jdk6环境下的eclipse加载。因此,我把打jar包的命令升至1.7,重新打jar包。但是,问题依然存在。


jdk一致之后,问题仍然存在。问题一定是与dx命令有关的东西了。什么与dx命令有关呢?dx命令在哪里?所以我们有必要了解cocosIDE对android的apk的打包过程何时使用了dx,怎么使用dx。


1.回顾整个打包过程。

在Cocos-IDE的系统输出窗口可以到整个apk的打包过程,首先先是ndk-build打包so文件,然后就是Lua文件编译,再之后就进行android打包。

从中,我们看到在Lua文件编译完成之后,进行了android apk的打包。

其中打包命令在build.xml中。为了确定打包命令在其中,我们在cmd命令行中cd到该目录下,运行ant. 结果cmd中的输出内容和系统输出窗口的内容一致,证明该build文件是我们android打包apk的命令文件。


2.打开文件,找到打包的命令

打开对应的android工程下的build.xml,看到以下一句命令:

主要的打包命令是依赖了androidsdk文件夹下面的tools里面的ant命令。


3. 接着打开tools/ant/build.xml

终于,找到了cocos-IDE中打包android——apk包时使用的打包命令了,其使用的是androidsdk中带的build命令。

那么dx命令在哪里呢?


4. 为了找到dx命令的调用,我回到IDE打包的系统输出窗口,我们找到这样的输出(这个输出是后来成功打包的输出):



我看见了输出了build Tools的版本号,心里想,莫非是因为androidSDK的build-tools版本太低了吗?因为据我运用编译与反编译的多年经验来看,android的build-tools的版本对android工程的编译有着很大的影响。所以我赶紧打开SDK MAnager更新了build-tools.(以下图片都是后面已经更新好的截图)

5.更新完build-tools之后,再在cocos-IDE中打包apk,发现问题依然存在。

所以再次翻看ant/build.xml命令,看dx工具究竟在哪里被运用了。

回到文件头部的位置,我们可以看到,ant命令中主要引入那些文件夹里面的工具库:

看到没有,build命令里面,压根就没有调用build-tools文件夹的文件,它用了tools下面的dx命令和platform-tools下的adb。所以就再去更新tools吧。


6.把tools更新到25.0.0版本之后,再进行打包。终于可以了。


综上所述,如果dx出错,最好就更换一个合适的版本,因为dx的版本也会随着android-tools的版本作出更新,具体你们可以把dx文件命令配置到path中,通过cmd命令:

dx --version , 看到dx的版本号。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...