android中怎样让手机测试的日志在logCat输出?
1,关闭模拟器;
2,重启开发工具(Eclipse);
3,设置手机上---开发--USB调试。
4,如果你手机上Sdcard为计算机管理,请设置为让手机加载。
5,如果开发工具(Eclipse),启动好了的话,把数据线重新插拔,便于重新识别。
6.最后一步,运行程序(注意:但不要再启动模拟器了),这样,就可以在(Eclipse)中的logCat,看到手机上运行程序的日志了。
详细用法
Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命令来查看和使用.
使用logcat命令
你可以用 logcat 命令来查看系统日志缓冲区的内容:
[adb] logcat [<option>] ... [<filter-spec>] ...
请查看Listing of logcat Command Options ,它对logcat命令有详细的描述 .
你也可以在你的电脑或运行在模拟器/设备上的远程adb shell端来使用logcat命令,也可以在你的电脑上查看日志输出。
$ adb logcat
你也这样使用:
# logcat
过滤pdf日志输出
每一个输出的Android日志信息都有一个标签和它的优先级.
日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就是查看系统的标签).
优先级有下列集中,是按照从低到高顺利排列的:
V — Verbose (lowest priority)
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (highest priority, on which nothing is ever printed)
在运行logcat的时候在前两列的信息中你就可以看到 logcat 的标签列表和优先级别,它是这样标出的:<priority>/<tag> .
下面是一个logcat输出的例子,它的优先级就似乎I,标签就是ActivityManage:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
为了让日志输出能体现管理的级别,你还可以用过滤器来控制日志输出,过滤器可以帮助你描述系统的标签等级.
过滤器语句按照下面的格式描tag:priority ... , tag 表示是标签,priority 是表示标签的报告的最低等级. 从上面的tag的中可以得到日志的优先级. 你可以在过滤器中多次写tag:priority .
这些说明都只到空白结束。下面有一个列子,例子表示支持所有的日志信息,除了那些标签为”ActivityManager”和优先级为”Info”以上的和标签为” MyApp”和优先级为” Debug”以上的。 小等级,优先权报告为tag.
adb logcat ActivityManager:I MyApp:D *:S
上面表达式的最后的元素 *:S ,,是设置所有的标签为”silent”,所有日志只显示有”View” and “MyApp”的,用 *:S 的另一个用处是 能够确保日志输出的时候是按照过滤器的说明限制的,也让过滤器也作为一项输出到日志中.
下面的过滤语句指显示优先级为warning或更高的日志信息:
adb logcat *:W
如果你电脑上运行logcat ,相比在远程adbshell端,你还可以为环境变量ANDROID_LOG_TAGS :输入一个参数来设置默认的过滤
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
需要注意的是ANDROID_LOG_TAGS 过滤器如果通过远程shell运行logcat 或用adb shell logcat 来运行模拟器/设备不能输出日志.
控制日志输出格式
日志信息包括了许多元数据域包括标签和优先级。可以修改日志的输出格式,所以可以显示出特定的元数据域。可以通过 -v 选项得到格式化输出日志的相关信息.
brief — Display priority/tag and PID of originating process (the default format).
process — Display PID only.
tag — Display the priority/tag only.
thread — Display process:thread and priority/tag only.
raw — Display the raw log message, with no other metadata fields.
time — Display the date, invocation time, priority/tag, and PID of the originating process.
long — Display all metadata fields and separate messages with a blank lines.
当启动了logcat ,你可以通过-v 选项来指定输出格式:
[adb] logcat [-v <format>]
下面是用 thread 来产生的日志格式:
adb logcat -v thread
需要注意的是你只能-v 选项来规定输出格式 option.
查看可用日志缓冲区
Android日志系统有循环缓冲区,并不是所有的日志系统都有默认循环缓冲区。为了得到日志信息,你需要通过-b 选项来启动logcat 。如果要使用循环缓冲区,你需要查看剩余的循环缓冲期:
radio — 查看缓冲区的相关的信息.
events — 查看和事件相关的的缓冲区.
main — 查看主要的日志缓冲区
-b 选项使用方法:
[adb] logcat [-b <buffer>]
下面的例子表示怎么查看日志缓冲区包含radio 和 telephony信息:
adb logcat -b radio
查看stdout 和stderr
在默认状态下,Android系统有stdout 和 stderr (System.out和System.err )输出到/dev/null ,在运行Dalvik VM的进程中,有一个系统可以备份日志文件。在这种情况下,系统会用stdout 和stderr 和优先级 I.来记录日志信息
通过这种方法指定输出的路径,停止运行的模拟器/设备,然后通过用setprop 命令远程输入日志
$ adb shell stop$ adb shell setprop log.redirect-stdio true$ adb shell start
系统直到你关闭模拟器/设备前设置会一直保留,可以通过添加/data/local.prop 可以使用模拟器/设备上的默认设置
Logcat命令列表
Option Description
-b <buffer> 加载一个可使用的日志缓冲区供查看,比如event 和radio . 默认值是main 。具体查看Viewing Alternative Log Buffers.
-c 清楚屏幕上的日志.
-d 输出日志到屏幕上.
-f <filename> 指定输出日志信息的<filename> ,默认是stdout .
-g 输出指定的日志缓冲区,输出后退出.
-n <count> 设置日志的最大数目<count> .,默认值是4,需要和 -r 选项一起使用。
-r <kbytes> 每<kbytes> 时输出日志,默认值为16,需要和-f 选项一起使用.
-s 设置默认的过滤级别为silent.
-v <format> 设置日志输入格式,默认的是brief 格式,要知道更多的支持的格式,参看Controlling Log Output Format .
Android SDK下, 如何在程序中输出日志 以及如何查看日志.
闲话少说,直接进入正题
在程序中输出日志, 使用 android.util.Log 类.
该类提供了若干静态方法
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
分别对应 Verbose, Debug, Info, Warning,Error.
tag是一个标识,可以是任意字符串,通常可以使用类名+方法名, 主要是用来在查看日志时提供一个筛选条件.
程序运行后 并不会在 ide的控制台内输出任何信息.
如果要后查看日志 请使用
adb logcat
关于adb的更多信息请查看官方网站.
当执行 adb logcat 后会以tail方式实时显示出所有的日志信息.
这时候我们通常需要对信息进行过滤,来显示我们需要的信息, 这时候我们指定的 tag就派上了用场.
adb logcat -s MyAndroid:I
这时将只显示tag为MyAndroid,级别为I或级别高于I(Warning,Error)的日志信息.
示例代码如下:
- package com.zijun;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.MotionEvent;
- import android.view.View;
- public class MyAndroid extends Activity {
- protected static final String ACTIVITY_TAG="MyAndroid";
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(new MyView(this));
- }
- public class MyView extends View {
- public MyView(Context c) {
- super(c);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- }
- @Override
- public boolean onMotionEvent(MotionEvent event) {
- Log.i(MyAndroid.ACTIVITY_TAG, "=============================");
- Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. ");
- Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. ");
- Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. ");
- return true;
- }
- }
- }
package com.zijun;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class MyAndroid extends Activity {
protected static final String ACTIVITY_TAG="MyAndroid";
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(new MyView(this));
}
public class MyView extends View {
public MyView(Context c) {
super(c);
}
@Override
protected void onDraw(Canvas canvas) {
}
@Override
public boolean onMotionEvent(MotionEvent event) {
Log.i(MyAndroid.ACTIVITY_TAG, "=============================");
Log.d(MyAndroid.ACTIVITY_TAG, "Haha , this is a DEBUG of MyAndroid. ");
Log.i(MyAndroid.ACTIVITY_TAG, "Haha , this is a INFO of MyAndroid. ");
Log.w(MyAndroid.ACTIVITY_TAG, "Haha , this is a WARNING of MyAndroid. ");
return true;
}
}
}
以上程序运行后, pdf在命令行执行 adb logcat -s MyAndroid:I
然后在手机模拟器的屏幕上 点击 拖动鼠标 就能看到相应的日志信息.
这是摘录androidin.com的一篇文章,对于学习Android的朋友来说,可以做工具来参考下。
(hanchao3c Android开发者论坛原创,转载请注明)
logcat是Android中一个命令行工具,可以用于得到程序的log信息。
logcat使用方法如下所示:
logcat [options] [filterspecs]
logcat的选项包括:
-s 设置过滤器,例如指定 '*:s'
-f <filename> 输出到文件,默认情况是标准输出。
-r [<kbytes>] Rotate log every kbytes. (16 if unspecified). Requires -f
-n <count> Sets max number of rotated logs to <count>, default 4
-v <format> 设置log的打印格式, <format> 是下面的一种:
brief process tag thread raw time threadtime long
-c 清除所有log并退出
-d 得到所有log并退出 (不阻塞)
-g 得到环形缓冲区的大小并退出
-b <buffer> 请求不同的环形缓冲区 ('main' (默认), 'radio', 'events')
-B 输出log到二进制中。
过滤器的格式是一个这样的串:
<tag>[:priority]
其中 <tag> 表示log的component, tag (或者使用 * 表示所有) , priority 如下所示:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent
事实上logcat的功能是由Android的类android.util.Log决定的,在程序中log的使用方法如下所示:
Log.v() -------------------- VERBOSE
Log.d() -------------------- DEBUG
Log.i() -------------------- INFO
Log.w() -------------------- WARN
Log.e() -------------------- ERROR
以上log的级别依次升高,DEBUG信息应当只存在于开发中,INFO, WARN,ERROR这三种log将出现在发布版本中。
对于JAVA类,可以声明一个字符串常量TAG,Logcat可以根据他来区分不同的log,例如在计算器(Calculator)的类中,定义如下所示:
public class Calculator extends Activity {
/* ...... */
private static final String LOG_TAG = "Calculator";
private static final boolean DEBUG = false;
private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
/* ...... */
由此,所有在Calculator中使用的log,均以"Calculator"为开头。
例如使用方法如下所示:
# logcat &
< 得到一个log片段 >
W/KeyCharacterMap( 130): No keyboard for id 0
W/KeyCharacterMap( 130): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
I/ActivityManager( 52): Displayed activity com.android.contacts/.DialtactsContactsEntryActivity: 983 ms
I/ARMAssembler( 52): generated scanline__00000077:03545404_00000A04_00000000 [ 29 ipp] (51 ins) at [0x25c978:0x25ca44] in 1764174 ns
I/ARMAssembler( 52): generated scanline__00000077:03515104_00000001_00000000 [ 46 ipp] (65 ins) at [0x25d1c8:0x25d2cc] in 776789 ns
D/dalvikvm( 130): GC freed 834 objects / 81760 bytes in 63ms
D/dalvikvm( 52): GC freed 10588 objects / 425776 bytes in 94ms
其中W/I/D表示log的级别pdf,“dalvikvm”“ARMAssembler”等是不同组件(component)的名称,后面括号里面的数字表示了发出log的进程号。
使用技巧:
1.使用logcat &在后台运行
2.使用-d得到所有log
3.使用-f或者重定向(>和>>)输出到文件
4.使用-s设置过滤器,得到想要的log。
当然,最重要的还是在程序中加入恰当的log.
首先还是下载smack,我下载的是smack_3_2_0.tar。这个包里有四个jar文件。
首先创建一个java工程。创建一个lib文件夹,把这四个jar包放到lib中,添加到编译路径中。
目录接口如下:
创建一个TestSmack.java类。具体代码如下:
java代码:
- package eoe.demo;
- import org.jivesoftware.smack.ConnectionConfiguration;
- import org.jivesoftware.smack.PacketListener;
- import org.jivesoftware.smack.XMPPConnection;
- import org.jivesoftware.smack.XMPPException;
- import org.jivesoftware.smack.filter.PacketFilter;
- import org.jivesoftware.smack.packet.IQ;
- import org.jivesoftware.smack.packet.Packet;
- public class TestSmack {
- public static void main(String[] args) throws XMPPException {
- ConnectionConfiguration config = new ConnectionConfiguration("127.0.0.1", 5222);
- XMPPConnection connection = new XMPPConnection(config);
- XMPPConnection.DEBUG_ENABLED = true;
- connection.connect();
- connection.login("admin", "admin");
- // ChatManager chatManager = connection.getChatManager();
- // chatManager.addChatListener(new ChatManagerListener(){
- // @Override
- // public void chatCreated(Chat chat, boolean arg1) {
- // chat.addMessageListener(new MessageListener(){
- // @Override
- // public void processMessage(Chat arg0, Message arg1) {
- // System.out.println(arg1.getBody());
- // }
- // });
- //
- // }
- // });
- connection.addPacketListener(new PacketListener(){
- @Override
- public void processPacket(Packet arg0) {
- System.out.println(arg0);
- }
- }, new PacketFilter(){
- @Override
- public boolean accept(Packet arg0) {
- return true;
- }
- });
- IQ iq = new IQ(){
- @Override
- public String getChildElementXML() {
- StringBuilder buf = new StringBuilder();
- buf.append("");
- return buf.toString();
- }
- };
- connection.sendPacket(iq);
- // Chat chat = chatManager.createChat("yangzc", new MessageListener(){
- // @Override
- // public void processMessage(Chat arg0, Message arg1) {
- // System.out.println(arg1.getBody());
- // }
- // });
- // chat.sendMessage("hello World!!!");
- // BufferedReader cmdIn = new BufferedReader(new InputStreamReader(System.in));
- // for(;;) {
- // try {
- // String cmd = cmdIn.readLine();
- // if("!q".equalsIgnoreCase(cmd)) {
- // break;
- // }
- // chat.sendMessage(cmd);
- // }catch(Exception ex) {
- // }
- // }
- connection.disconnect();
- System.exit(0);
- }
- }
总结:
这里比较关键的一句话时是pdf:buf.append("");这句话指定了这个消息是发动到那个命名空间中。
只有发送到openfire插件对应的命名空间中openfire插件才可以正确接收。
至此openfire插件和smack的通信实现算是告一段落。剩下的工作就是xml了,不用说了吧,很简单的。
1. 除去JavaScript注释
除了注释,其他所有的 // or /* */ 注释都可以安全删除,因为它们对于最终使用者来说没有任何意义。
2. 除去JavaScript中的空白区域
如:x = x + 1; 可以简短得写成:x=x+1; 。
3. 进行代码优化
简单的方法如除去暗示的(implied)分号,某些情形下的变量声明或者空回车语句都可以进一步减少脚本代码。一些简略的表达方式也会产生很好的优化,例如:
x=x+1;
可以写成:
x++;
不过得小心谨慎,不然代码很容易出错。
4. 重命名用户自定义的变量和函数
为了阅读方便,我们都知道在脚本中应该使用象sumTotal这样的变量而不是s。不过,考虑到下载的速度,sumTotal这个变量就显得冗长了。这个长度对于最终使用者来说没有意义,但对浏览器下载则是个负担。这个时候s就成为较好的选择了。先写好方便阅读的代码,然后再使用一些工具来处理以供交付。这种处理方式在这里再一次展示了其价值所在。将所有的名称都重新用一个或两个字母来命名将带来显著的改善。
5. 改写内建(built-in)对象
长长用户变量名会造成JavaScript代码过长,除此之外,内建(built-in)对象(比如Window、Document、Navigator等)也是原因之一。例如:
alert(window.navigator.appName);
alert(window.navigator.appVersion);
alert(window.navigator.userAgent);
可以改写成如下简短的代码:
w=window;n=w.navigator;a=alert;
a(n.appName);
a(n.appVersion);
a(n.userAgent);
如果这几个对象使用频繁的话,这样改写带来的好处就不言而喻了。事实上这些对象也的确经常被调用。然而我要提醒的是,如果Window或 Navigator对象仅仅被使用了一次的话,这样的替换反而使代码变得更长。这个技巧带来一个对象更名后脚本执行效率的问题:除了代码长短上带来的好处,这种改写更名实际上还会稍微的提高一点脚本执行的速度,因为这些对象将会被放在所有被调用对象中比较靠前的位置。JavaScript游戏开发程序员使用这个技巧已经有多年了,下载和执行速度都会有所提高,并且对本地浏览器的内存花销也会降低,可谓一石三鸟。
6. 重构<script>和<style> 调用方式来优化请求次数
我们常常在一个HTML文件头中看到这样标记代码:
<script src="/scripts/rollovers.js"></script>
<script src="/scripts/validation.js"></script>
<script src="/scripts/tracking.js"></script>
大多数情况下,上述代码应该被简化成:
<script src="/0/g.js"></script>
其中pdfg.js包含了所有供全局使用的函数。虽然把脚本文件分成三份对于维护来说是有道理的,但对于代码的传输则没有意义。单个的脚本下载要比三个分离的请求高效的多,并且这也同时简化了markup代码的长度。
7. 合并你的javascript文件
尽可能的减少HTTP的Request请求数。
8. 将脚本放到网页底部
脚本一般是用来于用户交互的。所以如果页面还没有出来,用户连页面都不知道什么样子,那谈交互简直就是扯谈。所以,脚本和CSS正好相反,脚本应该放在页面的底部。
在使用ExtJs过程中,性能一直是一个比较头疼的问题,从用户的角度来看,就一个字:慢。从技术的角度来说,这个“慢”字可以分为两种,加载“慢”和渲染“慢”。想分辨这两种情况很容易:如果居于网不慢而互联网上慢,说明是加载慢;如果Chrome不慢而IE慢,就是渲染慢。还有另一种情况:越用越慢,这个“慢”通常是内存泄露造成的。
针对以下这三种情况讨论一下解决方案:
1,加载慢
1.1 减少要加载的东西
不要动不动就ext-all.js,extjs是可以定制的,如果你用不到tree,就不要包含这个组件了。ExtJs的官网上有详细的定制方法和工具。
1.2 给出合适的用户提示
把Js后置,然后前面做一个加载的提示。如果像Gmail那样给出进度条,或者像很多网游那样来点图片或者Tips啥的就更好了,说不定用户还会觉得怎么加载这么快,我还没看清楚呢,呵呵。
1.3 用的时候再加载
动态加载,参考使用ExtJs开发MIS系统(2):Js的动态加载。
1.4 只加载一次
别用iframe了,如果你的静态内容过期做的不好,浏览器会经常再不厌其烦的从服务器下载同样的东西。
1.5 对你的Js添加过期标记
ext-base.js、ext-all.js都可以设置很长的过期时间,甚至永不过期(如果你不换extjs的版本)。这点对所有静态内容都很有用,如何设置过期标记请垂询Google。
2,渲染慢
2.1 pdf少加载少解析、晚加载晚解析
1.1,1.3,1.4都对改善渲染慢的情况有效——加载的少了自然渲染的快了。
2.2 别用iframe
iframe不仅仅可能会使浏览器加载两遍,还一定会使浏览器解析两遍,放弃它吧,真的。
2.3 精心设计你的Js代码
例如缓存getElementByID()的结果、编译查询表达式之类的东西,这个纯看Js功力。
2.4 可能的话,让用户换个浏览器吧
Chrome比IE的Js渲染快是数量级上的差异!构造一个40列,50行的复杂GridPanel试试,你就会深有体会了……对于企业内部的MIS系统,换浏览器还是具有可能性的。
3,内存泄露
Ext性能调优方案
1. 将JS进行合并压缩。
使用yahoo的yui-compress.jar进行压缩JS,去掉过多的空格和注释,并合并,减少IO的支出。
2. 将前后台传输的数据进行GZIP压缩。
大数据量的数据传输,通过GZIP的压缩方案,可以减少到25%,有些数据可能会更多。
3. 对大量的JS分析依赖关系,进行动态加载。
这个是关键,通过分析所有的JS中的依赖关系,减少了JS加载的数量。从很大程度上提高了性能。
4. 另外对部分页面进行缓存,而非真正的关闭。
还有一个外部的因素,由于系统使用的客户机环境上的复杂,我们在多个浏览器上进行了测试,只有IE是最慢的,尤其是IE6,后来发现不是IE6要比IE7慢,是因为发现MS发布了脚本引擎cscript 5.7, 而大部分的ie6系统都装的是5.6, 这个版本上的升级,不仅仅是修改了BUG,在JS的执行速度上也有了较大的提升,于是我们在环境因素上又加上了一条,要求客户安装cscript5.7,也大大的提升了页面的打开时间。
减小代码在传输中的大小,就能提高页面的传输速度,打开网页也就快了。在一起PHP程序中 像WordPress是默认的gzip压缩功能是通过ob_gzhandler这个函数来实现的,ob_gzhandler是php 4.0.4新增的一个输出缓存函数,并通过gzip压缩后发送到客户端。这个函数需要zlib库支持,一般的虚拟主机都安装有这个库,所以很多blog都使用这个方法来实现对php页面的压缩。
那么对于我们这些没有开启mod_deflate模块的主机来说,就只能采用ob_gzhandler函数来压缩了,它的压缩效果和mod_deflate相比,相差很小,几乎可以忽略(但它只能对php文件进行压缩),下一篇文章将附上我对这几种方式的一个对比测试。
使用ob_gzhandler函数有3种方法让它对php进行压缩:
1、在php.ini中设置output_handler = ob_gzhandler
2、在.htaccess中加入php_value output_handler ob_gzhandler
3、在php文件头加上ob_start('ob_gzhandler');
第一种我们是没法办到,第二种方法不错,可以一劳永逸,一、二种方法效果都一样,就是对所有php后缀文件进行压缩。我这里主要介绍一下第三种方法,
就是试用CSS压缩法 例如对模板下的style.css进行压缩
1、把模板目录下的style.css复制一份出来,命名为style.css.php
接着在pdfstyle.css.php顶部加入这句:
< ?php if(extension_loaded('zlib')) {ob_start('ob_gzhandler');} header("Content-type: text/css"); ?>
在最后加上
< ?php if(extension_loaded('zlib')) {ob_end_flush();} ?>
(复制的时候去掉?php前的空格)
2、按照下面的方式修改header.php中的css连接
原来的:
<link rel="stylesheet" type="text/css" media="screen" href="/style.css"/>
修改后的:
<link rel="stylesheet" type="text/css" media="screen" href="/style.css.php"/>
搞定,现在你的CSS就可以被gzip压缩了。
JS也可以使用同样的方法,只是在xx.js.php头部加入的应该是这样:
< ?php if ( extension_loaded('zlib') ) {ob_start('ob_gzhandler');} header("Content-Type: text/javascript"); ?>
(复制的时候去掉?php前的空格)
仔细看看K2主题的中的JS,就是修改后缀为php后在顶部加入了ob_gzhandler函数。
所以我们可以用能压缩CSS 和JS的工具来对代码压缩 提高浏览速度~~~
Mashery于2011年7月25日发布了其I/O文档工具,这也是对Mashery API管理SaaS平台提供的新增支持。I/O文档旨在为开发人员提供一个接口,通过该接口可以直接在API文档中执行实时API调用,从而实现加速应用。
针对该工具及其特点,InfoQ对Mashery产品管理主管Neil Mansilla进行了采访。
InfoQ:什么是I/O文档?该项目的动因又是什么呢?
Mashery I/O文档是一种交互式的文档,可以帮助开发人员更加快速有效地理解和学习API。我们可以直接从API文档执行实时的API调用,相较干巴巴的静态示例这种方式可以提供实时的载荷数据。I/O文档能够帮助我们的客户和API提供者,这样发布的文档外观清晰、简洁,且在内容资源、方式方法和参数层面又能够做到细致入微。
在我们此前的调研中,我们了解到API文档通常缺乏方法上的专用性和API调用样例。使用Mashery I/O文档,对方法的分析,可深入到参数层次,从而为开发人员良好地定义并清晰地展现出来。至于API调用样例,I/O文档就是个实时样例生成器——通过实时API调用,开发人员能够创建自己直接可运行的样例。我们推出I/O文档的动因就是希望能够帮助我们客户的平台和开发人员取得成功。
下面列举了该工具其他一些对API提供者带来的好处:
- 清晰的API文档,测试、调试以及开发都集中在一起
- 缩短开发人员首次API调用时间
- 更快的应用开发
- 减少技术支持
- 具备一个强大的沟通渠道可供内部技术支持和芯、QA以及技术写手来实现与API变更的交流
- 确保API文档反应当前的API版本
- 清晰、优美的API文档设计
InfoQ: 该工具是否同样适用于公共API和企业内部API呢?是否支持非REST(non-RESTful)APIs?
Mashery I/O文档对私有企业API和公共API都适用。Mashery I/O文档目前支持RESTful APIs。很快I/O文档将实现对SOAP的支持。Mashery I/O 文档是可扩展的,并且能够适用于支持非标准的协议。
InfoQ:能否请您描述一下有关将一个传统API文档,比如Java文档,迁移到I/O文档的相关技术细节?
Mashery I/O文档使用一种JSON schema来描述API资源、方法和参数。该schema可被扩展来处理各种API的各种独到特征。创建一个面向I/O文档的JSON配置是最直截了当的方法。
InfoQ:还有什么有关IO文档未来发展蓝图是您觉得可以与社区分享的吗?
我们的I/O文档发展蓝图包括:提供补充加密方法的支持、支持SOAP、能够实现随地部署(甚至在Mashery环境堆栈以外)。
一些早期的I/O文档实现已经可以公开获得了,其中包括从Klout、Alibris以及Fanfeeder获取API文档。

