分类目录归档:Android开发

webapp的JS调试与性能优化

在调试MobileWeb的时候,如果打开空白窗口,其标题如:chrome-devtools://devtools/bundled/devtools.html类似,则说明这时你需要穿墙一次,才能打开调试界面,之后再次打开则不会存在任何问题的了,目前该调试是关联到不同手机平台的。

根据devtools进行优化前请详细阅读以下文档:
新版:https://developers.google.com/web/tools/chrome-devtools/
旧版:https://developer.chrome.com/devtools/docs/cpu-profiling

https://github.com/paulirish/adb_trace这是python版的通迅协议实现

cordova的命令集

附上cordova常用命令列表

命令 说明
cordova create <工程路径> <包名> <工程名> 创建cordova工程,例如:cordova create helloworld “org.commom.helloworld” “helloworld”
cordova platforms add android 添加平台支持。
cordova build android 给cordova项目添加android平台。
cordova run android 编译和运行项目。
cordova install android 将编译好的应用程序安装到模拟器上。
cordova plugin add <插件完全限定名> 给项目添加插件。
cordova plugin remove <插件完全限定名> 删除插件。
cordova plugin list 查看插件列表。
cordova build android 编译代码
cordova emulate android 在模拟器上运行(前提是创建好AVD)
cordova serve android 在浏览器运行
cordova run android 通过USB直接安装到真机

—————————–
插件:http://plugins.cordova.io/
如以上我们看到的,Cordova默认提供的程序界面和功能非常简单。当然你可以根据你的需要,运行标准Web开发技术对页面进行设计。但是当你需要和不同的设备进行通讯交互时,你就需要借助于一些插件,以便能够访问Cordova提供的核心API。
一般来说,你添加一个插件的目的是为了利用Cordova的API访问设备。详细的可用插件列表你可以在社区中看到(http://plugins.cordova.io/)。当然你也可以自定义自己的插件。
你可以用CLI搜索可用的插件,比如:
cordovaplugin search bar code
你可以通过以下命令安装插件,比如:
cordovaplugin add org.apache.cordova.device //设备API
cordovaplugin add org.apache.cordova.network-information //网络(事件)
cordovaplugin add org.apache.cordova.battery-status //电池(事件)
cordovaplugin add org.apache.cordova.device-motion //加速器
cordovaplugin add org.apache.cordova.device-orientation //罗盘
cordovaplugin add org.apache.cordova.geolocation //定位
cordovaplugin add org.apache.cordova.camera //摄像头
cordovaplugin add org.apache.cordova.media-capture //媒体文件处理
cordovaplugin add org.apache.cordova.media //媒体文件处理
cordovaplugin add org.apache.cordova.file //文件访问
cordovaplugin add org.apache.cordova.file-transfer //文件传输
cordovaplugin add org.apache.cordova.dialogs //对话框
cordovaplugin add org.apache.cordova.vibration //震动
cordovaplugin add org.apache.cordova.contacts //联系人
cordovaplugin add org.apache.cordova.globalization //全球化
cordovaplugin add org.apache.cordova.splashscreen //闪屏
cordovaplugin add org.apache.cordova.inappbrowser //打开新的浏览器窗口
cordovaplugin add org.apache.cordova.console //调试控制台
你可以用以下命令查看所有已经安装的插件
cordovaplugin ls
使用以下命令删除插件:
cordovaplugin rm org.apache.cordova.console
Plugin add高级选项
上面的安装方式是从registry.cordova.io库中按照id获取插件,这是一个非常通用的做法。你可以在安装时指定版本,比如:
cordovaplugin add org.apache.cordova.console@latest
cordovaplugin add org.apache.cordova.console@0.2.1
其中的latest表示获取最新版本。中间用@分隔。
如果插件不是在默认库中,而是在其他地方,则你可以指定URL:
cordovaplugin add https://github.com/apache/cordova-plugin-console.git
当然你需要先安装git。
Merge目录
前面提到,一般情况下最好不要修改各自平台下的www目录下的文件。但是如果你确实需要为某个平台定制一些内容,又该怎么办呢?
项目根目录下有一个merges目录。我们以一个实例来讲解:
1) 修改www\css目录下的index.css文件,设置event.received的样式为红色: background-color:#FF0000;
2) 修改platforms\android\assets\www\css中的index.css文件,设置.event.received的样式为蓝色:background-color:#0000FF;
3) 在merges\android目录下新建一个css目录。
复制www\css中的index.css文件到该目录下。
修改该目录下的index.css文件中的.event.received的样式为绿色:background-color:# 00FF00;
仿真器中运行,你会发现最终呈现的结果为绿色。由此我们可知:
1) Merges目录中没有对应文件时,platform下的文件会被跟目录(www)下的文件覆盖。(即:如果Merges目录中不存在index.css文件,最终颜色将为红色)
2) Merges目录中存在对应文件时,platform下的文件会被merges下的文件覆盖。可见Merges目录主要用于为平台定制功能。
帮助命令
通过以下命令查看帮助信息:
cordova help
更新命令
以下语句更新cordova:
npm update -g cordova
cordova更新完成后,你还需要更新项目:
cordovaplatform update android
注意:
因为各版本之间差异较大,执行更新时请事先仔细阅读官方文档,以免发生数据丢失或错误。

ionic使用代理

根据ionic提示:https://www.npmjs.com/package/ionic

export http_proxy=http://10.199.x.y:8971
# Or
export PROXY=http://10.199.x.y:8971

ionic start my_app

# Additionally, pass in line
PROXY=http://10.199.x.y:8971 ionic start myTest tabs

Qt与Object-C混合编程

1.添加proxy_ios.h文件,内容如下:
#ifndef PROXY_IOS_H
#define PROXY_IOS_H

QString systemProxy();

#endif // PROXY_IOS_H
2.添加proxy_ios.mm文件,内容如下:

#import
#import
#include

QString systemProxy(){
NSDictionary *proxySettings = NSMakeCollectable([(NSDictionary *)CFNetworkCopySystemProxySettings() autorelease]);
NSArray *proxies = NSMakeCollectable([(NSArray *)CFNetworkCopyProxiesForURL((CFURLRef)[NSURL URLWithString:@"http://www.baidu.com"], (CFDictionaryRef)proxySettings) autorelease]);
NSDictionary *settings = [proxies objectAtIndex:0];

QString host = QString::fromNSString([NSString stringWithFormat:@"%@", [settings objectForKey:(NSString *)kCFProxyHostNameKey]]);
QString port = QString::fromNSString([NSString stringWithFormat:@"%@", [settings objectForKey:(NSString *)kCFProxyPortNumberKey]]);
// QString type = QString::fromNSString([NSString stringWithFormat:@"%@", [settings objectForKey:(NSString *)kCFProxyTypeKey]]);
return host+":"+port;
}

3.在.pro工程文件中添加:
ios {
QMAKE_LFLAGS += -framework OpenGLES
QMAKE_LFLAGS += -framework GLKit
QMAKE_LFLAGS += -framework QuartzCore
QMAKE_LFLAGS += -framework CoreVideo
QMAKE_LFLAGS += -framework CoreAudio
QMAKE_LFLAGS += -framework CoreImage
QMAKE_LFLAGS += -framework CoreMedia
QMAKE_LFLAGS += -framework AVFoundation
QMAKE_LFLAGS += -framework AudioToolbox
QMAKE_LFLAGS += -framework CoreGraphics
QMAKE_LFLAGS += -framework UIKit
QMAKE_LFLAGS += -framework CFNetwork
}
4.使用Qt添加proxy_ios.h和proxy_ios.mm文件。
5.在main.cpp文件中调用如下:
#include "proxy_ios.h"
void setDefaultProxy(){
QString hostport = systemProxy();
qDebug() <<"had find proxy address:" << hostport; if(!hostport.isEmpty()){ QStringList ip_port = hostport.split(':'); if(ip_port.length() != 2){ return; } QString host = ip_port.at(0); QString port = ip_port.at(1); if(host.contains("null") || port.contains("null")){ return; } bool ok = false; int iport = port.toInt(&ok); if(!ok || iport <= 0){ return; } QNetworkProxy proxy; proxy.setType(QNetworkProxy::HttpProxy);//设置类型 proxy.setHostName(host);//设置代理服务器地址 proxy.setPort(iport);//设置端口 QNetworkProxy::setApplicationProxy(proxy); qDebug() <<"+++had set proxy address:" << hostport; } }

6.编译即可。

QML退出进程例子

abc
MessageDialog {
id:msgbox
standardButtons: StandardButton.Yes | StandardButton.No
modality: Qt.ApplicationModal
title: "message"
text:"try to close app?"
onYes:{
Qt.quit();
}
}

onClosing:{
console.log("try to close app.");
close.accepted = false;
msgbox.open();
}

Qt的编译宏

打开pro项目文件,其宏格式如下:

 

android标识代表,是应用android平台,因为qt是支持android和IOS的,android和IOS的配置差异就可以通过这来标识。

贴一个Android和IOS的宏:

QtAndroid调用java的例子

1.QtCreator创建QtExtra工程。

2.打开:项目->创建模板->确定。则可产生一个AndroidManifest.xml创建文件。


3.检查一下AndroidManifest.xml的所在目录。


4.参考Qt5.4.2\Examples\Qt-5.4\androidextras\notification的例子,将其子目录android-sources\src目录拷贝到你的工程里,如下:


5.修改src目录下NotificationClient.java文件,如下:

package
org.qtproject.example.notification;

import
android.content.Context;

 

public
class
NotificationClient
extends
org.qtproject.qt5.android.bindings.QtActivity

{


public
static
String
systemProxy()


{


String
hostdef=“”,
host=“”,
port=“”;


int
portdef=0;


try{


hostdef
=
android.net.Proxy.getDefaultHost();


portdef
=
android.net.Proxy.getDefaultPort();


host
=
System.getProperty(“http.proxyHost”);


port
=
System.getProperty(“http.proxyPort”);


}catch(Exception
e){

 


}


return
hostdef+“:”+portdef+“|”+host+“:”+port;


}

}

 

6.pro文件中添加androidextras库:

QT
+=
androidextras

7.main.cpp函数里,这样调用:

#include
<QtAndroidExtras/QAndroidJniObject>

#include
<QDebug>

QAndroidJniObject
stringArray
=
QAndroidJniObject::callStaticObjectMethod(“org/qtproject/example/notification/NotificationClient”,
“systemProxy”,“()Ljava/lang/String;”);

QString
my
=
stringArray.toString();

qDebug()
<<
“my:”
<<
my;

8编译测试:

 

 


 

Qt For Android的环境搭建

本教程是经过验证可单步调试的环境搭建过程,如果不要求单步调试功能,则相关依赖版本可随意。
在Window7中,亲测如下:
android-ndk32-r10-windows-x86_64.zip
android-ndk-r10-windows-x86_64-gdb.tar.xz
jdk-7u71-windows-x64.exe
android-sdk_r22.6.2-windows.zip
qt-opensource-windows-x86-android-5.5.0.exe,这个版本的qtwebview在退出时,会崩溃。
qt-opensource-windows-x86-android-5.4.0.exe,这个版本经测试,可以调用qtwebview组件,且退出时不崩溃。
qt-opensource-windows-x86-android-5.4.2.exe,这个版本经测试,可以调用qtwebview组件,且退出时不崩溃,在5.4中最高的版本了,也是以后项目使用的版本。
apache-ant-1.8.4-bin.zip
google_usb_driver,这个在android-sdk_422.6.2中如果不自带,则可从其它版本中拷贝过来(我是从低版本中拷贝过来的,其版本号是7),放置到android-sdk的extras目录。

在MacOSX10.10系统中亲测如下:
Yosemite 即OSX10.10版本
android-ndk32-r10-darwin-x86_64.tar.bz2
android-ndk-r10-darwin-x86_64-gdb.tar.bz2
jdk-7u71-macosx-x64.dmg
android-sdk_r22.6.2-macosx.zip
qt-opensource-mac-x64-android-ios-5.5.0.dmg,这个版本的qtwebview在退出时,会崩溃。
qt-opensource-mac-x64-android-ios-5.4.2.dmg,这个版本经测试,可以调用qtwebview组件,且退出时不崩溃。
apache-ant-1.8.4-bin.zip
xcode_6.1.dmg
注:在OSX系统是Android是需要依赖xcode的,在安装完xcode时,则也可以用Qt来开发IOS了。这点也验证了。
注:各个qt版本均带有各自的qtwebview组件,从qtwebview的仓库(http://code.qt.io/cgit/qt/qtwebview.git)。

1.下载NDK和GDB调试版本。
根据Qt的官方要求,在不同的系统,其GDB对应NDK的版本是不同的,现整理如下:
注:如果不使用官方GDB,则可能导致无法执行单步调试,该联系是从http://download.qt.io/official_releases/gdb/的官方网站整理如下:

或Window-32系统
android-ndk32-r10-windows-x86.zip,下载地址:http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86.zip
android-ndk-r10-windows-gdb.tar.xz ,下载地址:http://download.qt.io/official_releases/gdb/windows-7/android-ndk-r10-windows-gdb.tar.xz

或Window-64系统
android-ndk32-r10-windows-x86_64.zip,下载地址:http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86_64.zip
android-ndk-r10-windows-x86_64-gdb.tar.xz,http://download.qt.io/official_releases/gdb/windows-7/android-ndk-r10-windows-x86_64-gdb.tar.xz

或Linux-32系统
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2
http://download.qt.io/official_releases/gdb/linux-32/android-ndk-r10-linux-x86-gdb.tar.xz

或Linux-64系统
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86_64.tar.bz2
http://download.qt.io/official_releases/gdb/linux-64/android-ndk-r10-linux-x86_64-gdb.tar.xz

或MacOSX-64,一般情况只需要64位则可以,原因是MacOSX是64位和32位系统的混合体,系统在安装时会根据CPU的情况而自动选择运行32位还是64位。
http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86_64.tar.bz2
http://download.qt.io/official_releases/gdb/osx/android-ndk-r10-darwin-x86_64-gdb.tar.bz2

http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2
http://download.qt.io/official_releases/gdb/osx/android-ndk-r9d-darwin-x86_64-gdb.tar.bz2

http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86.tar.bz2
http://download.qt.io/official_releases/gdb/osx/android-ndk-r10-darwin-x86-gdb.tar.bz2

http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86.tar.bz2
http://download.qt.io/official_releases/gdb/osx/android-ndk-r9d-darwin-x86-gdb.tar.bz2

注:根据NDK的文档API介绍,所使用的API版本大于18,则才是全面支持的。如果在小于18系统上,则系统可能不支持部份API如openGL等
(android-ndk-r10/docs/Programmers_Guide/html/md_3__key__topics__libraries__s_t_a_b_l_e-_a_p_i_s.html)

2.Android-SDK-Tool下载与更新
SDKTools的官方格式为:android-sdk_r(x.y.z)-(system),x,y,z是版本号,system是系统环境,如下所示:
android-sdk_r22.6.2-macosx.zip
android-sdk_r23.0.2-macosx.zip
android-sdk_r22.6.2-windows.zip

在Qt5.5中,仅推荐使用android-sdk_r22.6.2-windows.zip和android-sdk_r22.6.2-macosx.zip两个版本,r21的版本,好像不支持了,更高的版本不推荐使用。
http://dl.google.com/android/android-sdk_r22.6.2-windows.zip
http://dl.google.com/android/android-sdk_r22.6.2-macosx.zip

以下图示为当前可单步调试的版本,请不要升级sdktools的版本,因为高版本的adb与gdb和gdbserver不兼容。
当前使用的版本

是否使用当前最新版本,就是对的呢?这答案在ADT集成环境即adt-bundle-windows-x86是正确的,但在Qt的环境中,就是可能不合适了。
这不合适是指:使用高版本的sdk是可以直接编译和部署应用的,但也许无法单步调试应用。这原因主要是以下造成的。
Qt的调试全过程,依赖的程序有哪些:
gcc:由ndk提供
androiddeployqt:由Qt5提供
gdb:由ndk提供。
gdbserver:由ndk提供
adb:由platform-tools提供,该工具是与sdktool的一起的。
ant:第三方提供。
而决定单步调试的上述程序有gcc/adb/gdbserver/gdb,而gcc/gdb/gdbserver都是由ndk提供,故兼容性是没有问题的。那不兼容的问题点主要集在adb。
为什么会造成不兼容呢?极可能是adb和gdbserver的通信协议造成的。虽然adb connect和adb -p 5037是完成了设备的连接,包括网络通信,但版本差异导致gdb的调试指令无法透传给gdbserver,最终导致无法启动手机的调试的应用程序,最终也就无法调试。

3.下载apache-ant,官网要求是大于1.8版本,本人实测版本为1.8.4和1.9.4均没有问题。
http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.4-bin.zip

4.下载Qt5.5或者Qt5.4了。
http://download.qt.io/official_releases/qt/5.5/5.5.0/qt-opensource-mac-x64-android-ios-5.5.0.dmg
http://download.qt.io/official_releases/qt/5.5/5.5.0/qt-opensource-windows-x86-android-5.5.0.exe
注:qt5.5版本在调用qtwebview组件时,在退出进程时会崩溃。
http://download.qt.io/official_releases/qt/5.4/5.4.0/qt-opensource-windows-x86-android-5.4.0.exe,调用qtwebview组件时,退出进程不会崩溃也无其它异常。
http://download.qt.io/official_releases/qt/5.4/5.4.2/qt-opensource-windows-x86-android-5.4.2.exe
http://download.qt.io/official_releases/qt/5.4/5.4.2/qt-opensource-mac-x64-android-ios-5.4.2.dmg

5.JDK的版本,本人使用的JDK7u71版本。
http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-macosx-x64.dmg
http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-windows-i586.exe 如果会导致虚拟机启动故障,安装x64的版本。
http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-windows-x64.exe

6.在Window中需要安装一个USB driver,该usbdirver是sdk-tool中自带的,如果没有自带,可以从其它版本如r23中提取出来放置extras的googles目录下即可。

————-
Error: Target id ‘android–1’ is not valid. Use ‘android.bat list targets’ to get the target ids.
该类出错,是没有每指定android版本,因此会出错。

若出现qt for android 无法调试,则确保检查是否使用的是sdk-tool-r26.2版本。

————————————–
目前经验证,发现无法调试问题,原因是adb的版本,与gdb及gdbserver版本不兼容导致。qt的调试是需要通过adb进行通信的。
——————————–
如果在调试时,提示”Waiting for debug socket connect”的问题,请检查是否存在进程AndroidServer的进程,像QQ或移动助手之类的工具,会自带这种工具。