sublime怎么真机同步到虚拟机安装海马模拟器玩模拟器

为什么装了模拟器。sublimetext3还是不能真机同步
[问题点数:40分]
为什么装了模拟器。sublimetext3还是不能真机同步
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|轻松一扫,精彩不停
扫描下载APP
正在学习:
感谢你的评价,我们会继续努力!
恭喜,你已学完本节课程!
感谢你的评价,我们会继续努力!
写点什么吧,你的感受对其他同学有很大帮助噢
字数限250字以内
APP开发教程 - APICloud Android 功能模块开发教程
APP开发教程 - APICloud iOS功能模块开发
APICloud界面布局基础
购买后可以学习整个课程
&课程信息&
课程价格:0.00元
购买人数:304人
学生满意度:87.50%
直播倒计时:09小时52分15秒
上课时间:
线下课倒计时:09小时52分15秒
扫码下载APP
下载和安装 Sublime Text 3
html+js+css学员
使用Sublime Text 3开发移动应用,sublime开发工具windows版本必备视频,从安装到开发环环相扣层层嵌套,让你快速掌握!官网:www.apicloud.com
李德兴 APICloud技术负责人
一直从事浏览器、JavaScript引擎及相关中间件技术,参与过多个基于浏览器的移动中间件引擎的开发工作。精通Android操作系统,有丰富的app架构及开发经验。热爱新技术,熟悉HTML5及W3C规范,对HTML5及浏览器技术的实际应用有深入研究并付诸大量实践。
-戳文字链查看
&戳文字链查看
&戳文字链查看
Sublime APICloud Plugins是APICloud为开发者提供的一套开源的Sublime Text扩展插件,包括:应用管理、应用框架、页面模板、代码提示、代码管理、Widget打包、真机同步、日志输出、管理自定义AppLoader等功能,其他的功能插件也在不断增加,这些插件已被Package Control成功收录,开发者可以直接在Sublime Text3中下载安装。
第1章Sublime Text 3系列课程 - Windows版
下载和安装 Sublime Text 3
设置 Sublime Text 3
手动安装 Package Control 插件
手动安装 APICloud 插件
在线安装海马玩模拟器
为海马玩模拟器安装应用
海马玩模拟器与 windows 文件共享
创建 Sublime Text 3 项目
创建 APICloud 空白应用
创建 APICloud 文件
利用 emmet 插件快速编写 html 页面
展示代码提示和自动补全功能
修改 uiinput 代码提示和自动补全功能
为 UIActionSelector 模块加代码提示和补全功能
下载和安装 chrome 浏览器
在线安装 Side Bar 插件
利用 Side Bar 插件和 Chrome 浏览器调试页面样式
Mac 系统 Android 真机同步准备工作
演示 Android 一键真机同步
查看 Android 真机同步过程日志
Mac 系统 iOS 真机同步准备工作
查看 iOS 真机同步过程日志
第2章Sublime Text 3系列课程 - Mac版
下载和安装 Sublime Text 3
设置 Sublime Text 3
手动安装 Package Control 插件
手动安装 APICloud 插件
在线安装海马玩模拟器
设置海马玩模拟器
为海马玩模拟器安装应用
海马玩模拟器与 windows 文件共享
创建 Sublime Text 3 项目
创建 APICloud 空白应用
创建 APICloud 文件
利用 emmet 插件快速编写 html 页面
展示代码提示和自动补全功能
修改 uiinput 代码提示和自动补全功能
为 UIActionSelector 模块加代码提示和补全功能
下载和安装 chrome 浏览器
在线安装 Side Bar 插件
利用 Side Bar 插件和 Chrome 浏览器调试页面样式
Mac 系统 Android 真机同步准备工作
演示 Android 一键真机同步
查看 Android 真机同步过程日志
Mac 系统 iOS 真机同步准备工作
演示 iOS 一键真机同步
查看 iOS 真机同步过程日志
课程暂无资料
BoboTreeXDS
字数限400字符内
字数限400字符内
字数限400字符内
乌拉乌拉1114
字数限400字符内
伤心一剑fly
字数限400字符内
字数限400字符内
字数限400字符内
该机构的同类课程
1075 人已学
该机构的热门课程
1075 人已学
326 人已学
135 人已学
107 人已学在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
标签:至少1个,最多5个
HyBrid App
HyBrid App 与 Web App 以及 Native App的区别
Web App 开发 (Bootstrap能够开发PC也可以开发HTML5)
Web App开发,严格来说,并不是一个APP软件,只是一个Web型的微网站.
优点: 开发时间短,兼容性强,方便移植。缺点:必须有网络的支持,用户体验度相对较差。
Native App 开发
Native开发,就是一个原生的APP软件,其主要是通过Java或Object-C来实现原生的手机APP软件.
优点:原生APP,用户体验度非常好,可以调用手机的底层组件。缺点:开发时间长,兼容性差,必须要掌握Java或Object-C等编程语言
HyBrid App
介于WebApp和Native这两者之间的APP,开发时间短,成本低,用户体验好,可以调用手机底层组件,方便移植,是目前以及未来APP开发的流程趋势。
注册ApiCloud 平台
进入ApiCloud开发控制台
使用云编译生成App软件
获取App源代码
配置模拟器
下载ApiCloud支持的工具,放入Sublime Text插件包中:
海马玩模拟器
ApiCloud工程目录
// 样式文件
html // 后缀为.html的框架文件
icon // icon
image // 图片文件
script // JavaScript文件
config.xml // 默认配置文件
index.html // 入口文件
App项目必备mate视口
&meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/&
format-detection设置:默认情况下,手机设备不直接识别手机号码,邮箱,日期,address地址。
&meta name="format-detection" content="telephone=no,email=no,date=no,address=no"&
&!DOCTYPE html&
&meta charset="utf-8"&
&meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/&
&title&title&/title&
&link rel="stylesheet" type="text/css" href="api.css"/&
&script type="text/javascript" src="api.js"&&/script&
&script type="text/javascript"&
apiready = function(){
入口文件的JavaScript
apiready = function(){ // apireday = function() {} // 页面载入
// $api对象 操作DOM, api调用底层方法
$api.fixStatusBar( $api.dom('header') ); // 适配IOS7+,Android4.4+状态栏沉浸式效果。
// 动态计算header的高度,因iOS7+和Andriod4.4+上支持沉浸式效果,因此header的实际高度可能为css样式中声明的44px加上设备状态栏高度,其中iOS状态栏高度为20px,Andriod为25px
var headerH = $api.offset($api.dom('header')).h; // $api.offset().h
获取元素高度
// footer高度为css样式中声明的30px
var footerH = 30;
// frame 的高度为当前window高度减去header和footer的高度
var frameH = api.winHeight - headerH - footerH;
api.setStatusBarStyle({
style: 'dark',
color: '#6ab494'
// 打开openFrame框架,参数只有一个,json配置项
api.openFrame({
name: 'win_home',
// 框架名称
url: './html/win_home.html', // 打开url连接地址
bounces: true, // 是否可以拖动
rect: { // 设置框架的宽高以及横纵坐标
y: $api.dom('header').offsetHeight,
w: api.winWidth,
h: $api.dom('#main').offsetHeight
year = $api.byId('year');
year.innerHTML = new Date().getFullYear();
$api // 获取DOM结构
api // 获取底层方法
apiCloud的JavaScript代码api.js
(function(window){
var u = {};
var isAndroid = (/android/gi).test(navigator.appVersion);
var uzStorage = function(){
var ls = window.localS
if(isAndroid){
ls = os.localStorage();
function parseArguments(url, data, fnSuc, dataType) {
if (typeof(data) == 'function') {
dataType = fnS
if (typeof(fnSuc) != 'function') {
dataType = fnS
data: data,
fnSuc: fnSuc,
dataType: dataType
u.trim = function(str){
if(String.prototype.trim){
return str == null ? "" : String.prototype.trim.call(str);
return str.replace(/(^\s*)|(\s*$)/g, "");
u.trimAll = function(str){
return str.replace(/\s*/g,'');
u.isElement = function(obj){
return !!(obj && obj.nodeType == 1);
u.isArray = function(obj){
if(Array.isArray){
return Array.isArray(obj);
return obj instanceof A
u.isEmptyObject = function(obj){
if(JSON.stringify(obj) === '{}'){
u.addEvt = function(el, name, fn, useCapture){
if(!u.isElement(el)){
console.warn('$api.addEvt Function need el param, el param must be DOM Element');
useCapture = useCapture ||
if(el.addEventListener) {
el.addEventListener(name, fn, useCapture);
u.rmEvt = function(el, name, fn, useCapture){
if(!u.isElement(el)){
console.warn('$api.rmEvt Function need el param, el param must be DOM Element');
useCapture = useCapture ||
if (el.removeEventListener) {
el.removeEventListener(name, fn, useCapture);
u.one = function(el, name, fn, useCapture){
if(!u.isElement(el)){
console.warn('$api.one Function need el param, el param must be DOM Element');
useCapture = useCapture ||
var that =
var cb = function(){
fn && fn();
that.rmEvt(el, name, cb, useCapture);
that.addEvt(el, name, cb, useCapture);
u.dom = function(el, selector){
if(arguments.length === 1 && typeof arguments[0] == 'string'){
if(document.querySelector){
return document.querySelector(arguments[0]);
}else if(arguments.length === 2){
if(el.querySelector){
return el.querySelector(selector);
u.domAll = function(el, selector){
if(arguments.length === 1 && typeof arguments[0] == 'string'){
if(document.querySelectorAll){
return document.querySelectorAll(arguments[0]);
}else if(arguments.length === 2){
if(el.querySelectorAll){
return el.querySelectorAll(selector);
u.byId = function(id){
return document.getElementById(id);
u.first = function(el, selector){
if(arguments.length === 1){
if(!u.isElement(el)){
console.warn('$api.first Function need el param, el param must be DOM Element');
return el.children[0];
if(arguments.length === 2){
return this.dom(el, selector+':first-child');
u.last = function(el, selector){
if(arguments.length === 1){
if(!u.isElement(el)){
console.warn('$api.last Function need el param, el param must be DOM Element');
var children = el.
return children[children.length - 1];
if(arguments.length === 2){
return this.dom(el, selector+':last-child');
u.eq = function(el, index){
return this.dom(el, ':nth-child('+ index +')');
u.not = function(el, selector){
return this.domAll(el, ':not('+ selector +')');
u.prev = function(el){
if(!u.isElement(el)){
console.warn('$api.prev Function need el param, el param must be DOM Element');
var node = el.previousS
if(node.nodeType && node.nodeType === 3){
node = node.previousS
u.next = function(el){
if(!u.isElement(el)){
console.warn('$api.next Function need el param, el param must be DOM Element');
var node = el.nextS
if(node.nodeType && node.nodeType === 3){
node = node.nextS
u.closest = function(el, selector){
if(!u.isElement(el)){
console.warn('$api.closest Function need el param, el param must be DOM Element');
var doms, targetD
var isSame = function(doms, el){
var i = 0, len = doms.
for(i; i& i++){
if(doms[i].isEqualNode(el)){
return doms[i];
var traversal = function(el, selector){
doms = u.domAll(el.parentNode, selector);
targetDom = isSame(doms, el);
while(!targetDom){
el = el.parentN
if(el != null && el.nodeType == el.DOCUMENT_NODE){
traversal(el, selector);
return targetD
return traversal(el, selector);
u.contains = function(parent,el){
var mark =
if(el === parent){
el = el.parentN
if(el === parent){
}while(el === document.body || el === document.documentElement);
u.remove = function(el){
if(el && el.parentNode){
el.parentNode.removeChild(el);
u.attr = function(el, name, value){
if(!u.isElement(el)){
console.warn('$api.attr Function need el param, el param must be DOM Element');
if(arguments.length == 2){
return el.getAttribute(name);
}else if(arguments.length == 3){
el.setAttribute(name, value);
u.removeAttr = function(el, name){
if(!u.isElement(el)){
console.warn('$api.removeAttr Function need el param, el param must be DOM Element');
if(arguments.length === 2){
el.removeAttribute(name);
u.hasCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.hasCls Function need el param, el param must be DOM Element');
if(el.className.indexOf(cls) & -1){
u.addCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.addCls Function need el param, el param must be DOM Element');
if('classList' in el){
el.classList.add(cls);
var preCls = el.classN
var newCls = preCls +' '+
el.className = newC
u.removeCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.removeCls Function need el param, el param must be DOM Element');
if('classList' in el){
el.classList.remove(cls);
var preCls = el.classN
var newCls = preCls.replace(cls, '');
el.className = newC
u.toggleCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.toggleCls Function need el param, el param must be DOM Element');
if('classList' in el){
el.classList.toggle(cls);
if(u.hasCls(el, cls)){
u.removeCls(el, cls);
u.addCls(el, cls);
u.val = function(el, val){
if(!u.isElement(el)){
console.warn('$api.val Function need el param, el param must be DOM Element');
if(arguments.length === 1){
switch(el.tagName){
case 'SELECT':
var value = el.options[el.selectedIndex].
case 'INPUT':
return el.
case 'TEXTAREA':
return el.
if(arguments.length === 2){
switch(el.tagName){
case 'SELECT':
el.options[el.selectedIndex].value =
case 'INPUT':
el.value =
case 'TEXTAREA':
el.value =
u.prepend = function(el, html){
if(!u.isElement(el)){
console.warn('$api.prepend Function need el param, el param must be DOM Element');
el.insertAdjacentHTML('afterbegin', html);
u.append = function(el, html){
if(!u.isElement(el)){
console.warn('$api.append Function need el param, el param must be DOM Element');
el.insertAdjacentHTML('beforeend', html);
u.before = function(el, html){
if(!u.isElement(el)){
console.warn('$api.before Function need el param, el param must be DOM Element');
el.insertAdjacentHTML('beforebegin', html);
u.after = function(el, html){
if(!u.isElement(el)){
console.warn('$api.after Function need el param, el param must be DOM Element');
el.insertAdjacentHTML('afterend', html);
u.html = function(el, html){
if(!u.isElement(el)){
console.warn('$api.html Function need el param, el param must be DOM Element');
if(arguments.length === 1){
return el.innerHTML;
}else if(arguments.length === 2){
el.innerHTML =
u.text = function(el, txt){
if(!u.isElement(el)){
console.warn('$api.text Function need el param, el param must be DOM Element');
if(arguments.length === 1){
return el.textC
}else if(arguments.length === 2){
el.textContent =
u.offset = function(el){
if(!u.isElement(el)){
console.warn('$api.offset Function need el param, el param must be DOM Element');
var sl = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
var st = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
var rect = el.getBoundingClientRect();
l: rect.left + sl,
t: rect.top + st,
w: el.offsetWidth,
h: el.offsetHeight
u.css = function(el, css){
if(!u.isElement(el)){
console.warn('$api.css Function need el param, el param must be DOM Element');
if(typeof css == 'string' && css.indexOf(':') & 0){
el.style && (el.style.cssText += ';' + css);
u.cssVal = function(el, prop){
if(!u.isElement(el)){
console.warn('$api.cssVal Function need el param, el param must be DOM Element');
if(arguments.length === 2){
var computedStyle = window.getComputedStyle(el, null);
return computedStyle.getPropertyValue(prop);
u.jsonToStr = function(json){
if(typeof json === 'object'){
return JSON && JSON.stringify(json);
u.strToJson = function(str){
if(typeof str === 'string'){
return JSON && JSON.parse(str);
u.setStorage = function(key, value){
if(arguments.length === 2){
if(typeof v == 'object'){
v = JSON.stringify(v);
v = 'obj-'+
v = 'str-'+
var ls = uzStorage();
ls.setItem(key, v);
u.getStorage = function(key){
var ls = uzStorage();
var v = ls.getItem(key);
if(v.indexOf('obj-') === 0){
v = v.slice(4);
return JSON.parse(v);
}else if(v.indexOf('str-') === 0){
return v.slice(4);
u.rmStorage = function(key){
var ls = uzStorage();
if(ls && key){
ls.removeItem(key);
u.clearStorage = function(){
var ls = uzStorage();
ls.clear();
/*by king*/
u.fixIos7Bar = function(el){
if(!u.isElement(el)){
console.warn('$api.fixIos7Bar Function need el param, el param must be DOM Element');
var strDM = api.systemT
if (strDM == 'ios') {
var strSV = api.systemV
var numSV = parseInt(strSV,10);
var fullScreen = api.fullS
var iOS7StatusBarAppearance = api.iOS7StatusBarA
if (numSV &= 7 && !fullScreen && iOS7StatusBarAppearance) {
el.style.paddingTop = '20px';
u.fixStatusBar = function(el){
if(!u.isElement(el)){
console.warn('$api.fixStatusBar Function need el param, el param must be DOM Element');
var sysType = api.systemT
if(sysType == 'ios'){
u.fixIos7Bar(el);
}else if(sysType == 'android'){
var ver = api.systemV
ver = parseFloat(ver);
if(ver &= 4.4){
el.style.paddingTop = '25px';
u.toast = function(title, text, time){
var opts = {};
var show = function(opts, time){
api.showProgress(opts);
setTimeout(function(){
api.hideProgress();
if(arguments.length === 1){
var time = time || 500;
if(typeof title === 'number'){
opts.title = title+'';
show(opts, time);
}else if(arguments.length === 2){
var time = time || 500;
var text =
if(typeof text === "number"){
if(title){
opts.title =
opts.text =
show(opts, time);
if(title){
opts.title =
opts.text =
time = time || 500;
show(opts, time);
u.post = function(/*url,data,fnSuc,dataType*/){
var argsToJson = parseArguments.apply(null, arguments);
var json = {};
var fnSuc = argsToJson.fnS
argsToJson.url && (json.url = argsToJson.url);
argsToJson.data && (json.data = argsToJson.data);
if(argsToJson.dataType){
var type = argsToJson.dataType.toLowerCase();
if (type == 'text'||type == 'json') {
json.dataType =
json.dataType = 'json';
json.method = 'post';
api.ajax(json,
function(ret,err){
if (ret) {
fnSuc && fnSuc(ret);
u.get = function(/*url,fnSuc,dataType*/){
var argsToJson = parseArguments.apply(null, arguments);
var json = {};
var fnSuc = argsToJson.fnS
argsToJson.url && (json.url = argsToJson.url);
//argsToJson.data && (json.data = argsToJson.data);
if(argsToJson.dataType){
var type = argsToJson.dataType.toLowerCase();
if (type == 'text'||type == 'json') {
json.dataType =
json.dataType = 'text';
json.method = 'get';
api.ajax(json,
function(ret,err){
if (ret) {
fnSuc && fnSuc(ret);
window.$api =
})(window);
系统基本信息
// 获取引擎版本号
var ver = api.
// 获取系统类型(Android或iOS)
var sType = api.systemT
// 获取系统的版本信息
var sVer = api.systemV
// 获取设备标识
var id = api.deviceId;
// 获取设备的型号
var model = api.deviceM
// 获取设备的名称(HTC | 小米| 魅族| 华为)
var name = api.deviceN
// 获取网络连接类型 (wifi|3G|4G)
var cType = api.connectionT
// 获取window窗体的名称
var winName = api.winN
// 获取window窗体的高度
var winHeight = api.winH
// 获取frame框架的名称
var frameName = api.frameName || '';
// 获取frame框架的宽度
var frameWidth = api.frameWidth || '';
// 获取frame框架的高度
var frameHeight = api.frameHeight || '';
logo和引导页
logo和引导页位置:在apiCloud的开发控制台的端设置.
自定义loader
自定义loader实现真机同步。位置:在apiCloud的开发控制台的模块-自定义loader.
使用自定义loader根据config.xml中的widgt包名&widget id="A1" version="0.0.1"&创建一个文件夹(文件名为:A1).当前目录下G:\SublimeText3\Sublime Text 3x64\Data\Packages\Sublime-APICloud-Loader\appLoader\custom-loader
apiCloud使用模块
使用api.openWin传递参数.
api.openWin({
pageParam: {
api.pageParam.url接收参数.
apiCloude模块netAudio(音乐播放模块)shareAction(分享功能)
只要更改模块的,都需要生成自定义loader
查看netAudio手册,使用API.
0 收藏&&|&&1
你可能感兴趣的文章
14 收藏,2.6k
3 收藏,1.2k
7 收藏,856
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。没有更多推荐了,
不良信息举报
举报内容:
APICloud和海马玩模拟器结合调试手机页面
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
SublimeAPICloud插件的安装和使用说明[一].docx 10页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
Sublime APICloud 插件的安装和使用说明(一)开源地址:/APICloud当前支持环境Sublime Text 3Windows 或 MacAndroid 手机Ios 手机首先安装 Package Control1、通过快捷键?ctrl+`?或者?View & Show Console?菜单打开控制台2、粘贴下面的代码后,回车安装3、参考资料Package Control 安装import urllib.request,os, h = 'e5ee549c' + '8bc59f460fa163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h elseopen(os.path.join( ipp, pf), 'wb' ).write(by)安装真机同步插件1、快捷键 'Ctrl + Shift + P' (Mac 为:'Command + Shift + P')(或顶部菜单 -& Tools -& Command Palette),输入 'install',选择 'Package Control:Install Package'2、弹出的插件搜索框输入 'apicloud',选择 'APICloudLoader',回车等待安装完毕,重启 Sublime Text,即可使用。安装 APICloud 代码提示插件1、快捷键 'Ctrl + Shift + P' (Mac 为:'Command + Shift + P')(或顶部菜单 -& Tools -& Command Palette),输入 'install',选择 'Package Control:Install Package'2、弹出的插件搜索框输入 'apicloud',选择 'APICloudSnippets',回车等待安装完毕,重启 Sublime Text,即可使用。安装本地打包插件1、快捷键 'Ctrl + Shift + P' (Mac 为:'Command + Shift + P')(或顶部菜单 -& Tools -& Command Palette),输入 'install',选择 'Package Control:Install Package'2、弹出的插件搜索框输入 'apicloud',选择 'APICloudPackage',回车等待安装完毕,重启 Sublime Text,即可使用。创建新应用1、在任意目录新建一个项目文件夹,名字自定义,比如叫 'workspace'2、把 'workspace' 文件夹拖至 Sublime Text 开发工具,Sublime Text 左侧出现了一个新的项目文件夹3、右键点击 'workspace' 文件夹 -& 弹出菜单顶部选择 '新建APICloud项目' -& 根据需要选择相应的应用框架4、底部弹出一个输入框 -& 填入 APICloud 项目名称 -& 点击回车键5、新项目创建成功创建APICloud文件点击此菜单项将在新建文件中生成默认的html相关模板内容。压缩 Widget 包,用于代码上传1、打开本地应用文件夹的?config.xml?文件,把其中的 id 修改成云平台创建的应用 ID2、右键点击应用项目文件夹 -& 选择 '压缩Widget包',压缩后的 zip 包位于同级目录,压缩后的 zip 包可直接用于 APICloud 平台的代码上传功能。官方 Loader 真机同步Android设备真机同步1、启动Android模拟器,例如:海马玩模拟器下载,或通过 USB 线连接 Android 手机,保证 'USB 调试' 已打开,等待手机与电脑连接成功2
正在加载中,请稍后...

我要回帖

更多关于 海马玩安卓模拟器 的文章

 

随机推荐