<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lytsing&#039;s Blog</title>
	<atom:link href="http://blog.lytsing.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lytsing.org</link>
	<description>从事Linux/Android嵌入式系统研究，Web Developer，现在致力于移动支付。</description>
	<lastBuildDate>Thu, 02 Feb 2012 10:39:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Downlodas 之 ByUri.startDownloadByUri</title>
		<link>http://blog.lytsing.org/archives/747.html</link>
		<comments>http://blog.lytsing.org/archives/747.html#comments</comments>
		<pubDate>Thu, 02 Feb 2012 10:39:54 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=747</guid>
		<description><![CDATA[很久以前写过一篇《How to Use Android Downloads Provider》，到了Android 2.2(froyo)，Android 提供了更优雅的接口： public static long startDownloadByUri(Context context, String url, String cookieData, boolean showDownload, int downloadDestination, boolean allowRoaming, boolean skipIntegrityCheck, String title, String notification_package, String notification_class, String notification_extras) 当然这些接口都是hide的，做ROM系统开发的才可以直接使用，用mmm方式编译。签于这个原因，一些国内第三方电子市场直接拿Downloads组件的代码修改成自己的提供使用。代码实现在： [deli@violet frameworks]$ find . -type f &#8230; <a href="http://blog.lytsing.org/archives/747.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>很久以前写过一篇《<a href="http://blog.lytsing.org/archives/135.html" title="How to Use Android Downloads Provider">How to Use Android Downloads Provider</a>》，到了Android 2.2(froyo)，Android 提供了更优雅的接口：</p>
<pre><code>public static long startDownloadByUri(Context context,
                                      String url,
                                      String cookieData,
                                      boolean showDownload,
                                      int downloadDestination,
                                      boolean allowRoaming,
                                      boolean skipIntegrityCheck,
                                      String title,
                                      String notification_package,
                                      String notification_class,
                                      String notification_extras)</code></pre>
<p>当然这些接口都是hide的，做ROM系统开发的才可以直接使用，用mmm方式编译。签于这个原因，一些国内第三方电子市场直接拿Downloads组件的代码修改成自己的提供使用。代码实现在：</p>
<p><code>[deli@violet frameworks]$ find . -type f -name Downloads.java<br />
./base/core/java/android/provider/Downloads.java<br />
./base/core/java/android/net/Downloads.java</code><br />
还有 packages/providers/DownloadProvider</p>
<p>startDownloadByUri 即这个函数很容易理解，有网友给我发email说不知道如何使用，我贴出系统升级使用的代码片段，希望对大家有帮助。</p>
<p>[deli@violet update]$ cat Download.java</p>
<pre><code>/*
 * Copyright (C) 2010 lytsing.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.android.gsf.update;

import com.google.android.gsf.R;

import android.content.Context;
import android.util.Log;
import android.net.Downloads;

public class Download {

    private final Context mContext;

    private String mNotificationClass;

    private String mNotificationPackage;

    public Download(Context context) {
        mContext = context;
        mNotificationPackage = context.getPackageName();
        mNotificationClass = SystemUpdateService.Receiver.class.getName();
    }

    public boolean downloadUpdate(String url, boolean showDownload, boolean allowRoaming) {
        removeAllDownloads();
        try {
            if (Downloads.ByUri.startDownloadByUri(
                        mContext,
                        url,
                        null,
                        showDownload,
                        2,
                        allowRoaming,
                        true,
                        mContext.getString(R.string.system_update_downloading_notification_title),
                        mNotificationPackage,
                        mNotificationClass,
                        null)== -1) {
                Log.w("update.Download", "Could not insert download entry into provider");
                return false;
            } 

            Log.i("update.Download",new StringBuilder()
                    .append("Started a new update download: ").append(url).toString());
        } catch (Exception e) {
            Log.e("update.Download", "Could not start update download", e);
            return false;
        }

        return true;
    }

    public Downloads.StatusInfo getStatus(String url) {
        return Downloads.ByUri.getStatus(mContext, url, 24 * 3600 * 1000);
    }

    public void removeAllDownloads() {
        Log.v("update.Download", "deleting all update downloads");
        try {
            Downloads.ByUri.removeAllDownloadsByPackage(mContext, mNotificationPackage,
                    mNotificationClass);
        } catch (Exception ex) {
            Log.e("update.Download", "Couldn\'t delete downloads", ex);
        }
    }
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/747.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>电子市场 Google 软件精选管理器</title>
		<link>http://blog.lytsing.org/archives/734.html</link>
		<comments>http://blog.lytsing.org/archives/734.html#comments</comments>
		<pubDate>Wed, 23 Nov 2011 15:54:11 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[decompile]]></category>
		<category><![CDATA[Market]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=734</guid>
		<description><![CDATA[很多手拿Android手机的人不明白这个软件是干啥的，其实，就是Market Updater，我也不明白为什么中文会叫成这样。在Broncho的时候，反编译过这个MarketUpdater.apk，以后我也不干这坏事了，把成果贴出来吧： https://github.com/lytsing/MarketUpdater 就30多行代码，它干的事情很少，监听 &#8220;com.android.vending.UPDATE_MARKET&#8221;, intent把下载后的apk url传过来，调用静默安装apk的方法。 那么，谁发 &#8220;com.android.vending.UPDATE_MARKET&#8221; 这个intent action？ 当然是电子市场了： &#60;receiver android:name=".InitializeMarketAction$DownloadBroadcastReceiver" android:permission="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS" android:exported="true"&#62; &#60;receiver /&#62; 大致的InitializeMarketAction.java代码： // From Vending.apk package com.android.vending; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.Uri; public class InitializeMarketAction { public class DownloadBroadcastReceiver extends &#8230; <a href="http://blog.lytsing.org/archives/734.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>很多手拿Android手机的人不明白这个软件是干啥的，其实，就是Market Updater，我也不明白为什么中文会叫成这样。在Broncho的时候，反编译过这个MarketUpdater.apk，以后我也不干这坏事了，把成果贴出来吧： <a href="https://github.com/lytsing/MarketUpdater" title="Market Updater source  code" target="_blank">https://github.com/lytsing/MarketUpdater</a></p>
<p>就30多行代码，它干的事情很少，监听 &#8220;com.android.vending.UPDATE_MARKET&#8221;, intent把下载后的apk url传过来，调用静默安装apk的方法。</p>
<p>那么，谁发 &#8220;com.android.vending.UPDATE_MARKET&#8221; 这个intent action？  当然是电子市场了：</p>
<pre><code>&lt;receiver
    android:name=".InitializeMarketAction$DownloadBroadcastReceiver"
    android:permission="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS"
    android:exported="true"&gt;
&lt;receiver /&gt;</code></pre>
<p>大致的InitializeMarketAction.java代码：</p>
<pre><code>// From Vending.apk
package com.android.vending;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;

public class InitializeMarketAction {

    public class DownloadBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            final Uri contentUri = intent.getData();
            int status = DownloadManagerUtil.getStatus(context, contentUri);
            if (DownloadManagerUtil.isStatusAuthFailure(status)) {
                new Thread() {
                    public void run() {
                        VendingApplication.getVendingApplication().invalidateAuthTokenBlocking(
                                AuthService.ANDROID_SECURE);
                    }
                }.start();

            } else if (DownloadManagerUtil.isStatusSuccess(status)) {
                setBackgroundRunnable(new Runnable() {

                    @Override
                    public void run() {
                        ServiceLocator.getCacheManager().clear();
                        Context app = VendingApplication.getVendingApplication();
                        app.sendBroadcast(new Intent("com.android.vending.UPDATE_MARKET",
                                contentUri));
                    }

                });
            }

        }
    }
}</code></pre>
<p>那电子市场是如何自我更新的呢？ 这个问题问得好。待续。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/734.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sqaure 网站所使用的技术</title>
		<link>http://blog.lytsing.org/archives/725.html</link>
		<comments>http://blog.lytsing.org/archives/725.html#comments</comments>
		<pubDate>Sat, 19 Nov 2011 11:36:27 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=725</guid>
		<description><![CDATA[从他们的网站的招聘信息，Quora问答社区获取到的信息，可以大致了解情况。 早期的3人团队: Jack Dorsey写服务器端(Python on Google App Engine) Tristan O&#8217;Tierney 写iPhone客户端 Jim McKelvey设计硬件。 经过一个月的努力，三个创始人做出了第一个原型。 目前跑的是： 数据库：Redis and MySQL 支付平台：Ruby on Rails, Sinatra, JRuby, MRI, and Java web： 宣传页面使用 html5，他们使用大量的js开源框架。 服务器部署在 亚马逊 CloudFront 云服务。 目前纯开发人员有大约有50人，可以从他们的开源项目看到：https://github.com/square 他们的开源代码提供了ruby代码，iPhone、Android测试框架，Android SDK，js等。 他们开发推崇TDD, Pair programming。 他们的开发理念：Rethinking，Redefining。]]></description>
			<content:encoded><![CDATA[<p>从他们的网站的招聘信息，Quora问答社区获取到的信息，可以大致了解情况。</p>
<p>早期的3人团队:<br />
Jack Dorsey写服务器端(Python on Google App Engine)<br />
Tristan O&#8217;Tierney 写iPhone客户端<br />
Jim McKelvey设计硬件。<br />
经过一个月的努力，三个创始人做出了第一个原型。</p>
<p>目前跑的是：</p>
<p>数据库：Redis and MySQL</p>
<p>支付平台：Ruby on Rails, Sinatra, JRuby, MRI, and Java</p>
<p>web： 宣传页面使用 html5，他们使用大量的js开源框架。</p>
<p>服务器部署在 亚马逊 CloudFront 云服务。</p>
<p>目前纯开发人员有大约有50人，可以从他们的开源项目看到：<a href="https://github.com/square">https://github.com/square</a></p>
<p>他们的开源代码提供了ruby代码，iPhone、Android测试框架，Android SDK，js等。</p>
<p>他们开发推崇TDD, Pair programming。</p>
<p>他们的开发理念：Rethinking，Redefining。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/725.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protobuf Demo</title>
		<link>http://blog.lytsing.org/archives/711.html</link>
		<comments>http://blog.lytsing.org/archives/711.html#comments</comments>
		<pubDate>Fri, 04 Nov 2011 15:55:24 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=711</guid>
		<description><![CDATA[操作系统：Fedora core 16 下载安装 Go to http://code.google.com/p/protobuf/ download the latest updates version $ wget http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.bz2 $ tar xvf protobuf-2.4.1.tar.bz2 $ cd protobuf-2.4.1/ $ ./configure &#38;&#38; make &#38;&#38; sudo make install 一般默认安装在/usr/local 目录下,需要导入环境变量： 编辑 ~/.bashrc 在后面添加: export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig$PKG_CONFIG_PATH 编译jar包: &#8230; <a href="http://blog.lytsing.org/archives/711.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>操作系统：Fedora core 16</p>
<p><strong>下载安装</strong></p>
<p>Go to http://code.google.com/p/protobuf/ download the latest updates version</p>
<pre><code>$ wget http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.bz2
$ tar xvf protobuf-2.4.1.tar.bz2
$ cd protobuf-2.4.1/
$ ./configure &amp;&amp; make &amp;&amp; sudo make install</code></pre>
<p>一般默认安装在/usr/local 目录下,需要导入环境变量：</p>
<p>编辑 ~/.bashrc 在后面添加:</p>
<pre><code>export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig$PKG_CONFIG_PATH</code></pre>
<p>编译jar包:</p>
<pre><code>$ cd protobuf-2.4.1/
$ sudo yum install maven
$ mvn package</code></pre>
<p>在 target/ 目下下生成 protobuf-java-2.4.1.jar， 使用的时候，导入环境变量CLASSPATH 就行了。</p>
<p>Ubuntu 11.10，安装也很简单：</p>
<pre><code>$ sudo apt-get install libprotobuf-dev libprotobuf-java
$ export CLASSPATH=$CLASSPACH:/usr/share/java/protobuf.jar</code></pre>
<p><strong>书写 .proto 文件</strong><br />
一个比较好的习惯是认真对待 proto 文件的文件名。比如将命名规则定于如下：<br />
packageName.MessageName.proto </p>
<p>下载 vim 编辑proto语法亮度插件： http://protobuf.googlecode.com/svn/tags/release-2.0.1/editors/proto.vim  按照里面的说明安装。或者照这个操作，https://github.com/garyharan/vim-proto</p>
<p><strong>服务器端与客户端socket通讯</strong><br />
服务器段用C++实现，客户端 Java/C++，具体代码放在 github：<a href="https://github.com/lytsing/protobuf-demo" title="Protobuf demo: C++ server and Java client commumication with socket">https://github.com/lytsing/protobuf-demo</a>  这里就不贴出来了。</p>
<p>参考: <a href="http://www.cnblogs.com/flying5/archive/2011/08/18/214517.html">Protocol Buffers的安装使用和C++入门示例</a>  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/711.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决电子市场 3.13版本 &#8220;您的设备与此商品不兼容&#8221;的问题</title>
		<link>http://blog.lytsing.org/archives/702.html</link>
		<comments>http://blog.lytsing.org/archives/702.html#comments</comments>
		<pubDate>Tue, 20 Sep 2011 16:14:13 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Market]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=702</guid>
		<description><![CDATA[Android market: Your device is not compatible with this item 用 apktool 1.4.1 反编译Vending.apk 3.1.3版本，遇到错误，无法插入调试信息再打包重新安装。搜索反编译后的文件查找信息： 您的设备与此商品不兼容。 smali/com/android/vending/R$string.smali:.field public static final availability_restriction_hardware:I = 0x7f080191 deli@deli-laptop:~/Desktop/a/Vending$ grep 0x7f080191 * -r smali/com/google/android/finsky/activities/DetailsAvailabilityRestrictionViewBinder.smali: const v3, 0x7f080191 猜出大概代码: public bind(View view, Document document, int iconWidth, &#8230; <a href="http://blog.lytsing.org/archives/702.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Android market: Your device is not compatible with this item</p>
<p><a href="http://blog.lytsing.org/wp-content/uploads/2011/09/facebook.jpg"><img src="http://blog.lytsing.org/wp-content/uploads/2011/09/facebook.jpg" alt="" title="facebook" width="480" height="800" class="aligncenter size-full wp-image-704" /></a><br />
用 apktool 1.4.1 反编译Vending.apk 3.1.3版本，遇到错误，无法插入调试信息再打包重新安装。搜索反编译后的文件查找信息：</p>
<p><string name="availability_restriction_hardware">您的设备与此商品不兼容。</string></p>
<p>smali/com/android/vending/R$string.smali:.field public static final availability_restriction_hardware:I = 0x7f080191</p>
<p>deli@deli-laptop:~/Desktop/a/Vending$ grep 0x7f080191 * -r<br />
smali/com/google/android/finsky/activities/DetailsAvailabilityRestrictionViewBinder.smali:    const v3, 0x7f080191</p>
<p>猜出大概代码:</p>
<pre><code>public bind(View view, Document document, int iconWidth, int iconRightMargin, DfeToc toc) {

	TextView reason = view.findViewById(R.id.restriction_reason);
	int restriction = document.getAvailabilityRestriction();

	switch (restriction) {
	case 4:
		reason.setText(R.string.availability_restriction_hardware);
		break;
	}
}

public int getAvailabilityRestriction() {
	boolean hasAvailability = mFinskyDoc.hasAvailability();
	if (hasAvailability) {
		int restriction = mFinskyDoc.getAvailability().getRestriction();
		reutrn restriction;
	}

	return -1;
}</code></pre>
<p>restriction的值是通过 setRestriction 设置，读取protobuf数据，也没弄清楚，因为无法插入调试信息。发现3.1.3版本比以前版本复杂多了。</p>
<p>最后发现</p>
<pre><code>  deli@deli-laptop:~$ diff build.prop build.prop~
  31c31
  &lt; ro.build.fingerprint=N708_800_600/broncho_N708/N708_800_600/:2.2/FRF91/user.N708_800_600.20110917.133140:user/test-keys
  ---
  &gt; ro.build.fingerprint=N708/broncho_N708/N708_800_600/:2.2/FRF91/user.N708_800_600.20110917.133140:user/test-keys</code></pre>
<p>ro.build.fingerprint=N708，N708这个是我们的项目名，临时修改编译脚本成N708_800_600，出现下划线，导致被google过滤掉了。搞第三方ROM的，注意了，别随意修改系统参数，除非你真的明白你在干啥东东。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/702.html/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A simple http web service</title>
		<link>http://blog.lytsing.org/archives/697.html</link>
		<comments>http://blog.lytsing.org/archives/697.html#comments</comments>
		<pubDate>Fri, 16 Sep 2011 17:27:52 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=697</guid>
		<description><![CDATA[很久没更新blog了，主要是这段时间工作太忙，刚加入一家创业公司 iboxpay，做移动支付，就是做中国版的Square 重新温习 socket之类的内容，翻看以前写的一些代码，整理一下，一个简单的 web server，放在 github:https://github.com/lytsing/myhttpd 这个例子很简单，但涉及到的内容都具备了: 基础socket使用 多路复用 信号处理 配置文件读取 等周末再完善，加上ipv6支持，当做一个学习的教程吧。]]></description>
			<content:encoded><![CDATA[<p>很久没更新blog了，主要是这段时间工作太忙，刚加入一家创业公司 iboxpay，做移动支付，就是做中国版的Square <img src='http://blog.lytsing.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>重新温习 socket之类的内容，翻看以前写的一些代码，整理一下，一个简单的 web server，放在 github:<a href="https://github.com/lytsing/myhttpd">https://github.com/lytsing/myhttpd</a><br />
这个例子很简单，但涉及到的内容都具备了:</p>
<ul>
<li>基础socket使用</li>
<li>多路复用</li>
<li>信号处理</li>
<li>配置文件读取</li>
</ul>
<p>等周末再完善，加上ipv6支持，当做一个学习的教程吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/697.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再见了，Broncho</title>
		<link>http://blog.lytsing.org/archives/695.html</link>
		<comments>http://blog.lytsing.org/archives/695.html#comments</comments>
		<pubDate>Sat, 23 Jul 2011 15:40:27 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[提笔就老]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=695</guid>
		<description><![CDATA[进入 Broncho 不知不觉已经到了第四个年头。由于个人原因，选择在这个时候跟大家告别了，舍不得这么多年一起共事的同事，从华瀚科技到数字技术园，到方大，到照明中心，点点滴滴，见证了我们共同奋斗的岁月。 感谢 Broncho 首席架构师李先静的栽培，感谢卢芳带我进入无线通讯协议领域，感谢这一路来对我帮助、鼓励的同事(包括pre-Broncoers)，最感谢的，是老魏，Broncho经营到现在，他是付出了最多的心血。曾记得，09年4月份老魏宣布放弃研发多年的Broncho 手机操作系统，转投入Android平台时的情形，我们都感到很难过。Broncho项目就像他的亲生孩子，忍心丢弃，这是需要多大的勇气与决心。值得庆幸的是，现在，Broncho已经度过了最艰难时候，也有很好的前景，我可以感到由衷的欣慰了。 很抱歉不能再跟许多朋友一起共事了；祝本公司越办越好，让我的同事们可以安居乐业。]]></description>
			<content:encoded><![CDATA[<p>    进入 Broncho 不知不觉已经到了第四个年头。由于个人原因，选择在这个时候跟大家告别了，舍不得这么多年一起共事的同事，从华瀚科技到数字技术园，到方大，到照明中心，点点滴滴，见证了我们共同奋斗的岁月。</p>
<p>    感谢 Broncho 首席架构师李先静的栽培，感谢卢芳带我进入无线通讯协议领域，感谢这一路来对我帮助、鼓励的同事(包括pre-Broncoers)，最感谢的，是老魏，Broncho经营到现在，他是付出了最多的心血。曾记得，09年4月份老魏宣布放弃研发多年的Broncho 手机操作系统，转投入Android平台时的情形，我们都感到很难过。Broncho项目就像他的亲生孩子，忍心丢弃，这是需要多大的勇气与决心。值得庆幸的是，现在，Broncho已经度过了最艰难时候，也有很好的前景，我可以感到由衷的欣慰了。</p>
<p>    很抱歉不能再跟许多朋友一起共事了；祝本公司越办越好，让我的同事们可以安居乐业。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/695.html/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>汉化 google+ 1.02 Android客户端</title>
		<link>http://blog.lytsing.org/archives/663.html</link>
		<comments>http://blog.lytsing.org/archives/663.html#comments</comments>
		<pubDate>Sat, 16 Jul 2011 06:47:51 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=663</guid>
		<description><![CDATA[正在研究G+ Android客户的一些设计方法，发现蛮复杂的。 很早就知道如何汉化 apk了，只是不屑于干那样的活，觉得没什么技术含量。上电子市场，发现好多人留言希望赶紧出中文版，需求蛮大的。台湾的兄弟早搞出来了，目前没有发现有简体中文的。大陆的兄弟们，是不是要跟上呢？小弟e文功底差，只能照着 google+ 网页中文版翻译一些基本的字段。翻译真是苦差活，随着使用G+的深入使用，会持续更新。有错误不妥之处，请留言提醒哈。 适用机型: Android 2.1以上 下载地址： http://lytsing.org/downloads/gplus-1.0.2.apk 更新： 忙了一个下午，再搜索，发现 Jay Chua 同学已经搞过了。看了他空间，网页字体不错，我也升级了wp。以后最好跟他一起汉化，免得浪费时间。 翻译心得： 1. 认真是一种能力，而不是仅仅是态度，既然要翻译了，就努力做好，不能做到一半就丢了。 2. 注意标点符号，注意圆角。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.lytsing.org/wp-content/uploads/2011/07/google_plus_logo.jpg"><img src="http://blog.lytsing.org/wp-content/uploads/2011/07/google_plus_logo.jpg" alt="" title="google_plus_logo" width="368" height="400" class="alignright size-full wp-image-671" /></a><br />
正在研究G+ Android客户的一些设计方法，发现蛮复杂的。</p>
<p>很早就知道如何汉化 apk了，只是不屑于干那样的活，觉得没什么技术含量。上电子市场，发现好多人留言希望赶紧出中文版，需求蛮大的。台湾的兄弟早<a href="http://apk.tw/thread-10282-1-1.html ">搞出来了</a>，目前没有发现有简体中文的。大陆的兄弟们，是不是要跟上呢？小弟e文功底差，只能照着 google+ 网页中文版翻译一些基本的字段。翻译真是苦差活，随着使用G+的深入使用，会持续更新。有错误不妥之处，请留言提醒哈。</p>
<p><a href="http://blog.lytsing.org/wp-content/uploads/2011/07/2.jpg"><img src="http://blog.lytsing.org/wp-content/uploads/2011/07/2.jpg" alt="" title="2" width="600" height="1024" class="aligncenter size-full wp-image-664" /></a></p>
<p><a href="http://blog.lytsing.org/wp-content/uploads/2011/07/1.jpg"><img src="http://blog.lytsing.org/wp-content/uploads/2011/07/1.jpg" alt="" title="1" width="600" height="1024" class="aligncenter size-full wp-image-665" /></a></p>
<p>适用机型: Android 2.1以上<br />
下载地址：<a href="http://lytsing.org/downloads/gplus-1.0.2.apk"> http://lytsing.org/downloads/gplus-1.0.2.apk</a></p>
<p><strong>更新：</strong><br />
忙了一个下午，再搜索，发现  Jay Chua 同学已经<a href="http://www.jaychua.tk/134.html">搞过了</a>。看了他空间，网页字体不错，我也升级了wp。以后最好跟他一起汉化，免得浪费时间。</p>
<p>翻译心得：<br />
1. 认真是一种能力，而不是仅仅是态度，既然要翻译了，就努力做好，不能做到一半就丢了。<br />
2. 注意标点符号，注意圆角。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/663.html/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Android Market 最新版本 2.3.6</title>
		<link>http://blog.lytsing.org/archives/658.html</link>
		<comments>http://blog.lytsing.org/archives/658.html#comments</comments>
		<pubDate>Wed, 13 Jul 2011 07:46:01 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Market]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=658</guid>
		<description><![CDATA[亮点: 在设置多一下个选项，如图: 下载地址: http://lytsing.org/downloads/Vending-2.3.6-enable-paid.apk 如包名所示，我修改了几行代码，使它可以查看付费软件。 安装后,设置 &#8211; 应用程序 &#8211; 管理应用程序 &#8211; 全部 &#8211; 电子市场 &#8211; 清除缓存 适用范围: Android 2.2，刷过 使用 test-key 签名的 第三方 rom ，比如大名鼎鼎的 CM.否则遇到下面的FC： I/ActivityManager( 116): Process com.android.protips (pid 537) has died and restarted (pid 0). E/DatabaseUtils( 364): &#8230; <a href="http://blog.lytsing.org/archives/658.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>亮点</strong>: 在设置多一下个选项，如图:<br />
<a href="http://blog.lytsing.org/wp-content/uploads/2011/07/fb.jpg"><img src="http://blog.lytsing.org/wp-content/uploads/2011/07/fb.jpg" alt="" title="fb" width="600" height="1024" class="aligncenter size-full wp-image-659" /></a></p>
<p>下载地址: <a href="http://lytsing.org/downloads/Vending-2.3.6-enable-paid.apk">http://lytsing.org/downloads/Vending-2.3.6-enable-paid.apk</a></p>
<p>如包名所示，我修改了几行代码，使它可以查看付费软件。</p>
<p>安装后,设置 &#8211; 应用程序 &#8211; 管理应用程序 &#8211; 全部 &#8211; 电子市场 &#8211; 清除缓存</p>
<p><strong>适用范围:</strong></p>
<p>Android 2.2，刷过 使用 test-key 签名的 第三方 rom ，比如大名鼎鼎的 CM.否则遇到下面的FC：</p>
<p>I/ActivityManager(  116): Process com.android.protips (pid 537) has died and restarted (pid 0).<br />
E/DatabaseUtils(  364): Writing exception to parcel<br />
E/DatabaseUtils(  364): java.lang.SecurityException: Permission Denial: writing com.google.android.gsf.settings.GoogleSettingsPrS<br />
E/DatabaseUtils(  364):         at android.content.ContentProvider<br />
$Transport.enforceWritePermission(ContentProvider.java:325)<br />
E/DatabaseUtils(  364):         at android.content.ContentProvider $Transport.insert(ContentProvider.java:173)<br />
E/DatabaseUtils(  364):         at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:146)<br />
E/DatabaseUtils(  364):         at android.os.Binder.execTransact(Binder.java:288)<br />
E/DatabaseUtils(  364):         at dalvik.system.NativeStart.run(Native<br />
                                                                 Method)<br />
W/dalvikvm(  353): threadid=33: thread exiting with uncaught exception (group=0x4001d7c8)<br />
E/AndroidRuntime(  353): FATAL EXCEPTION: work-service-handler-thread<br />
E/AndroidRuntime(  353): java.lang.SecurityException: Permission Denial: writing com.google.android.gsf.settings.GoogleSettingsPS<br />
E/AndroidRuntime(  353):        at android.os.Parcel.readException(Parcel.java:1247)<br />
E/AndroidRuntime(  353):        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)<br />
E/AndroidRuntime(  353):        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)</p>
<p><strong>可能会出现的问题:</strong><br />
(一)下载软件，一直卡在“Download paused”/“下载暂停”。</p>
<p>解决方法:<br />
1. 把SDCARD卸载。<br />
2. 删除 “/mnt/secure/asec/smdl2tmp1.asec” 或者 sd卡上的空目录 “.android_secure”.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/658.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android apk forward lock</title>
		<link>http://blog.lytsing.org/archives/654.html</link>
		<comments>http://blog.lytsing.org/archives/654.html#comments</comments>
		<pubDate>Sat, 18 Jun 2011 11:22:18 +0000</pubDate>
		<dc:creator>deli</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://blog.lytsing.org/?p=654</guid>
		<description><![CDATA[forward lock 干啥用？Android market有用到，开发者上传apk时候，可以设置。官方文档也说明了 http://developer.android.com/guide/appendix/market-filters.html Forward-Locked Applications To forward lock an application, set copy protection to &#8220;On&#8221; when you upload the application to Market. Market will not show copy-protected applications on developer devices or unreleased devices. 查看源代码，frameworks/base/core/java/android/content/pm/PackageManager.java 注释说明： 标识本应用属于受限应用，应用将会被安装到保护目录，只有该应用可以访问代码段和不属于resource的asset资源。 那么安装这样的一个 &#8230; <a href="http://blog.lytsing.org/archives/654.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>forward lock 干啥用？Android market有用到，开发者上传apk时候，可以设置。官方文档也说明了</p>
<p><a href="http://developer.android.com/guide/appendix/market-filters.html">http://developer.android.com/guide/appendix/market-filters.html</a></p>
<blockquote><p>Forward-Locked Applications</p>
<p>To forward lock an application, set copy protection to &#8220;On&#8221; when you upload the application to Market. Market will not show copy-protected applications on developer devices or unreleased devices.</p></blockquote>
<p>查看源代码，frameworks/base/core/java/android/content/pm/PackageManager.java 注释说明：</p>
<p>标识本应用属于受限应用，应用将会被安装到保护目录，只有该应用可以访问代码段和不属于resource的asset资源。</p>
<p>那么安装这样的一个 apk，需要设置 FORWARD LOCK 标志位。</p>
<pre><code>1758     public abstract void installPackage(
1759             Uri packageURI, IPackageInstallObserver observer, int flags,
1760             String installerPackageName);</code></pre>
<p>Android 1.5, PackageManager.FORWARD_LOCK_PACKAGE = 0&#215;00000001;</p>
<p>Android 2.2 改成了 INSTALL_FORWARD_LOCK</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lytsing.org/archives/654.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

