Google做Android SDK这帮人可真够烦的

文件结构和ant脚本库天天改个没完。之前整理好的build.xml又不认了,必须要 “android update project –path .”一下,然后告诉我不能合并修改,faint。

想想现在ProGuard集成的很好了,就把之前直接写在build.xml里的任务趁机移出来了,然后死活都有错,一看:

[proguard] Reading program jar [bin/proguard/original.jar]
[proguard] Reading program jar [libs/AdWhirlSDK_Android.jar]
[proguard] Reading program jar [libs/GoogleAdView.jar]
[proguard] Reading program jar [libs/admob-sdk-android.jar]

 

倒,后三个是第三方的库嘛,各种can’t find referenced。加了-libraryjars也不认,仔细一看:

~android-sdk/tools/ant/build.xml

-injars       ${project.jars}

<path id=”project.jars.ref”>
<pathelement location=”${preobfuscate.jar.file}” />
<path refid=”jar.libs.ref” />
</path>

 

丫就不能不自做聪明?<!– path refid=”jar.libs.ref” / –>,自己加-libraryjars就爽了,不过改SDK系统文件,很不方便切换机器以及团队合作唉。

 

注:光改这一出不够,否则后面dex阶段不会把libs/*.jar打包进去。

-release-obfuscation-check 会定义 <path id=”out.dex.jar.input.ref” />

而 dex-helper 则有这么一段

<if>
<condition>
<isreference refid=”out.dex.jar.input.ref” />
</condition>
<else>
<path id=”out.dex.jar.input.ref”>
<path refid=”jar.libs.ref” />
</path>
</else>
</if>

得把这个if也干掉。

 

从好的方面想,这样可以让库文件自动享受ProGuard的功能,不过我还是喜欢能够自己选择。

 

省事一点的办法,还是改proguard.cfg,不过suppress warning好有罪恶感呀。

#  ProGuard in Android SDK includes these jars as program jars.
-dontwarn com.adwhirl.**
-dontnote com.adwhirl.**

-keep class com.adwhirl.** { *;}
-keep public class com.adwhirl.adapters.AdMobAdapter {*;}
-keep public class com.adwhirl.adapters.ZestAdzAdapter {*;}
-keep public class com.adwhirl.adapters.MillennialAdapter {*;}
-keep public class com.admob.android.ads.** {*;}
-keep public class com.millennialmedia.android.** {*;}
-keep public class com.zestadz.android.** {*;}

#ProGuard library jars trick over

沟通人与机器

临睡前看到“Android之父抨击Siri:和人沟通而非机器 http://mobile.csdn.net/a/20111021/306190.html”,又来了感觉。查了下,9to5mac.com/2011/10/19/andy-rubin-talks-apple-after-steve-jobs-siri-and-the-competition/  这里有详细背景,他是在AllThingsD Asia上说到这个的,有录相 http://allthingsd.com/20111019/andy-rubin-video-highlights-from-asiad-video/ 。

 

原话:

“To some degree it is natural for you to talk to your phone,” Rubin said, but historically that has meant talking to another person. As for talking to your phone without actually trying to connect to another person, Rubin says he’s not so sure. “We’ll see how pervasive it gets.”

 

从某个角度看,他说得一点也不错,我们拿着手机本意是要与人交流,大部分人也更喜欢用自然语言跟人交流。我也越来越喜欢打电话跟人聊。不过,在聊之前,先得建立一个连接,这样就得输入手机号或者到通讯录里查。不知道有多少人能靠瞬间记忆把11位的手机号记住,反正我一般在纸条和手机屏之间来回移动视线3回,时不时还会敲错。唉,要是有个人在旁边帮忙,只要对他说,把13981726354加到通讯录时并拨通电话就好了。这才叫与人交流嘛,不知道Rubin先生是不是配有秘书?

另外,交流的载体现在可不只有语音了,还可以是文本消息、图片、视频或者更复杂的。相应的操作也复杂起来。比如教会Nemo爷爷收email之后,我时不时就会想把小Nemo画的画、搭的积木啥的发给他欣赏,这需要1先调出相机应用,2拍照,3切换到相册,4点击分享,5点击email,6输入email收件人(点地址栏,可能需要切换软键盘,输入头几个字母回车,选择自动提示的完整地址),7写标题,8点发送,9选择文件大小(iPhone)。要是有个人在旁边随时侍候着,只要说一声拍照并发给老爷子,那该多好呀,这才叫跟人交流呢。

而智能手机并不只是通信工具,还是随身信息终端。不过即使以iPhone用户体验之佳,在日历上加个有提醒的事项之烦琐,也经常让我放弃用它。说到这个,联想的乐助理真是个不错的点子,非常爽。在没有乐助理之前,很多老板都是靠秘书帮忙搞定的吧。不过Rubin先生应该能自己搞定的。

窃以为Siri玩家对着手机说话,并不是Rubin意义上的交流,而是一种操作界面。虽然,现在众多玩家和媒体竞相以逗Siri为乐,大家都明白只是玩笑吧,就像许多司机都有遛GPS的恶趣味。

Rubin说手机不应该成为人们的助理,当然了,这个小玩艺还远远不如职业秘书好用,不过不是每个人都请得起秘书的!智能手机应该也必然成为人们的助手,或许Rubin先生应该认真读一下Steve Jobs 1985年说过一段话:

We’re living in the wake of the petrochemical revolution of 100 years ago. The petrochemical revolution gave us free energy—free mechanical energy, in this case. It changed the texture of society in most ways. This revolution, theinformation revolution, is a revolution of free energy as well, but of another kind: free intellectual energy. It’s very crude today, yet our Macintosh computer takes less power than a 100-watt light bulb to run and it can save you hours a day. What will it be able to do ten or 20 years from now, or 50 years from now? This revolution will dwarf the petrochemical revolution. We’re on the forefront.  - Steve Jobs Interview – 1985 Playboy Magazine

Thanks, Steve Jobs!

 

我用过的第一台电脑是Apple II,也有可能是Apple I,实在搞不清楚了。那是高一,不知什么原因,我们年级居然开了Basic普及课程,整个课程只有一次上机的机会。不过那个课上完,我们绝大多数,如果不是全部,什么也没学会,然后生活在高考的阴影下继续。虽然有这么点接触,我对计算机的真正了解却是是上大学之后,正赶上电脑普及的热潮,从IBM PC XT+286、MS DOS、PC TOOLS、WPS、五笔字型开始的,虽然Machintosh和Power Mac也偶尔见到,不过更象一个传说,整个真实世界都属于Dos/Wintel。

对于Apple世界的感情,直到2005年WWDC之后,Developer Transition Kits 里的Mac OS X Tiger 10.4.1 Developer preview泄漏,黑苹果成为可能之后才一点一滴建立起来。其实之前ppc模拟器就可以在x86机器上把OS X PPC跑得很好了,只是性能实在太差,折腾过很短一段之后就放弃了。那个时候我跟Holly一起做为离岸团队为华尔街的一间证券公司开发证券交易策略平台,我整理脚本语言并制作编译器,Holly定义字节码并实现虚拟机,承蒙老板William关照,在啃完几本主要的编译器书之余还有足够的时间关注和尝试新鲜玩艺。

初步使用之后,我决定把家里的PC换上OS X Tiger,运气还不错,除了那块Via Rhine芯片的网卡其它东西都能正常驱动,正好社区里有人号称正在做这个驱动,于是我整了一块RTL8139先用着。不过那台PC挂的硬件比较多,已经接近电源的上限,所以总觉得多插个网卡不爽,还是掂记着那个驱动。这个担心并非多余,后来那台机器因为供电不足,损坏了一块显卡,最后主板也烧了。话说约半年后,项目终止团队解散,我在家休息了几个月,看那帮老外半年也不出东西,闲着也是闲着,还是自己写一个得了。这是我的第一个Mac OS X程序,也是做为一个程序员被Apple震撼的开始。由于发给Via要datasheet的email石沉大海,我只能从Linux driver源码里分析资料,为此花了差不多一个月从PCI到Linux网络子系统整个看了一遍,然后开始着手写I/O Kit驱动。然后我发现,要理解I/O Kit实在太容易了!写这个驱动,只要实现一个IOEthernetController子类就行,整个底层原语libkern已经封装好了,数据队列现成的,一行搞定:

IOGatedOutputQueue::withTarget( this, getWorkLoop() );

(当然这个最简单的队列性能并不好,也有足够的基础类可以实现不同性能的数据收发,不过都要多处理不少细节)

原来写驱动也可以面向对象呀!原来底层结构也可以这么优美!在折腾过WDM、又刚跟Linux死磕了一阵子之后,那感觉大约只有翻身农奴把歌唱能形容了。好吧,OS X不仅是unix+优美的图形界面,更是一个充满思考、精心设计、优雅到骨子里的编程平台。

不过,Mac OS X平台开发的工作机会似乎不存在,后来还是找了个Java开发的工作上班去了。不过,没过太久,iPhone横空出世。之前的智能手机世界属于Symbian和Windows Mobile,当时WM上升势头很好,我确信它会象IE干掉Netscape一样成功,花了不少时间来学习,先后买了Dell的X5和X51v来玩,写了一些东西放在play3d.net (顺便要跟play3d的读者说声抱歉,后来搞不定域名备案网站停掉了,域名到期后也就没有续费,当初那些文件还在 http://www.pinxue.net/play3d/ 不过没来得及写的那些估计永远不会再写了)。当iPhone 1.02软解方案出来以后,在Holly同学的煽动下,找人从美国带回来两台iPhone (Thanks Karl Chen!)。这个手机从外观到功能,无一不酷。然后,我在办公室就当起了iPhone的义务推销员,见人就说:这才是我想要的智能手机,这才是我想要的手机上网,比我想的还要好、还要舒服。不久头头去美国出差回来,行礼是帮大家带的8个iPhone。

iPhone改变了我对手机的看法和用法,以前用Nokia时基本就只打电话,连短信都极少发,第一部没有中文输入法,第二部那个T9也实在消受不来,而在iPhone上可以用最习惯的五笔;更别说上网了,偶尔用它的浏览器去gmail看个邮件,恨不得能花10分钟。用PDA的时候也主要是看书和记事,因为那个电池表现实在是不堪。但是自从用了iPhone,我就喜欢上发短信了,在路上也有gtalk的感觉了,也习惯于用手机随时查东西了,因为不需要再忍受跟别人嚼过的甘蔗差不多的wap或完全乱套的互联网页面了。以前也很少拍照片,因为用的手机都没这功能,有这功能的智能手机印象里比一台电脑还贵,用iPhone以后极其喜欢随手拍,不久就把数码相机送给家里人玩了。近来有了iPhone4以后,连配件一起花了7K的DV也闲置了。

iPhone 1代对我来说是完美的,在用了一年G1和数月EVO之后,又拿到iPhone 1代来用,仍旧有一种舒服到感动的感觉。当然它也是有缺陷的,有一些还好克服,比如通信录不能按汉字拼音排序,电话号码显示的格式不适应国内的号码等;有一些就很难办,比如不支持彩信,不过我至今仍极少用彩信,戴着运营商的镣铐跳舞总是别扭,发email或直接上传到网上才符合互联网的习性。最要命的是没有中文输入法,很快也就有第三方的短信程序自带中文输入法了,不过别的应用还是没法输入;也有人搞定了替换系统日文词库来当中文输入法用,只是第一个字总是日文,着实碍眼。好在社区已经整理出toolchain,在Holly精湛技艺之下,不到一个月,我们就有能用的单字拼音输入法了,而且速度飞快。因为总在港汇二楼台阶上的Costa碰头,我们给这个输入法取名为iCosta。不过我习惯用五笔,于是不久我们加上了五笔支持。别小看了这个五笔输入支持,它彻底释放了我在手机上的表达能力,也改变了我不在手机上聊天的习惯。

简单点说,iPhone改变了我对智能手机和移动互联网的认识,并如此迅速的让我依赖上了移动互联网。但是它改变我的,并不仅于此。在折腾iCosta的时候,我开始学习ARM汇编,ARMEABI函数调用的效率令人惊叹;开始学习Objective-C,它在完全兼容C的前提下提供了令人惊叹的面象对象能力,并对两者的混用几乎没有任何人为限制,而面象对象语法的设计也充满了智慧,分明在无声的说,这门语言是为人设计的,不是为了机器或者形式语义设计的;分明在强调,程序是由人写的,也是给人看的。更令人震惊的是Objective-C生成的汇编代码极易看懂,完全不象X86平台上一般程序那样难搞,虽然系统很多部分并无源码,但对于想要理解iPhone OS内部机制的人来说,一切就平铺直叙的写在眼前,即使是C编译生成的代码也要好读得多。这可太舒服了!

后来,iPhone SDK终于出了。我的iPhone终于摔坏了,我决定追逐一下有硬键盘的G1的浪潮。对于少许Android玩家来说,因此而很快拥有了可用的五笔输入法,而对我来说,由此而领会了什么叫做可用性,什么叫做用户体验。这不是说Android不好,Android有非常好的地方,比如它提供IMF并且可以通过Android Market发行IME,你几乎可以修改系统任何一个方面,只要你愿意努力。这可能是整个iOS平台永远也无法满足的需求,我猜想Jobs和苹果公司认为:想做这些事情的话请加入苹果。

用惯iPhone之后,时不时会拿手指点电脑屏幕,然后才想起来不支持触摸。于是开始盼望触屏版的MacBook,不过至今还没有盼到.苹果推出的是iPad,而且便宜的出乎意料。很快我的iPad就被小Nemo独霸了,好在后来又第一时间买了iPad2,不过装上PPTV/PPS/奇艺等可以看电视剧的app之后,有被Nemo妈抢走的危险了。如果不写代码,我已经习惯用iPad替代电脑。

其间黑苹果也升到Leopard了。再后来,终于受不了折腾黑苹果费的时间了,买了MacBook Pro。(Thanks Mrs. and Mr. Wang for internal discount) 每天在这样一个平台下工作,我的心态也在一点点的变化,开始变得挑剔,从界面、交互方式到代码的观感,越来越不愿忍受,也越来越不想写需要忍受的代码。

一段时间之后,对于Think Different似乎有那么点感觉了,思考产品也慢慢不自觉的朝着除了解决实际问题还要用很酷的方式去改变转了。这很有效,时不时会发现一些挺有意思的方向,只可惜想法太多时间太少,能付诸实施的还很少很少。我现在有幸跟一个非常强悍的团队一起工作,大家都怀抱着用技术改变世界的梦想,梦想很大,团队还很小,还需要很多很多志道合的伙伴。

Thanks Steve Jobs! 感谢你创建了苹果,塑造了这么富有个性和创造力的团队!感谢你们创造的这些堪称艺术品的产品!我享受这些产品,眼界由此而提高,在这个过程中感受到你们对信念的真诚与执着,在创新与尊重用户给自己设立的高标准。我相信技术可以改变世界,而你们让我坚信我也可以用技术改变一些什么。

 

*听到Steve Jobs逝去的消息以来,心里一直有很复杂的感情在起伏。我并不真实了解这个人,也没有见过他,却深受他的影响和鼓舞,既惋惜业界失去了及富远见与激情的天才,又担心苹果由此而放缓了创新的步伐进而整个产业的发展都放缓,同时也觉得业内暂时再也没有能代言理想、创新、激情、完美的标识性人物,似乎是一个时代的终结。想想还有Google收购Motolora手机、HP CEO要砍webOS随即换帅等大事件集中在如此短的时间段里,不禁感慨错过了.com大潮还能有幸赶上这么一个大时代。是有此文。

帮Holly Bull晒一晒汇编

这是大牛某天折腾黑苹果时不爽,花了半天工夫自己炮制的,主要时间都花在挑选指令上了,字节数太多的指令不能用,也不能写太多指令。能看出来是啥吗?

;
; For extended disk access: 1int 13h ah = 42h
;
struc extended_disk_access_block

sizeof_block: resb 1
reserved: resb 1
number_of_sectors: resw 1
buffer_offset: resw 1
buffer_seg: resw 1
start_sector_number: resq 1

endstruc ; extended_disk_access_block

;
; Partition table entry format
;

struc partition_table_entry

boot_flag: resb 1
begin_cylin: resb 1
begin_head: resb 1
begin_sector: resb 1
partition_type: resb 1
end_cylin: resb 1
end_head: resb 1
end_sector: resb 1
lba_offset: resd 1
lba_number_of_sectors: resd 1

endstruc ; partition_table_entry

bits 16

org 7c00h

section .text

start_point:

; Move self to high memory; set ss:sp to 9000:7000

xor ax, ax
mov ds, ax

mov ax, 9000h
mov es, ax
mov ss, ax
mov sp, 7000h

mov di, start_point
mov si, start_point
mov cx, 200h
rep movsb

push es
pop ds

push es
mov ax, real_start
push ax
retf

real_start:

; Prompt for boot

prompt_for_boot:

lea si, [input_prompt]
call display_string

wait_for_select:

mov ah, 0
int 16h

mov [crlf], al
lea si, [crlf]
call display_string

;
; verify_select: 0 – 3 in AL, then save to [crlf]
;

mov al, [crlf]

sub al, ‘0’

cmp al, 0
jb prompt_for_boot

cmp al, 3
ja prompt_for_boot

mov [crlf], al

;
; Check partition table for select
;

mov al, 0
mov bx, 7dbeh

check_bootable:
cmp al, [crlf]
jnz set_not_boot

mov byte [bx], 80h
jmp next_partition_entry

set_not_boot:
mov byte [bx], 0

next_partition_entry:

add bx, partition_table_entry_size
inc al

cmp al, 4
jz write_mbr_back
jmp check_bootable

write_mbr_back:

mov ax, 0301h
mov bx, 7c00h
mov cx, 0001h
mov dx, 0080h
int 13h

jnc calculate_partition_sector_offset
jmp write_mbr_error

calculate_partition_sector_offset:

;
; use ax as an index to calculate the absolute sector offset
;

mov al, [crlf]

cbw

mov bx, 7dbeh ; partition table

mov word [block+number_of_sectors], 1
mov word [block+buffer_offset], 7c00h
mov word [block+buffer_seg], 0
mov dword [block+start_sector_number+4], 0

mov cx, partition_table_entry_size
mul cx
add bx, ax
mov ecx, dword [bx+lba_offset] ; bx + sizeof(partition_table_entry) * ax + lba_offset

mov [block+start_sector_number], ecx

;
; Read partition boot sector
;
mov ah, 42h
mov dl, 80h
lea si, [block]
int 13h
jc read_boot_sector_error

; Note I must keep [ds:si] to current partition entry, which is requireed by mac os x booter,
; while ds should be 0000

; clear everything and jump to boot sector

push 0
push 7c00h

; es -> 0000

xor ax, ax
mov es, ax

; move partition table from 9000:7dbe to 0000:7000

cld
mov si, 7dbeh
mov di, 7000h
mov cx, 4 * partition_table_entry_size
rep movsb

; si -> 7000
mov si, 7000h

mov al, [crlf]
cbw
mov cx, partition_table_entry_size
mul cx

add si, ax ; si -> current partition table entry

; ds -> 0000

push es
pop ds

; dl = 80H
mov dl, 80h

retf

write_mbr_error:
lea si, [write_mbr_error_msg]
jmp display_then_halt

read_boot_sector_error:
lea si, [read_boot_sector_error_msg]
jmp display_then_halt

display_then_halt:
call display_string

halt:
hlt
jmp halt

;
; Subroutine: display_string
;
; Entry: ds:si -> c string
;

display_string:

display_str_char:

lodsb
cmp al, 0
jz display_string_ret
call display_char

jmp display_str_char

display_string_ret:
retn

;
; Subroutine: Display char in AL
;
display_char:
mov bx, 1
mov ah, 0eh
int 10h
retn

; ————————————————————————-
; Data area
; ————————————————————————-

crlf db 20h, 0ah, 0dh, 0 ; A digit char, plus crlf

input_prompt db ‘Select boot partition(0-3):’, 0

; A block to contain extended_disk_access_block

block:
istruc extended_disk_access_block
at sizeof_block, db 10h
at reserved, db 0
iend

read_boot_sector_error_msg db ‘Read boot sector error’, 0
write_mbr_error_msg db ‘Write MBR failed’, 0

times 200h-2-$+start_point db 0

db 55h, 0aah

两条新闻的分析

1. Google 收购 Moto Mobility

 

尽管 Larry Page 口口声声说 Moto 仍然独立运作, 这话也就只能一听而已. 此收购绝对不仅仅是买专利而已. 软硬整合对 Google 来说不会不是一个巨大无比的诱惑. 只不过呢, 借专利之事遮一遮, 目标就不是那么赤裸裸. 从另一个角度来说, android 今天的成绩靠的还是机海战术 – 纯技术地讲, 其系统本身未必就比别家的高明 – 只不过不需要 license 费这一条对厂商的诱惑巨大而已. 所以, Google 还不能太明显地偏向自己旗下的 Moto, 而要在 Moto 与 samsung, htc 等等之间保持一个微妙的平衡 – 好累啊!

 

三星 HTC 等等如出一辙如同新华社通告般的声明无非体现了厂商们的担心而已. 我担心, 但是又不能直接说出来, 先拿冠冕堂皇的官样文章出来, 一方面先静观其变, 另一方面也一起先挤兑一下 Google. 真不行好歹我还可以投靠 M$ 不是?

 

所以, Google 的政策无论如何是会偏向买下来的 Moto 的, 三星 htc 这些大厂大合作伙伴也是需要关照的 – 尽管是排在第二梯队了. 从种种趋势可以看出, Google 加强对 android 的控制是在所必然的了. 这样, 谁最吃亏就很清楚了. 不是无名无姓的山寨们, 它们无所谓, 连一个 MTK 都能生产很多年, 大不了就停留在 2.x 并且只用官方一致的硬件就是. 吃亏的是国内那些自己觉得比山寨高一筹的高级山寨们, 比如, 小米/点心/魅族/阿里云… 等等, 依赖于 android 源码改头换面却又并非 OHA 成员的.

 

2. 小米手机的发布

 

唯一的感觉是: 定位模糊. 1999 的价格怎么都是亏的, 就算可以节省渠道费用也一样. 报料出来的 10K CPU 的量也说明了有清晰可见的止亏线存在. 所以, 看上去还是底气不足的试探而已 – 说难听点连魅族的气魄都没有. 雷军高谈好手机四要素: 双核大屏信号好电池足. 没有一样是突出智能手机的特点的, 倒颇像是山寨广告. 双卡双待铃声巨响电量十足. 这么说来小米手机是准备把自己定位到中低端的了?

 

且慢, 明明还听到雷军号称此款手机是为了面向发烧友的. 还说到: 发烧友是真正的意见领袖,只有他们喜欢,一款手机“才可以真正走向大众”。不知道这个逻辑是怎么来的, 无论从哪个方面来说, “发烧友” 都是一个特殊的群体, 跟大众是完全不同的. 或许雷总的 “发烧友” 概念跟我们的不同?

 

好吧, 抛开手机本身吧. 很多人是认为小米手机是冲着推广米聊跟 MIUI 来的. 大家觉得这么推广米聊去跟腾讯打, 有胜算吗? MIUI 在 Google 收紧 android 政策的情况下能够成气候吗? 这两点我都不看好.

 

也许就是先拿着风投烧着爽呢?

 

Build android source on SnowLeopard with xcode4

1) Install 10.5 SDK from xcode 3’s dmg

2) Specify “CC=gcc-4.2 CXX=g++-4.2 CPP=cpp-4.2” before make command line to avoid an issue in default llvmgcc-4.2. Of course you can change the gcc symbolic link to what you want but I think it doesn’t make sense for this exception. llvmgcc works on most cases. I just found two exceptions till now – one is Android source, the other is ffmpeg.

 

Google, 至少在这里你并不 open

话说我们团队的作品 RockPlayer for android 在 Android Market 上正式发布有 1 个半月了, 算是我王婆卖瓜吧, 来自全球各地的反响还是很不错的. 我们也正在很努力地做进一步的完善和增强, 希望能够进一步地提供更多的功能和更好的性能. 可是, 我们的努力, 由于 Google 在 android market 上的行为, 很可能成为泡影, 至少, 也会是一个非常严重的打击吧.

8 月中旬的某天, 有用户反映在 Market 上找不到 RockPlayer 的 ARMv7 和 ARMv6+VFP 的版本了, 我们赶紧连上 market 一看究竟, 发现这两个版本已经被标记为 suspended 了. 我们的第一感觉是很莫名其妙, 不知道什么原因使得 Google 把这两个版本  suspend 了. 还有剩下的一个版本还在, 用户还能从 Market 下载. 于是我们一方面告知用户需要其余版本的请到网站进行下载, 另一方面积极地想办法寻找与 Google 沟通的方式. 无奈的是, 无论我们通过什么样的途径向 Google 询问 RockPlayer 为啥被 suspend 的原因, 始终得不到任何回答. 同时, 通过在 Internet 上的搜索发现, 象我们一样, 被 suspend 了却得不到任何回应的开发者还有很多. 甚至, 在 Internet 都找不到任何一个 Google 对此类事件有回应的实例!

事情还没完. 今天早上一起来, 发现连剩下的那个都被 suspend 了. 同样是没有任何说明!

Google, 你不是很 open 吗? 你不是就打着 open 的旗号来跟 iPhone 抗衡吗? 但至少, AppStore 拒绝我的应用会给我一个理由, 让我可以修改了之后重新提交. 而你呢? 连个理由都不给, 并且对询问没有任何回应. 这难道就叫 open 吗? 这难道是一个口口声声要号称赶超 AppStore 的 Market 应该干的事吗? 不管 AppStore 是如何独断 – Google 还常拿这个来攻击 AppStore 并号称自己不作监管 – 至少, 对于与开发者的沟通来说, 远远好于这个号称 open 的 android market!

如果 Google 继续这么做, 那么, 对不起, Android Market 永远都赶不上 AppStore 的.

最后还需要说明的是: 我们不会放弃, 会继续进行版本更新, 同时也会以积极的态度去继续试图跟 Google 沟通. 毕竟, market 如果能变得更好一点, 无论对开发者还是用户, 都是一件好事.