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 binary 10 11 optional arguments: 12 -h, --help show this help message and exit 13 -s SRC_DIR, --src SRC_DIR 14 project base directory 15 -q, --quiet less output 16 -p PLATFORM, --platform PLATFORM 17 select a platform (android, ios, mac, web, win32, 18 linux) 19 -m MODE, --mode MODE Set the compile mode, should be debug|release, default 20 is debug. 21 -j JOBS, --jobs JOBS Allow N jobs at once. 22 23 Android Options: 24 --ap ANDROID_PLATFORM 25 parameter for android-update.Without the parameter,the 26 script just build dynamic library for project. Valid 27 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 be 29 debug|release|none, native code will not be compiled 30 when the value is none. Default is same value with -m 31 32 Web Options: 33 --source-map Enable source-map 34 35 iOS Options: 36 --sign-identity SIGN_ID 37 The code sign identity for iOS. It's required when the 38 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_KEY 48 Specify the encrypt key for the encrypting of lua 49 scripts. 50 --lua-encrypt-sign LUA_ENCRYPT_SIGN 51 Specify the encrypt sign for the encrypting of lua 52 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-r10 export ANT_ROOT=/Users/dn9x/Android/apache-ant-1.9.4/bin export ANDROID_SDK_ROOT=/Users/dn9x/Android/adt-bundle-mac-x86_64-20140702/sdk export 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.4 export 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 19 Running command: compile Building mode: debug building native NDK build mode: debug The 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.prop 10 11 -post-build: 12 13 debug: 14 15 BUILD SUCCESSFUL 16 Total time: 12 seconds 17 Move apk to /Users/dn9x/work/study/cocos/HelloC1/runtime/android 18 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 online 100 adb start-server - ensure that there is a server running 101 adb kill-server - kill the server if it is running 102 adb get-state - prints: offline | bootloader | device 103 adb get-serialno - prints: <serial-number> 104 adb get-devpath - prints: <device-path> 105 adb status-window - continuously print device status for a specified device 106 adb remount - remounts the /system partition on the device read-write 107 adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program 108 adb reboot-bootloader - reboots the device into the bootloader 109 adb root - restarts the adbd daemon with root permissions 110 adb usb - restarts the adbd daemon listening on USB 111 adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port 112 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_tty1 116 [parameters] - Eg. defaultroute debug dump local notty usepeerdns 117 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 partition 124 is updated. 125 126 environmental variables: 127 ADB_TRACE - Print debug information. A comma separated list of the following values 128 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp 129 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 devices 2 List of devices attached 3 4LRSDI5DIJVG7HFU device 4 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 it 3 ('-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.apk 2 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.apk 6 Success 7 bogon:bin dn9x$ pwd 8 /Users/dn9x/work/study/cocos/HelloC1/frameworks/runtime-src/proj.android/bin 9 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中的知识了,