偶然发现在小米开发版系统上装的app应用,其webview的debug模式是打开的!!!

那么也就是说以后不管是qq,淘宝,只要是他们用了webview都可以直接在chrome中远程调试线上代码了的。

好处不用多说,直接搞起来。

刷机步骤

以我的nexus 7 为例。

  1. 首先需要解锁设备

  2. 然后准备好小米开发版系统,我在rom基地下的Google Nexus 7(第二代)刷机包 官方MIUI V5 4.8.22 开发版

  3. PC端下载刷机精灵,之后的操作就很简单了,按着刷机精灵的步骤来。

效果

nexus上已经是小米的系统了。

xiaomisystem

在nexus上打开了qq,淘宝和电视淘宝的app, 直接可以在chrome中debug。

removedebug

安卓设备解锁和不解锁有什么区别?

手机加锁是因为在出厂时,厂商已经安装好了操作系统和预置应用,这些东西都装在手机ROM中。
为了防止意外情况,比如不慎删除了系统重要应用导致系统不稳定甚至崩溃,因此厂商对ROM加了锁使你不能对系统文件做任何动作。
这就影响了后续的root和刷机。所以在刷机前一般都要先解锁。

解锁过程

  1. 下载解压nexus_unlock

  2. Nexus 7 USB连接电脑,打开开发者选项,然后关机。

  3. 再同时按住音量-键和电源键进入fastboot模式。

  4. 运行解锁.bat,nexus7中出现是否要解锁的界面,选择yes。

  5. 解锁完成后,再开机,可以看到google下面有个解开的锁,就表明解锁完成了。

图片步骤

fastboot mode
bootlock
bootunlock

场景

本地有修改,暂时不想commit,但又必须git pull 拉去最新的代码。这时可以用git stash来缓存当前的修改。

步骤

1 先缓存当前修改。

git stash

2 拉取最新的代码

git pull

3 拉完最新的之后再恢复之前修改

git stash pop

更多

git stash save “work in progress for foo feature”

当你多次使用 git stash命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,

git stash list命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,

例如使用 git stash apply stash@{1}就可以将你指定版本号为stash@{1}的工作取出来,

当你将所有的栈都应用回来的时候,可以使用 git stash clear来将栈清空。

参考

git stash和git stash pop

场景

修改了四个文件,分别涉及到两个功能,需要把其中两个文件的修改当做一个功能的commit,另外两个文件的修改当做另一个功能的commit。

但如果要用git add 的命令,会让当前所有的修改都加入commit。

怎么办呢?

用git stash 命令

步骤

1 用git add 命令添加第一个commit需要的文件

git add file1

git add file2

2 隐藏其他修改,git stash 的参数中 -k 开关告诉仓库保持文件的完整 -u 开关告诉仓库包括无路径的文件(那些新的和未添加到git的)
这时git status就只能看到file1 和file2,并且当你切换到实际的文件目录,file3 和file4的修改也随之不见。

git stash -k -u

3 提交第一个commit

git commit -m 'submit function1'

4 恢复之前隐藏的修改,这时再git status,file3和file4的修改又回来。

git stash pop

5 提交第二个commit

git commit -m 'submit function2'

参考

http://www.open-open.com/lib/view/open1413852243809.html

这两天被这个异常搞死了:

java.lang.UnsatisfiedLinkError:dlopen failed: “**/*/arm/*.so” has unexpected e_machine: 3

原因是一个在x86机器编译的so文件放到了arm机器上。

apk安装时,系统把armeabi下的so动态库都放入应用的私有目录中了。
但这个so不是arm的,而是x86编译的。
所以运行时,系统检察ELF文件中的e_machine字段的值,跟arm的不匹配,就会抛出这个异常了!

参考资料:精神哥讲Crash(一):UnsatisfiedLinkError

问题描述

Android真机调试的时候,出现ADB server didn’t ACK,明明设备已经连接上,开发者选项也打开了。

原因

cmd,启动adb服务发现启动失败。

adb失败

看下为什么会失败。

adb nodaemon server

nodaemonserver

原来是端口被占用了。

找到占用端口的进程,杀掉,重启adb server

netstat -aon|findstr "5037"

adbstart

Note:

转自百度经验

Jade,Swig,Handlerbar,UnderScore,Ejs

先占个坑,晚上填

思路

url中的参数都是以[&]name=value的形式带在url后面的,而location.search中可以拿到url中?之后的字符串(包括?在内)。

那么通过处理location.search的字符串,即可得到想要的参数。

我们用正则匹配的方式,给一个参数name,求它的value。

function getQueryString(param){
    var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
    var r = window.location.search.substr(1).match(reg);
    if (r != null) {
        return unescape(r[2]);      
    }
    return null;
}

这个正则是找以 &name 或者 name 为开头,以 =value& 或者 =value 结尾的字符串,忽略大小写,一次匹配不循环。

以 a=2&b=3&c=4 为例子.

当name=a时:

r= ["a=2&","","2","$"]

当name=b时:

r = ["&b=3&","&","3","&"]

当name=c时:

r = ["&c=4","&","4",""]

match的用法

match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。

这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。

如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。

该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。

除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。

题目

LeetCode:Longest Common Prefix

找出一个字符串数组中所有元素的最长公共前缀。

思路

先找出这个数组中最短的字符串,然后再遍历数组比较这个最短字符串是否当前元素的前缀。
如果是的话,比较下一个数组元素。
如果不是的话,最短字符串截断最后一位再和当前数组数组元素比较,直到最短字符串长度为0.

实现

JavaScript:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if(strs.length===0){
        return "";
    }
    var shortestStr=strs[0];
    //找出最短的字符串
    for(var i =1; i<strs.length;i++){
        if(strs[i].length<shortestStr.length){
            shortestStr = strs[i]
        }
    }
    //判断最短字符串是否是当前元素的前缀
    for(i=0;i<strs.length;i++){
        while(shortestStr.length>0) {
            if (strs[i].indexOf(shortestStr) === 0) {
                break;
            } else {
                shortestStr = shortestStr.substring(0,shortestStr.length-1);
            }
        }
    }
    return shortestStr;
};

耗时

Runtime