Unity3D + 移动MM sdk 实战

Updated:本文中加删除线的内容为第一版。
第一版的实现方案为使用apktool对apk进行重新编译。但实际上该操作没有任何必要,修正后的方案弃用了apktool,整个过程更加简便和安全。修正后的内容都进行了飘红操作。

参考链接:
http://blog.csdn.net/huang7jiao/article/details/18191201
http://blog.csdn.net/u012085988/article/details/17531005
http://blog.csdn.net/lihandsome/article/details/11919113
http://www.jondev.net/articles/Unsigning_Android_APK_Packages

 

本文环境:
OS:Mac 10.9.4
MM SDK:2.4.0

移动MM sdk将所有用到的资源文件都打包到了sdk jar中,而不是按照安卓常规做法来实现(零散的资源文件放到assets目录),这么做虽然极大地方便了开发者进行集成,但在Unity工程集成时却带来了很大的问题。

  • 创建android plugin project

这个步骤可以参照网上的攻略,一搜一大堆,文首的链接中也有相关叙述。大致顺序是:

·eclipse建立android工程,包名要跟Unity工程的bundle id保持一致。
·把Unity自带的classes.jar添加到build path。在Mac上这个jar包位于

/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin /Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidDevelopmentPlayer/bin/classes.jar

·添加mm sdk相关文件、添加你自己的计费接口java代码、修改AndroidManifest.xml,·确保工程编译通过
·将你自己的计费接口java类export成jar包,名字无所谓,比如叫mmplugin.jar。

  • 将android plugin集成到unity工程中

用解压缩软件打开mmbilling.2.4.0.jar,将根目录下的assets文件夹CopyrightDeclaration.xmlmmiap.xmlVERSION都拷出来。
这样一来,你现在有如下的文件列表:
·AndroidManifest.xml  //<==来自android plugin project
·assets/    //<==解压mmbilling.2.4.0.jar得到
·libs/   //<==sdk自带
·mmplugin.jar   //<==android plugin project导出
·CopyrightDeclaration.xml    //<==解压mmbilling.2.4.0.jar得到
·mmiap.xml    //<==解压mmbilling.2.4.0.jar得到
·VERSION    //<==解压mmbilling.2.4.0.jar得到

将前面4项扔到unity工程的Assets/Plugins/Android/下,后面3个文件现在先不管,他们最终会出现在apk的根目录下,下文会详述。

  • 修改unity工程源码,添加调用mmplugin.jar中的接口java代码进行计费。这部分不在本文叙述范围内。

 

  • 确保代码无误后build android apk,得到yourgame.apk文件

 

  • 这个apk现在还缺少上面提到的那三个文件,由于unity编译出的apk是签过名的,无法直接用aapt工具往里面添加文件(会破坏签名),所以我们先要反编译去掉签名,添加文件后再重新签名。 Updated:所以我们在添加完三个文件后需要重新签名。

 

  • 下载apktool.jar,https://code.google.com/p/android-apktool/,最新版本为2.2.0b9。这货是个开源工具,用来反编译apk。如果下载有困难,可以猛击apktool_2.0.0b9.jar直接下载。
    除此之外,你还需要以下两个文件:aapt、zipalign。这俩货可以从android sdk目录中搜出来。

 

  • 确保你的机器上装有jre/jdk 1.7,否则apktool.jar无法正常工作。Mac上使用jdk 1.7还有点门道,请猛击此处查看究竟。

 

  • 最后的战役

建立一个非中文目录(apktool.jar只支持英文路径),将yourgame.apk、apktool_2.0.0b9.jar、aapt、zipalign、your_keystore.keystore、CopyrightDeclaration.xml、mmiap.xml、VERSION这几个文件放进去,打开终端,cd到该目录,依次执行以下命令(先别着急下手,看完下文的逐行说明再动手):

java -jar "apktool_2.0.0b9.jar" d -s -f -o tmp yourgame.apk
java -jar "apktool_2.0.0b9.jar" b -f -o compiled.apk tmp
rm -fr tmp
./aapt a compiled.apk CopyrightDeclaration.xml mmiap.xml VERSION
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore your_keystore.keystore compiled.apk your_alias_name
./zipalign -v 4 compiled.apk yourgame_resigned.apk
rm -f compiled.apk

第一行调用apktool来反编译apk,解压出来的文件放在tmp目录下。注意需要java 1.7
第二行调用apktool将tmp目录下的内容编译成未签名的apk。这两部其实是为了去掉unity build时对apk的签名,⊙﹏⊙b汗,够迂回吧
第三行删除tmp目录
第四行调用aapt往apk中添加mm sdk的三个文件
第五行对apk进行签名,你需要改成你自己的keystore文件和aliasname
第六行对签过名的apk进行zipalign处理,这个步骤是谷歌官方推荐的,别问那么多,照做就是

Updated:修正后的方案使用以下命令

./aapt a yourgame.apk CopyrightDeclaration.xml mmiap.xml VERSION
zip -d yourgame.apk "META-INF*"
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore your_keystore.keystore compiled.apk your_alias_name
./zipalign -v 4 compiled.apk yourgame_resigned.apk

第一行往yourgame.apk中追加三个文件
第二行删除yourgame.apk的失效的签名
第三行重新签名
第四行进行zipalign处理

接下来就可以拿yourgame_resigned.apk到真机上愉快地测试啦!

写在最后:

本文的策略来源于网络,但这个方案并不是最佳方案,试想如果没有apktool这样的开源项目,我们又该怎么办?由于本人对unity不熟悉,暂时只能用这种曲线救国方案来解决燃眉之急,但理论上,我们是不是可以通过修改unity打包apk的脚本来实现呢?
Updated:修正前的方案依赖apktool,稳定性堪忧,修正之后已经没有这方面的担忧了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据