首页 > 代码库 > Cocos2d-JS: 2.编译到安卓和iOS
Cocos2d-JS: 2.编译到安卓和iOS
上面介绍了项目的创建,这一节记录如何编译成安卓和iOS的app,这里先记录如何编译成iOS的。
1.首先在终端中进入到项目的目录下,先看下编译命令有哪些功能,运行cocos compile -h:
1 bogon:HelloC1 dn9x$ cocos compile -h 2 usage: cocos compile [-h] [-s SRC_DIR] [-q] [-p PLATFORM] [-m MODE] [-j JOBS] 3 [--ap ANDROID_PLATFORM] [--ndk-mode NDK_MODE] 4 [--source-map] [--sign-identity SIGN_ID] [--no-res] 5 [--compile-script {0,1}] [--lua-encrypt] 6 [--lua-encrypt-key LUA_ENCRYPT_KEY] 7 [--lua-encrypt-sign LUA_ENCRYPT_SIGN] 8 9 Compiles the current project to binary10 11 optional arguments:12 -h, --help show this help message and exit13 -s SRC_DIR, --src SRC_DIR14 project base directory15 -q, --quiet less output16 -p PLATFORM, --platform PLATFORM17 select a platform (android, ios, mac, web, win32,18 linux)19 -m MODE, --mode MODE Set the compile mode, should be debug|release, default20 is debug.21 -j JOBS, --jobs JOBS Allow N jobs at once.22 23 Android Options:24 --ap ANDROID_PLATFORM25 parameter for android-update.Without the parameter,the26 script just build dynamic library for project. Valid27 android-platform are:[10|11|12|13|14|15|16|17|18|19]28 --ndk-mode NDK_MODE Set the compile mode of ndk-build, should be29 debug|release|none, native code will not be compiled30 when the value is none. Default is same value with -m31 32 Web Options:33 --source-map Enable source-map34 35 iOS Options:36 --sign-identity SIGN_ID37 The code sign identity for iOS. It‘s required when the38 value of "-m, -mode" is release.39 40 lua/js project arguments:41 --no-res Package without project resources.42 --compile-script {0,1}43 Diable/Enable the compiling of lua/js script files.44 45 lua project arguments:46 --lua-encrypt Enable the encrypting of lua scripts.47 --lua-encrypt-key LUA_ENCRYPT_KEY48 Specify the encrypt key for the encrypting of lua49 scripts.50 --lua-encrypt-sign LUA_ENCRYPT_SIGN51 Specify the encrypt sign for the encrypting of lua52 scripts.53 bogon:HelloC1 dn9x$
这里面可以看到很多的参数,-p可以指定编译成什么模式,-m可以指定编译的模式是调试还是正式,还有专门安卓编译的选项等,这里是先介绍iOS的,因为我现在还不会oc,所以这一块我们直接使用xcode进行编译。
2.在项目目录下有个frameworks/runtime-src目录,这个目录里面就是各个平台的代码,V3.0 R1版本的默认有4中,android, ios, linux, win32,如:
3.直接点击上面的HelloC1.xcodeproj就会用xcode打开了,
设置下运行的虚拟设备:
设置完之后点击运行按钮就可以运行了:
初次运行可能有点慢,所以要稍等下,运行以后效果如下:
和浏览器中看到的效果是一样的。
4.编译成安卓的优点不太一样,这里你的电脑首先要安卓ndk,还要安装ant,所以推荐到谷歌网站上去下载adt套件,下载地址是:http://developer.android.com/sdk/index.html,ant可能要单独下载,下载地址是:http://ant.apache.org/bindownload.cgi,下载之后自己配置下环境变量,在/etc/profile中配置环境变量,如:
export NDK_ROOT=/Users/dn9x/Android/adt-bundle-mac-x86_64-20140702/android-ndk-r10export ANT_ROOT=/Users/dn9x/Android/apache-ant-1.9.4/binexport ANDROID_SDK_ROOT=/Users/dn9x/Android/adt-bundle-mac-x86_64-20140702/sdkexport PATH=/Users/dn9x/Cocos/cocos2d-js-v3.0-rc1/tools/cocos2d-console/bin:/Users/dn9x/Android/android-ndk-r9:/Users/dn9x/Android/adt-bundle-mac-x86_64-20140702/sdk/platform-tools:$PATH
这里的NDK_ROOT是要配置的,ANT_ROOT和ANDROID_SDK_ROOT也是要配置的,这里之所以配置了所有的东西是为了一次性的配置完成,后面安卓使用的时候就不用配置了,当然ant的环境变量也是要配置的,之前刚开始用mac的时候环境变量我都是配置在/etc/profile中,后来我看了下profile是所有用户登录的时候都会读取的,不建议配置在这里,所以后面的配置我就配置在另外一个文件中了,/etc/bashrc
export ANT_HOME=/Users/dn9x/Android/apache-ant-1.9.4export PATH=${PATH}:${ANT_HOME}/bin
配置好ndk和ant之后,重新启动下终端,
重启之后可以运行下ant -v看下是否配置成功,
5.开始编译为安卓程序,文章最开始的时候看过编译的命令,所以就直接使用命令行编译,这里介绍下,上面编译命令中有一个安卓命令的选项,如:
Android Options: --ap ANDROID_PLATFORM parameter for android-update.Without the parameter,the script just build dynamic library for project. Valid android-platform are:[10|11|12|13|14|15|16|17|18|19] --ndk-mode NDK_MODE Set the compile mode of ndk-build, should be debug|release|none, native code will not be compiled when the value is none. Default is same value with -m
这里的--ap是指安卓版本,所以在编译的时候可以带上这个,这样他就可以编译为安卓指定版本了
bogon:HelloC1 dn9x$ cocos compile -p android --ap 19Running command: compileBuilding mode: debugbuilding nativeNDK build mode: debugThe Selected NDK toolchain version was 4.8 !running: ‘/Users/dn9x/Android/adt-bundle-mac-x86_64-20140702/android-ndk-r10/ndk-build -C /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android -j1 NDK_MODULE_PATH=/Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/../../js-bindings:/Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/../../js-bindings/cocos2d-x:/Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/../../js-bindings/cocos2d-x/cocos:/Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/../../js-bindings/cocos2d-x/external NDK_DEBUG=1‘...........
编译的时间是比较久的,好了之后你可以看到:
1 -post-package: 2 3 -do-debug: 4 [zipalign] Running zip align on final apk... 5 [echo] Debug Package: /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/bin/HelloC1-debug.apk 6 [propertyfile] Creating new property file: /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/bin/build.prop 7 [propertyfile] Updating property file: /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/bin/build.prop 8 [propertyfile] Updating property file: /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/bin/build.prop 9 [propertyfile] Updating property file: /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/bin/build.prop10 11 -post-build:12 13 debug:14 15 BUILD SUCCESSFUL16 Total time: 12 seconds17 Move apk to /Users/dn9x/work/study/cocos/HelloC1/runtime/android18 build succeeded.19 bogon:HelloC1 dn9x$
6.安装编译后的程序到真机,这里把安卓手机通过数据线连接电脑,并且开启USB调试,通过adb命令安装,如果你按照上面的配置文件配置环境变量,那么应该可以直接使用adb命令,如:
1 bogon:HelloC1 dn9x$ adb -h 2 Android Debug Bridge version 1.0.31 3 4 -a - directs adb to listen on all interfaces for a connection 5 -d - directs command to the only connected USB device 6 returns an error if more than one USB device is present. 7 -e - directs command to the only running emulator. 8 returns an error if more than one emulator is running. 9 -s <specific device> - directs command to the device or emulator with the given 10 serial number or qualifier. Overrides ANDROID_SERIAL 11 environment variable. 12 -p <product name or path> - simple product name like ‘sooner‘, or 13 a relative/absolute path to a product 14 out directory like ‘out/target/product/sooner‘. 15 If -p is not specified, the ANDROID_PRODUCT_OUT 16 environment variable is used, which must 17 be an absolute path. 18 -H - Name of adb server host (default: localhost) 19 -P - Port of adb server (default: 5037) 20 devices [-l] - list all connected devices 21 (‘-l‘ will also list device qualifiers) 22 connect <host>[:<port>] - connect to a device via TCP/IP 23 Port 5555 is used by default if no port number is specified. 24 disconnect [<host>[:<port>]] - disconnect from a TCP/IP device. 25 Port 5555 is used by default if no port number is specified. 26 Using this command with no additional arguments 27 will disconnect from all connected TCP/IP devices. 28 29 device commands: 30 adb push [-p] <local> <remote> 31 - copy file/dir to device 32 (‘-p‘ to display the transfer progress) 33 adb pull [-p] [-a] <remote> [<local>] 34 - copy file/dir from device 35 (‘-p‘ to display the transfer progress) 36 (‘-a‘ means copy timestamp and mode) 37 adb sync [ <directory> ] - copy host->device only if changed 38 (-l means list but don‘t copy) 39 (see ‘adb help all‘) 40 adb shell - run remote shell interactively 41 adb shell <command> - run remote shell command 42 adb emu <command> - run emulator console command 43 adb logcat [ <filter-spec> ] - View device log 44 adb forward --list - list all forward socket connections. 45 the format is a list of lines with the following format: 46 <serial> " " <local> " " <remote> "\n" 47 adb forward <local> <remote> - forward socket connections 48 forward specs are one of: 49 tcp:<port> 50 localabstract:<unix domain socket name> 51 localreserved:<unix domain socket name> 52 localfilesystem:<unix domain socket name> 53 dev:<character device name> 54 jdwp:<process pid> (remote only) 55 adb forward --no-rebind <local> <remote> 56 - same as ‘adb forward <local> <remote>‘ but fails 57 if <local> is already forwarded 58 adb forward --remove <local> - remove a specific forward socket connection 59 adb forward --remove-all - remove all forward socket connections 60 adb jdwp - list PIDs of processes hosting a JDWP transport 61 adb install [-l] [-r] [-d] [-s] [--algo <algorithm name> --key <hex-encoded key> --iv <hex-encoded iv>] <file> 62 - push this package file to the device and install it 63 (‘-l‘ means forward-lock the app) 64 (‘-r‘ means reinstall the app, keeping its data) 65 (‘-d‘ means allow version code downgrade) 66 (‘-s‘ means install on SD card instead of internal storage) 67 (‘--algo‘, ‘--key‘, and ‘--iv‘ mean the file is encrypted already) 68 adb uninstall [-k] <package> - remove this app package from the device 69 (‘-k‘ means keep the data and cache directories) 70 adb bugreport - return all information from the device 71 that should be included in a bug report. 72 73 adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>] 74 - write an archive of the device‘s data to <file>. 75 If no -f option is supplied then the data is written 76 to "backup.ab" in the current directory. 77 (-apk|-noapk enable/disable backup of the .apks themselves 78 in the archive; the default is noapk.) 79 (-obb|-noobb enable/disable backup of any installed apk expansion 80 (aka .obb) files associated with each application; the default 81 is noobb.) 82 (-shared|-noshared enable/disable backup of the device‘s 83 shared storage / SD card contents; the default is noshared.) 84 (-all means to back up all installed applications) 85 (-system|-nosystem toggles whether -all automatically includes 86 system applications; the default is to include system apps) 87 (<packages...> is the list of applications to be backed up. If 88 the -all or -shared flags are passed, then the package 89 list is optional. Applications explicitly given on the 90 command line will be included even if -nosystem would 91 ordinarily cause them to be omitted.) 92 93 adb restore <file> - restore device contents from the <file> backup archive 94 95 adb help - show this help message 96 adb version - show version num 97 98 scripting: 99 adb wait-for-device - block until device is online100 adb start-server - ensure that there is a server running101 adb kill-server - kill the server if it is running102 adb get-state - prints: offline | bootloader | device103 adb get-serialno - prints: <serial-number>104 adb get-devpath - prints: <device-path>105 adb status-window - continuously print device status for a specified device106 adb remount - remounts the /system partition on the device read-write107 adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program108 adb reboot-bootloader - reboots the device into the bootloader109 adb root - restarts the adbd daemon with root permissions110 adb usb - restarts the adbd daemon listening on USB111 adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port112 networking:113 adb ppp <tty> [parameters] - Run PPP over USB.114 Note: you should not automatically start a PPP connection.115 <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1116 [parameters] - Eg. defaultroute debug dump local notty usepeerdns117 118 adb sync notes: adb sync [ <directory> ]119 <localdir> can be interpreted in several ways:120 121 - If <directory> is not specified, both /system and /data partitions will be updated.122 123 - If it is "system" or "data", only the corresponding partition124 is updated.125 126 environmental variables:127 ADB_TRACE - Print debug information. A comma separated list of the following values128 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp129 ANDROID_SERIAL - The serial number to connect to. -s takes priority over this if given.130 ANDROID_LOG_TAGS - When used with the logcat option, only these debug tags are printed.131 bogon:HelloC1 dn9x$
这里我们可以输入adb divices查看连接到电脑上的设备,
1 bogon:HelloC1 dn9x$ adb devices2 List of devices attached 3 4LRSDI5DIJVG7HFU device4 5 bogon:HelloC1 dn9x$
在测试安卓程序的时候,使用真机会比使用模拟器要快,我一般都是使用真机测试,
安装程序到真机,这里可以看到adb中的一个命令:
1 adb install [-l] [-r] [-d] [-s] [--algo <algorithm name> --key <hex-encoded key> --iv <hex-encoded iv>] <file>2 - push this package file to the device and install it3 (‘-l‘ means forward-lock the app)4 (‘-r‘ means reinstall the app, keeping its data)5 (‘-d‘ means allow version code downgrade)6 (‘-s‘ means install on SD card instead of internal storage)7 (‘--algo‘, ‘--key‘, and ‘--iv‘ mean the file is encrypted already)
这里我们可以看到一些安装的详细参数,这里我们进入到/HelloC1/frameworks/runtime-src/proj.android/bin目录下,可以看到生成的HelloC1-debug-unaligned.apk,我们安装此文件到手机中,
1 bogon:bin dn9x$ adb install HelloC1-debug-unaligned.apk2 9771 KB/s (7920657 bytes in 0.791s)3 WARNING: linker: libvc1dec_sa.ca7.so has text relocations. This is wasting memory and is a security risk. Please fix.4 WARNING: linker: libvc1dec_sa.ca7.so has text relocations. This is wasting memory and is a security risk. Please fix.5 pkg: /data/local/tmp/HelloC1-debug-unaligned.apk6 Success7 bogon:bin dn9x$ pwd8 /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/bin9 bogon:bin dn9x$
安装成功之后你的手机也会提示,然后再手机上打开可以看到和在浏览器中的效果是一致的,到这里你的cocos2d-js的项目就已经编译并且运行到安卓设备上了,
7.其实直接开发中我们往往都是在编译之后通过eclipse打开项目进行编译并且调试项目,这里我们就介绍下用eclipse打开项目并且运行项目,
首先打开eclipse,导入项目,
选择项目:
在eclipse中打开项目之后项目会报错,如:
这主要是因为我们要手动设置项目中需要的cocos提供的java文件,这些java文件的位置在:
/HelloC1/frameworks/js-bindings/cocos2d-x/cocos/platform/android/java/src
然后直接复制src中的整个org文件夹到项目的src中,如:
然后配置运行,这里我们在模拟器中运行下看看。在模拟器中就是太慢,还是运行在真机中把,我的手机是联想S568t,安卓版本的是:4.4.2,所以在运行是完全没有问题,
截取了下屏幕的快照,
下面就会开始记录cocos2d-js中的知识了,
Cocos2d-JS: 2.编译到安卓和iOS