-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsearch.xml
More file actions
72 lines (33 loc) · 26 KB
/
search.xml
File metadata and controls
72 lines (33 loc) · 26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>软路由折腾日记</title>
<link href="/2024/11/05/router/"/>
<url>/2024/11/05/router/</url>
<content type="html"><![CDATA[<h1 id="软路由折腾日记"><a href="#软路由折腾日记" class="headerlink" title="软路由折腾日记"></a>软路由折腾日记</h1><blockquote><p>最近想折腾软路由,家里正好有一台x86主机,不过性能如果只搞软路由有点过剩,想着搞<del>all in boom</del>all in one<br>开始因为x86主机是单网口的,按照网上教程装好旁路由虽然可以正常上网,但是有玄学bug,所以pdd买了一个pci有线网卡当主路由<br>废话不多说,淦</p></blockquote><h2 id="安装pve"><a href="#安装pve" class="headerlink" title="安装pve"></a>安装pve</h2><p><a href="https://pve.proxmox.com/wiki/Downloads">下载pve</a>,下载完成后使用balenaEtche刻录到u盘,插到要安装pve的电脑上,调整启动项<br>没问题的话会看到这个界面<br>选择INSTALL<br>然后跑完就会到这个界面<br>选择I agree<br>选择你要安装的硬盘<br>然后选择区域<br>设置密码和邮箱<br>选择网卡作为管理口(这个管理口如果给openwrt似乎一直是eth0?)<br>ip设置在openwrt同网段,网关填openwrt的lan口ip<br>然后不出意外就安装成功了</p><h3 id="安装openwrt"><a href="#安装openwrt" class="headerlink" title="安装openwrt"></a>安装openwrt</h3><p>将电脑网口连接到pve管理口,设置ip和pve同一网段<br>浏览器输入ip:8006<br>用户名root,密码是刚刚设置的<br>然后设置网卡,点击创建,选择桥接,按照vmbr+1的顺序填写名称,桥接端口写网卡名称,最后点应用配置<br><img src="/images/router/6.png"><br>右键创建虚拟机,下一步<br>操作系统选不使用任何介质<br><img src="/images/router/7.png"><br>系统这里全部默认下一步<br>磁盘这里看你需要添加<br>cpu这里看你需求分配,类型建议选host,看起来舒服一点<br><img src="/images/router/8.png"><br>内存这里看你需求分配<br>网络先选vmbr0(管理口),后面的等下再添加<br><img src="/images/router/9.png"><br>最后确认一下安装<br>安装完成后添加网络设备(把你主机的网口都填进去)<br><img src="/images/router/10.png"><br>然后把openwrt的镜像上传到pve,执行这串命令</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">qm importdisk vmid imgPath local-lvm</span><br></pre></td></tr></table></figure><p>请注意替换vmid和imgPath<br>然后在硬件里有一个未使用的磁盘,添加进去<br>选项里找到启动顺序 拖到第一位并打勾<br><img src="/images/router/11.png"></p><h1 id="wifi"><a href="#wifi" class="headerlink" title="wifi"></a>wifi</h1><p>要解决wifi有两种主流方式 </p><ol><li>下接路由器 </li><li>无线网卡</li></ol><p>这里选择下接路由器,1是可以发射wifi,2是可以拓展网口,3是因为无线网卡有很多不稳定因素<br>立马pdd下单了一个ax1800(jcg q20)来玩了一下<br><img src="/images/router/12.png"><br>结果这路由器似乎和我软路由天生不合,直连光猫就正常,连我软路由就死活只有百兆,没办法,又去下单了一台ax3000来玩玩(rax3000qy)<br><img src="/images/router/13.png"><br>这台就正常了,连上软路由,设置成ap模式(不然nat层数就太多了),测试无线大概可以跑900m左右,有线基本跑满千兆,还算可以 </p><h1 id="尾语"><a href="#尾语" class="headerlink" title="尾语"></a>尾语</h1><p>最后附上一张我家的网络结构图<br><img src="/images/router/14.png"></p>]]></content>
</entry>
<entry>
<title>记录一次github封号</title>
<link href="/2024/10/17/github%E5%B0%81%E5%8F%B7/"/>
<url>/2024/10/17/github%E5%B0%81%E5%8F%B7/</url>
<content type="html"><![CDATA[<h1 id="github莫名被封"><a href="#github莫名被封" class="headerlink" title="github莫名被封"></a>github莫名被封</h1><h2 id="10-14号我的一个仓库莫名被改名-然后多了一条修改我readme的commit然后就封号了-具体表现为别人看不见我的任何仓库-关于我的任何东西都无法访问"><a href="#10-14号我的一个仓库莫名被改名-然后多了一条修改我readme的commit然后就封号了-具体表现为别人看不见我的任何仓库-关于我的任何东西都无法访问" class="headerlink" title="10.14号我的一个仓库莫名被改名,然后多了一条修改我readme的commit然后就封号了(具体表现为别人看不见我的任何仓库,关于我的任何东西都无法访问)"></a>10.14号我的一个仓库莫名被改名,然后多了一条修改我readme的commit<br><img src="/images/github%E8%A2%AB%E5%B0%81/1.png"><br>然后就封号了(具体表现为别人看不见我的任何仓库,关于我的任何东西都无法访问)<br><img src="/images/github%E8%A2%AB%E5%B0%81/2.png"></h2><h1 id="后续"><a href="#后续" class="headerlink" title="后续"></a>后续</h1><p>20241023:此时提交工单已经一周,没有得到任何回复<br>20241025:github支持终于回复,解封了账号</p><h1 id="so-github-fuck-you"><a href="#so-github-fuck-you" class="headerlink" title="so,github fuck you!"></a>so,github fuck you!</h1>]]></content>
</entry>
<entry>
<title>优雅的回怼杠精</title>
<link href="/2024/10/07/huiduigangjing/"/>
<url>/2024/10/07/huiduigangjing/</url>
<content type="html"><![CDATA[<h1 id="优雅的回怼杠精"><a href="#优雅的回怼杠精" class="headerlink" title="优雅的回怼杠精"></a>优雅的回怼杠精</h1><h2 id="经过"><a href="#经过" class="headerlink" title="经过"></a>经过</h2><p>了解jvm的童靴都知道jvm的实现大都是cpp,这时候杠精(KyuubeeOwO,以下简称nt)就上线了<br>看了一下它的动态似乎是个资深杠精(几年前就已经发病,还重伤了几位同胞)<br><img src="/images/huiduigangjing/2.png"><br><img src="/images/huiduigangjing/3.png"><br>它的评论:<br><img src="/images/huiduigangjing/1.png"><br>把人家的编译脚本仓库链接放上去了,还说无cpp,这能有cpp就怪了<br>后面有人把hotspot的源码链接扔上去了,它都能说出13%的cpp这种鬼话(这个cpp占用是基于整个仓库的,不是hotspot的)<br>我说了一句这是业界公认的,好家伙,猜猜人家回的啥 </p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">nt:你这还是没拿出依据,纯粹在用嘴说。你说的研发团队有哪些,哪里能看到这些研发团队关于jvm用cpp的言论?业界公认的依据是什么?哪个业界,在哪里公认的?</span><br><span class="line">我认可别人的回复,因为别人给了github的地址,仓库拥有者确实是eclipse基金会的</span><br></pre></td></tr></table></figure><p>by:这里我对公认可能是有点误解(正确解释应该就是大部分人都认为,其实最后发现,无论我怎么理解都是错的,nt有一套自己独立的认知): 以下我的原话</p><blockquote><p>公认不仅仅是大部分人,而是有信服力的人,例如研发团队之类的,照你这么说那你怎么知道他发的库真的,而不是高仿伪造,你有下载编译运行过?这种业界公认的事实你却让人拿依据,这是杠精 </p></blockquote><p>这是我对它对我的提问的浓缩回答:</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">muchen:那我重新给你理一遍,公认(证明这件事情是公认):你去互联网搜99%都是jvm是cpp实现的,依据(证明公认是事实)hotspot的源码。满意了?</span><br></pre></td></tr></table></figure><p>猜猜人家说啥?</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">我认为搜出来结果不能说明代表了大多数。有可能代表了大多数,也有可能没代表</span><br></pre></td></tr></table></figure><p>我寻思这不纯杠精吗,后面认真的回了几句发现跟这玩意沟通不进去,就开始回怼了(目前杠精已经沉默)</p><h2 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h2><p>它不讲理,我们也不要讲理,说的话比它更不符合逻辑<br><del>意大利面就应该拌42号混凝土</del><br>不要认真,用表面无理的话回怼,最主要就是不要认真,这种杠精好像还不会拉黑你?似乎以拉黑为耻?<br>就是说杠精和我们必须崩溃一个,看谁的精神状态好<br>by:不要被这种杠精的逻辑带进去,也就是不要认真,一旦被带进去就会越想越气,最后红温破防(bushi(doge</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ol start="0"><li>以其人之道,还治其人之身</li><li>不要认真,不要气</li></ol>]]></content>
</entry>
<entry>
<title>解决安卓14不受信任的触摸事件被屏蔽</title>
<link href="/2024/09/27/%E5%8D%A1%E5%B1%8F/"/>
<url>/2024/09/27/%E5%8D%A1%E5%B1%8F/</url>
<content type="html"><![CDATA[<h1 id="解决安卓14不受信任的触摸事件被屏蔽-卡屏"><a href="#解决安卓14不受信任的触摸事件被屏蔽-卡屏" class="headerlink" title="解决安卓14不受信任的触摸事件被屏蔽(卡屏)"></a>解决安卓14不受信任的触摸事件被屏蔽(卡屏)</h1><blockquote><p>前言: 因为安卓12新增了<a href="https://developer.android.com/about/versions/12/behavior-changes-all?hl=zh-cn#untrusted-touch-events">不受信任的触摸事件被屏蔽</a>,但是官方给出的解决方法在安卓14无效,故写此工具</p></blockquote><h1 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h1><p>hook InputDispatcher::isTouchTrustedLocked(这是安卓系统判断是否屏蔽触摸的),使其一直返回true</p><h1 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h1><p>isTouchTrustedLocked这个方法是在libinputflinger.so这个动态库里的,我们把这个so拖到ida,找出这个方法的导出符号,然后hook就行</p><h1 id="注"><a href="#注" class="headerlink" title="注"></a>注</h1><ol><li>这个服务是由system_server启动的,请注入到system_server再hook</li><li>这个方法并不通用,部分机型不可用..</li></ol>]]></content>
</entry>
<entry>
<title>安卓纯native层模拟手指触摸</title>
<link href="/2024/09/27/%E6%A8%A1%E6%8B%9F%E8%A7%A6%E6%91%B8/"/>
<url>/2024/09/27/%E6%A8%A1%E6%8B%9F%E8%A7%A6%E6%91%B8/</url>
<content type="html"><![CDATA[<h1 id="安卓纯native层模拟手指触摸"><a href="#安卓纯native层模拟手指触摸" class="headerlink" title="安卓纯native层模拟手指触摸"></a>安卓纯native层模拟手指触摸</h1><blockquote><p>前言: 写此项目主要是因为市面上好像并没有一个像样的模拟触摸工具(不与手指触摸冲突.有人维护并且开源)<br><br>其实这个项目去年就写完了,但是还是突然想记录一下…</p></blockquote><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><p>本来想的很简单,用uinput模块创建驱动并提交事件,但是写完了才发现并没有这么简单,一但手指触摸和虚拟触摸同时存在就会冲突<br></p><p>然后又想着可否把真实的触摸给屏蔽掉,与虚拟触摸进行融合,然后在虚拟设备中统一提交?<br><br>说干就淦!</p><h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><h3 id="初始化屏幕信息"><a href="#初始化屏幕信息" class="headerlink" title="初始化屏幕信息"></a>初始化屏幕信息</h3><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">touch::InitScreenInfo</span><span class="params">()</span></span><br><span class="line">{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">string</span> window_size = exec(<span class="string">"wm size"</span>);</span><br><span class="line"> <span class="built_in">sscanf</span>(window_size.c_str(), <span class="string">"Physical size: %dx%d"</span>, &this->screenInfo.width, &this->screenInfo.height);</span><br><span class="line">}<span class="comment">//初始化屏幕分辨率,方向单独放在一个线程了</span></span><br></pre></td></tr></table></figure><h3 id="初始化触摸屏信息"><a href="#初始化触摸屏信息" class="headerlink" title="初始化触摸屏信息"></a>初始化触摸屏信息</h3><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">touch::InitTouchScreenInfo</span><span class="params">()</span></span><br><span class="line">{</span><br><span class="line"> <span class="type">bool</span> isFound{<span class="literal">false</span>};<span class="comment">//是否已经找到了一个疑似触摸屏的设备</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">const</span> <span class="keyword">auto</span> &entry: <span class="built_in">std</span>::filesystem::directory_iterator(<span class="string">"/dev/input/"</span>))</span><br><span class="line"> {</span><br><span class="line"> <span class="type">int</span> fd = open(entry.path().c_str(), O_RDWR);</span><br><span class="line"> <span class="keyword">if</span>(fd < <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span><<<span class="string">"打开"</span><<entry.path()<<<span class="string">"失败"</span><<<span class="built_in">std</span>::<span class="built_in">endl</span>;</span><br><span class="line"> }</span><br><span class="line"> input_absinfo absinfo{};</span><br><span class="line"> ioctl(fd, EVIOCGABS(ABS_MT_SLOT), &absinfo);</span><br><span class="line"> <span class="keyword">if</span> (absinfo.maximum == <span class="number">9</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(!isFound)</span><br><span class="line"> {</span><br><span class="line"> isFound = <span class="literal">true</span>;</span><br><span class="line"> this->touchScreenInfo.fd = open(entry.path().c_str(), O_RDWR);</span><br><span class="line"> close(fd);</span><br><span class="line"> <span class="keyword">if</span>(touchScreenInfo.width == <span class="number">0</span>||touchScreenInfo.height == <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> input_absinfo absX{}, absY{};</span><br><span class="line"> ioctl(touchScreenInfo.fd, EVIOCGABS(ABS_MT_POSITION_X), &absX);</span><br><span class="line"> ioctl(touchScreenInfo.fd, EVIOCGABS(ABS_MT_POSITION_Y), &absY);</span><br><span class="line"> <span class="keyword">if</span>(absX.maximum!=<span class="number">0</span>&&absY.maximum!=<span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> this->touchScreenInfo.width = absX.maximum;</span><br><span class="line"> this->touchScreenInfo.height = absY.maximum;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(touchScreenInfo.width == <span class="number">0</span>||touchScreenInfo.height == <span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> input_absinfo absX{}, absY{};</span><br><span class="line"> ioctl(fd, EVIOCGABS(ABS_MT_POSITION_X), &absX);</span><br><span class="line"> ioctl(fd, EVIOCGABS(ABS_MT_POSITION_Y), &absY);</span><br><span class="line"> <span class="keyword">if</span>(absX.maximum!=<span class="number">0</span> && absY.maximum!=<span class="number">0</span>)</span><br><span class="line"> {</span><br><span class="line"> this->touchScreenInfo.width = absX.maximum;</span><br><span class="line"> this->touchScreenInfo.height = absY.maximum;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> ioctl(fd, EVIOCGRAB, <span class="number">0x1</span>);<span class="comment">//独占输入,只有此进程才能接收到事件 -_-</span></span><br><span class="line"> threads.emplace_back(&touch::PTScreenEventToFingerByFd,this,fd);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }<span class="comment">//遍历/dev/input/下所有eventX,如果ABS_MT_SLOT为9(即最大支持10点触控)就视为物理触摸屏</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>这样写是因为ABS_MT_SLOT为9的设备在部分设备上好像不止一个……</p><h3 id="转换"><a href="#转换" class="headerlink" title="转换"></a>转换</h3><h4 id="把物理触摸信息转换为touchOBJ"><a href="#把物理触摸信息转换为touchOBJ" class="headerlink" title="把物理触摸信息转换为touchOBJ"></a>把物理触摸信息转换为touchOBJ</h4><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">touch::PTScreenEventToFinger</span><span class="params">()</span></span><br><span class="line">{</span><br><span class="line"> input_event ie{};</span><br><span class="line"> <span class="type">int</span> latestSlot{};</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line"> {</span><br><span class="line"> read(touchScreenInfo.fd, &ie, <span class="keyword">sizeof</span>(ie));</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (ie.type == EV_ABS)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (ie.code == ABS_MT_SLOT)</span><br><span class="line"> {</span><br><span class="line"> latestSlot = ie.value;</span><br><span class="line"> Fingers[<span class="number">0</span>][latestSlot].TRACKING_ID = <span class="number">114514</span> + latestSlot;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (ie.code == ABS_MT_TRACKING_ID)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (ie.value == <span class="number">-1</span>)</span><br><span class="line"> {</span><br><span class="line"> Fingers[<span class="number">0</span>][latestSlot].isDown = <span class="literal">false</span>;</span><br><span class="line"> Fingers[<span class="number">0</span>][latestSlot].isUse = <span class="literal">false</span>;</span><br><span class="line"> } <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> Fingers[<span class="number">0</span>][latestSlot].isUse = <span class="literal">true</span>;</span><br><span class="line"> Fingers[<span class="number">0</span>][latestSlot].isDown = <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (ie.code == ABS_MT_POSITION_X)</span><br><span class="line"> {</span><br><span class="line"> Fingers[<span class="number">0</span>][latestSlot].x = ie.value;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (ie.code == ABS_MT_POSITION_Y)</span><br><span class="line"> {</span><br><span class="line"> Fingers[<span class="number">0</span>][latestSlot].y = ie.value;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (ie.type == EV_SYN)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (ie.code == SYN_REPORT)</span><br><span class="line"> {</span><br><span class="line"> upLoad();</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="把touchOBJ转为触摸信息并提交"><a href="#把touchOBJ转为触摸信息并提交" class="headerlink" title="把touchOBJ转为触摸信息并提交"></a>把touchOBJ转为触摸信息并提交</h4><figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">touch::upLoad</span><span class="params">()</span></span><br><span class="line">{</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">vector</span><input_event> events{};</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">auto</span> &fingers: Fingers)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">auto</span> &finger: fingers)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (finger.isDown)</span><br><span class="line"> {</span><br><span class="line"> input_event down_events[]</span><br><span class="line"> {</span><br><span class="line"> {.type = EV_ABS, .code = ABS_MT_TRACKING_ID, .value = finger.TRACKING_ID},</span><br><span class="line"> {.type = EV_ABS, .code = ABS_MT_POSITION_X, .value = finger.x},</span><br><span class="line"> {.type = EV_ABS, .code = ABS_MT_POSITION_Y, .value = finger.y},</span><br><span class="line"> {.type = EV_SYN, .code = SYN_MT_REPORT, .value = <span class="number">0</span>},</span><br><span class="line"> };</span><br><span class="line"> <span class="type">int</span> arrCount = <span class="keyword">sizeof</span>(down_events) / <span class="keyword">sizeof</span>(down_events[<span class="number">0</span>]);</span><br><span class="line"> events.insert(events.end(), down_events, down_events + arrCount);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> input_event touchEnd{};</span><br><span class="line"> touchEnd.type = EV_SYN;</span><br><span class="line"> touchEnd.code = SYN_MT_REPORT;</span><br><span class="line"> touchEnd.value = <span class="number">0</span>;</span><br><span class="line"> events.push_back(touchEnd);</span><br><span class="line"> input_event end{};</span><br><span class="line"> end.type = EV_SYN;</span><br><span class="line"> end.code = SYN_REPORT;</span><br><span class="line"> end.value = <span class="number">0</span>;</span><br><span class="line"> events.push_back(end);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">const</span> <span class="keyword">auto</span> &event: events)</span><br><span class="line"> {</span><br><span class="line"> write(uinputFd, &event, <span class="keyword">sizeof</span>(event));</span><br><span class="line"> }</span><br><span class="line"> events.clear();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="BY"><a href="#BY" class="headerlink" title="BY"></a>BY</h2><p>有几点可能要说一下<br><br>1.最后提交的时候是使用的多点触控a协议,因为b协议我写出来有bug,没找出哪里的原因,发现linux内核同时支持ab,索性就用a了<br><br>2.效率略低,有很大优化空间<br><br>3.<a href="https://github.com/muchenspace/android_virtualTouch">开源地址</a></p>]]></content>
</entry>
</search>