Pages:  1 2 3 4 5 6 7 ... 11 12
Android – Page 5 – lytsing's Blog

Category: Android

  • adb 通过 wifi 连接 Android 设备

    1. 需要 root 权限

    代码修改点:

    /system/extras/su/su.c

    60     /* Until we have something better, only root and the shell can use su. */
    61     myuid = getuid();
    62     if (myuid != AID_ROOT && myuid != AID_SHELL) {
    63         fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
    64         return 1;
    65     }
    
    67   if(setgid(gid) || setuid(uid)) {
    68       fprintf(stderr,"su: permission denied\n");
    69        return 1;
    70    }

    把63,64,68,69 行注释掉,编译生成su,然后push到设备。

    adb push su /system/xbin/ 
    adb shell chmod 6755 /system/xbin/su

    2. 安装 adbwireless 软件,一键搞定
    在电子市场上搜 adb,前面两个随便选一个都行。
    adb-wifi in market

    如果电子市场上不了,在 Terminal Emulator 直接输入:

    setprop service.adb.tcp.port 8000
    stop adbd
    start adbd

    通过adb 连上设备,下面是我机器上的操作结果:
    deli@deli-laptop:~$ adb connect 192.168.1.103:8000
    already connected to 192.168.1.103:8000
    deli@deli-laptop:~$ adb shell
    # busybox sh
    / #

  • Android Market 架构设计解析

    1. 没有源代码。
    2. 通过反编译工具(apktool/dex2jar),察看网络数据包工具(tcpdump/wireshark)研究,不能保证100%的正确,但整体的思路还是能看出来的。国内也有很多第三方电子市场,但形像神不像。

    Android Market Overview : Client & Server

    大致的代码目录(android 1.5版本, 后续版本比较复杂):

    Vending
    |-- AndroidManifest
    |-- res
    |   |-- drawable
    |   |-- drawable-finger
    |   |-- layout
    |   |-- menu
    |   |-- values
    |   `-- xml
    `-- src
        `-- com
            |-- android
            |   `-- vending
            |       |-- SuggestionsProvider.java
            |       |-- ...
            |       |-- VendingNotificationManager.java
            |       |-- adapters
            |       |   |-- AggregatedAdapter.java
            |       |   `-- SectionAdapter.java
            |       |-- api
            |       |   |-- ApiException.java
            |       |   |-- ...
            |       |   `-- UninstallReasonService.java
            |       |-- cache
            |       |   |-- CacheManager.java
            |       |   |-- CacheManagerImpl.java
            |       |   `-- Cacheable.java
            |       |-- controller
            |       |   |-- ActivityAccessor.java
            |       |   |-- ...
            |       |   `-- ResultsController.java
            |       |-- licensing
            |       |   |-- ILicenseResultListener.aidl
            |       |   |-- ILicensingService.aidl
            |       |   `-- LicensingService.java
            |       |-- model
            |       |   |-- Address.java
            |       |   |-- ...
            |       |   `-- UninstallReasonResponseProto.java
            |       `-- util
            |           |-- Base64.java
            |           |-- ...
            |           `-- Util.java
            `-- google
                `-- android
                    |-- googleapps
                    |-- googlelogin
                    `-- providers

    代码文件命名规则

    每个Activity,以Activity为后缀,比如AssetCategoryBrowserActivity.java
    api目录中,继承BaseService的类,以Service为后缀,比如AssetService.java
    model目录中,提供Protobuf TAG的类,以Proto为后缀,比如UninstallReasonResponseProto.java

    用到的设计模式

    MVC, COR(Chain Of Responsibility), Observer(Notification机制), State ,Singleton,Abstact Factory等,看Android的源代码,这些都很常见。除此之外,对于Server/Client 网络系统,Service Locator, Request-Response,lazyload等设计方法也用到。

    数据交换格式protobuf

    Protocol Buffers in Android 稍有提到过,protobuf传输的是二进制,比Json、XML有速度上的优势和使用的方便,服务器端可以用C/C++,Java,python等实现。

    API

    http://code.google.com/p/android-market-api/
    Android Market 的开源 API 项目,非官方提供的,基于Google Protocol Buffers 协议实现。

    Cache 机制
    Cache 可以保存在内存,也可以写入disk上。

    /data/data/com.android.vending/cache # ls
    AVMC_UAR{-5434199881535588028_}_____0_10_rei___
    AVMC_UAR{8501175443043592143_}_____0_10_rei___
    AVMC_UAR{}APPLICATION__APP_WALLPAPER_POPULAR_ALL_0_10____
    AVMC_UAR{}APPLICATION__APP_WALLPAPER_POPULAR_ALL_10_10____
    AVMC_UAR{}_____0_10__rvh__
    AVMC_UCR-5434199881535588028_0_3_self_
    AVMC_UCR8501175443043592143_0_3_self_
    AVMC_UGIR_-2863385711196347958
    AVMC_UGIR_-4594342797900232749
    AVMC_UGIR_-5005302620309917353
    AVMC_UGIR_-543419988153558802
    ......

    AVMC_UGIR_-543419988153558802的格式是这样的:
    “AVMC_” + “U”/”S” + “GIR_” + assetId

    其他类似。

    具体实现,可以参考libaddressinput 里的 Cache.java

    本地数据库

    /data/data/com.android.vending/databases/assets.db

    把它 pull 出来,用 sqlite3 工具可以看到数据表。这个主要用来保存下载过的apk信息。

    PUSH 通知

    有软件更新时,就用push推送消息,com/google/android/server/checkin/CheckinService 收到消息后,给market发送一个 “com.android.vending.UPDATES_AVAILABLE” intent。push机制,android froyo之前,用的是XMPP协议,之后是c2dm。

    支付系统

    Google checkout, 没有用过。

    还有很多很多细节的东西,不一一详述。总之,做这么一个平台,需要考虑的东西太多了,不是一个人可以搞出来的。

  • Android代码真是精益求精

    看了一个ChangeLog,

         private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
             public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                 Intent intent;
    -            int i = position - 1;
    +            position = position - 1;
                 
    -            switch (i) {
    +            switch (position) {

    一个变量都不想加,对应的ddx格式为:

     67     sub-int v0, p3, v2
     68 
     69     .line 339
     70     .local v0, i:I
     71     packed-switch v0, :pswitch_data_0
    
    
     67     sub-int/2addr p3, v1
     68 
     69     .line 339
     70     packed-switch p3, :pswitch_data_0
  • Android网络应用开发

    Android网络应用开发

    反复研究了 Android Market,总结一下,之前发在新浪微博上,但不够详细,主要是提高用户体验。

    1.网络异常处理,重试机制。
    上wifi常常网络断开,那就看运用程序是否健壮。可以用Android 提供的 frameworks/base/core/java/android/net/NetworkConnectivityListener.java 监控网络变化,然后做相应的处理。

    2.Cache
    这个是必须的。比如手机QQ的头像,不可能每一次登录,重新把头像下载一遍。可以是内存cache,也可以写入SD卡。

    3. 本地数据与服务器同步机制

    4.请求异步处理机制
    给一个app打分,打分后,马上回到之前的界面,而不是一直在等是否把数据发送到了服务器再响应。

    5. push消息通知
    有软件可以更新,在状态栏提示。新浪微博在右上方显示有新数据。

    6.lazyload
    延时加载,比如图标,头像,分页。

    7.数据交换格式:对象序列化/protobuf/json/xml。

    8. 设计模式:MVC,chain。

  • c2dm 使用心得总结

    关于 c2dm是什么? 不就多说了,翻墙从youtube下载 Google I/O 2010 – Building push applications for Android (C2DM) 转发到youku 方便观看, 地址为:http://v.youku.com/v_show/id_XMjQ3MTg1NzA0.html

    c2dm开发组提供的两个demo,似乎不是那么容易上手,可以试试最简单的的实例, Mark Murphy __The Busy Coder’s Guide To Advanced Android Development__ 的一个例子: https://github.com/commonsguy/cw-advandroid/tree/master/Push/C2DM

    程序跑起来了,才有个直观的感受。c2dm整个流程是这样的:
    C2DM 流程图

    简要说明一下:Android 客户端收到 registration_id 后,给你的app server发个http post,保存registration_id起来。然后你的appserver 给 https://android.apis.google.com/c2dm/send 这个url发送一些参数,就行了。

    Mark Murphy的例子用到了Chrome to Phone 一个可重用的包com.google.android.c2dm 用于处理底层的 C2DM 交互事务 (例如配置,任务队列管理等)。但是这个包也是有一些问题的,遇到 “C2DM E Registration error SERVICE_NOT_AVAILABLE” 这个的Error,默认是没有去处理,你需要在AndroidManifest.xml 里声明处理 com.google.android.c2dm.intent.RETRY。

    在申请google c2dm 记得ssh 翻墙 注册就行了,firefox + autoproxy, 在规则添加 .google.com 即可。不然会遇到: “Sign Up for Android Cloud to Device Messaging” 链接被重置,提交时总是说还有一两项信息没有填写(其实都填全了)。

    服务器端的实现

    就是给 c2dm 服务器发 https post 请求,加上一些参数。 写得最简单明了,是这个帖子 Android push notifications (tutorial) 例子中的脚本可以再改进的, Google Auth Token 过一段时间才会失效,我测试所知道的是1个多月,所以可以把它保持起来,提供下次发送数据时使用。我自个儿也写了php实现的版本。关于发送效率,我也是感到比较头疼的,发送数据到几万个终端,如何并发处理?c2dm不支持并发发送数据。目前我只做到重用 http 连接,把registerIds放到队列里,发送失败了,放到队列尾部,重发。

    除此之外,c2dm服务在国内很不稳定,把 app server 放在在国外才比较靠谱。

    参考:
    1. http://goobr.blogspot.com/2010/11/c2dm-sending-messages.html