精华内容
下载资源
问答
  • 希望给予应届生一点启示-一年的工作,我找到自己定位.docx
  • 如何快速定位自己热爱的工作

    万次阅读 多人点赞 2015-10-26 07:16:42
    你喜不喜欢软件开发?不喜欢的话怎么找到你热爱的其它工作?提供一个行之有效实战方法,快速找到定位

    定位
    我前几天发了篇文章,“月薪3万的程序员都避开了哪些坑”,有很多朋友看了,反馈很多,我汇总了一下,有两方面的意见比较突出:

    • 文中说的都是大道理,妇幼皆知,知易行难
    • 不喜欢开发,怎么去找自己热爱的事业

    感谢所有反馈的朋友,让我加深了对这些问题的认识,我决定再写几篇文章来谈相关的问题。这篇文章要谈的,是怎样判断你是否喜欢软件开发以及怎么去找自己热爱的事业

    庄子与惠子游于濠梁之上。
    庄子曰:“儵鱼出游从容,是鱼之乐也。”
    惠子曰:“子非鱼,安知鱼之乐?”
    庄子曰:“子非我,安知我不知鱼之乐?”
    惠子曰:“我非子,固不知之矣;子固非鱼也,子之不知鱼之乐,全矣。”
    庄子曰:“请循其本。子曰‘汝安知鱼之乐’云者,既已知吾知之而问我,我知之濠上也。”

    庄子和惠子的这段话很多人都有印象,其中最广为人知的,可能是“子非鱼,安知鱼之乐”,大概意思是不要总是以自己的眼光看待他人。

    其实我的理解和庄子类似,就软件开发而言,我认为可以从精神状态对应的外在表现看出一个人是否喜欢软件开发。但从另一方面来讲,我又支持惠子,我觉得我很难去揣测别人怎么判断他是否喜欢自己的工作。因为每个人的经历、学识、家庭背景等都是不同的,这决定了每个人看待问题的角度都不同,做事的方法也千差万别。我可以观察到一个人是否喜欢软件开发工作,但却不能臆测背后的原因,我能做的,只能是从我自己的经验出发来总结一些我认为可行的判断方法,抛砖引玉。

    关注自己的感受

    喜不喜欢是主观的,是感情、情绪方面的,是一种感受,要了解自己对一件事情的感受,可以通过各种问题问自己做这件事时的感觉,然后分析一下就能知道是否喜欢。下面是我总结的几个问题,通过问自己这些问题,我可以判断我是否真的喜欢软件开发工作。

    • 写代码让你觉得时光飞逝如箭还是一秒犹如一万年?
    • 看到代码是否有“似曾相识燕归来”的温暖?
    • 隔一段时间不写代码,是否会充满怀念,有想打开IDE写点什么的冲动?
    • 是否经常有这样的时刻:看着自己的代码,有种“相看两不厌,唯有敬亭山”的喜悦?
    • 有没有那么一些时候,你看着自己的代码,会不自觉地想:这里或那里改改是不是更好一些?
    • 当你看到令人眼前一亮的App或网站或其它软件,会不会发出“要是我来做该怎么做”之类的问题?
    • 你有没有想让别人阅读你代码的冲动?
    • 你有没有读别人代码的冲动(想看到更好的代码)?
    • 别人指出Bug、错误或设计瑕疵,你会生气、拒绝还是接纳感激?
    • 修复一个Bug,你是为这个Bug被解决掉高兴多一些还是为你的代码(软件)更完美而高兴多一些?
    • 听到新语言、新框架、新系统、开发者大会等相关的消息,你是很想了解还是懒得搭理?
    • 有技术大咖在你身边出现时,想去结交还是懒得理他?
    • 看见别人的烂代码,你是吐糟真TM烂然后绕过还是想怎么改好?
    • 看见别人的优秀代码,会不会羡慕,会不会“想要是我也能写出这么漂亮的代码就好了”?
    • 当你完成一个模块、功能、系统,解决一个问题时,是有“快感”、“成就感”还是有“终于交差了”的感觉?
    • 想到你开发的软件可以帮助别人解决问题带来好处你是否感到期待、兴奋?
    • 你是否想建立属于自己的软件资源(比如工具、类库)?
    • 你是不是像蜜蜂一样总是把看到的与软件相关的好东西收藏起来?

    可能还有很多问题都能帮助我们发现自己是否喜欢编码,是否喜欢软件开发,不能一一列出,欢迎感兴趣的朋友补充。

    也许有人觉得“我的每一行代码都是诗,哪怕它们不能Run”,觉得自己超喜欢真是好好喜欢啊,然而章鱼哥早已看透了一切:这厮不但是个自恋狂,还叶公好龙。

    我们的问题,是针对已经变身为程序员的兄弟姐妹们的。对于准备从事软件开发工作还没进场的朋友们并不适用。这就好比“你问一个从来没kiss过的人喜不喜欢kiss,问一个从来没XXOO过的人喜不喜欢XXOO”一样,有些事必须得亲身体验了才能知道是否喜欢,理性的分析是木有毛用的。

    怎么快速找到找自己热爱的事业

    前面我提供了一些问题,用来测验是否喜欢软件开发工作。假如你不喜欢,那么接着往下看,必有所获。

    我在我的微信订阅号“程序视界”的每周一书栏目里推荐过一本书,书名是《A Life At Work(这辈子,我最想做的事)》(订阅号内回复10007可查看)。这本书非常棒,从soul出发,系统地介绍了找到终身事业的理论和方法,推荐一看。

    除了书,我这里提供一个非常简单快捷又相当有效的方法,也可以让你思索怎么找到自己热爱的事业。

    从“不想要什么”开始

    很多人会说,“我不知道自己想要什么”,OK,是这样,这很正常,我自己也是不断实践不断思考才慢慢知道自己想要什么想干什么。

    你不知道自己想要什么,这没什么关系,这是很正常的事情。但假如你想知道自己想要什么,非常想,真的想,那可以从一个问题开始:我最不能忍受的是什么

    OK,这是一个很好的开始:当你越清楚自己“不想要什么”的时候,就越能快速接近“想要什么”

    现在,找两张白纸,一支笔,让我们开始。

    两张纸顶端对齐放在书桌上,给左边的纸写上标题“不想要清单”,给右边的纸上写上标题“想要清单”。然后,我们先来完成“不想要清单”。

    比如你是一个程序员,你的“不想要清单”可能是这样的:

    • 我不想天天困在电脑前
    • 我不想老是加夜班上线新系统
    • 我不想周末和节假日接工作电话
    • 我不想老重复做一个东西
    • 我不想一成不变地老看着这么几个队友
    • 我不想月月拿死工资
    • 我不想月光
    • 我不想被女朋友说我一辈子就这样了
    • 我不想被人指使
    • 我不想有Bug时被批评
    • 我不想产品经理老TM改需求
    • 我不想老是延期交付老是被老板说无能
    • 我不想和一帮没水平的家伙共事
    • 我不想在Level太Low的领导下干活
    • ……

    也许还有其它的,嗯,必然还有其它的。自行脑补吧,每个人都不一样。你可以不看我上面列的单子,列你自己的,对,说你呢,别往下看了,拿张纸来列一列。

    如何得出想要什么

    现在我们要来完成“想要清单”,方法也很简单,对着“不想要清单”,一条一条来找下面的内容:

    • 对立面是什么
    • 你之所以不想要的背后原因
    • 这一条对应的情感诉求是什么

    按照这些东西,一一找找看,然后大多数人就能完成“想要清单”。比如我们上面的不想要清单对应的想要清单可能是这样的:

    • 我想要接触更多的人
    • 我想要作息规律的工作
    • 我想要不断挑战新东西,想要成就感
    • 我想要未来越来越有希望,比如职位不断晋升、收入规模上升之类
    • 我想要更高的收入
    • 我想要更被尊重
    • 我想要和牛人一起工作
    • 我想要和高水平的领导共事
    • ……

    “想要清单”可能很长,一个不想要可能衍生出多个想要;也可能很短,因为多个“不想要的东西”可能会指向同一个“想要的东西”。没关系,只管做下去

    一旦你分析出了“想要清单”,就可以进行下一步了。

    成就事件

    再找一张白纸来,写上“成就事件”作为标题,然后把纸放到“想要清单”右边。好啦,现在来回忆你的工作生涯中那些让充满热情、真诚投入、感到愉悦的时刻吧。

    每个人都会有一些因为有成就感而开心的时刻,比如你帮助客户解决问题后很开心,比如你给同事讲解了一门技术课程反馈不错你很开心,比如你卖出去了一部手机很开心,比如你写了篇文章很开心,比如你做了一道菜很高兴,比如你画了一幅画很自豪,比如你自己完成了一个App很高兴……很多,用心回忆,一定可以找出来。

    在寻找成就事件时,重点关注那些“即便没有物质回报也愿意投入去做的事”。这些事就是你感兴趣的,能给你带来成就感的,能让你有归属感的,很可能它们当中就有某件事会成为你终身热爱的事业。另外也请特别关注“做好了给你带来愉悦和成就感的事”。

    一旦你列出了那些成就事件,就停下来,把即便没有物质回报也愿意投入去做的事特别标注出来。现在可以休息一下了,待会还有更耗神的事儿做。

    寻找你想做的事

    好,现在把你的成就事件清单和“想要清单”来比对,看哪个成就事情与你的想要清单中的事项能联系起来。

    如果没有能联系起来的,那好奇怪啊——那些曾让你感到有成就感的事、开心的事,居然和你“想要的什么”都没什么关系。如果是这种结果,那可能你分析得还不够,回头再分析一下不想要清单、想要清单、成就事件清单。

    反复来,直到能建立联系。

    噢天,如果你真的真的没办法建立联系,好了,改天再来试吧。

    你到了这里,说明已经找到了你想要的什么与让你开心的事之间的联系了。太好了,把你找到的那些事件、那些时刻单独挑出来,仔细分析,看看哪些事可以作为你的事业来做。假如你找到的不是一个可以当做事业(职业、工作)来做的事情,那就进一步分析这个时刻:

    • 为什么那时我会喜悦?
    • 这样的时刻是或然的还是必然的?
    • 这样的时刻可能出现在哪些工作、职业、事业中?
    • 这样的时刻怎样才能重复?

    通过不断的发问、分析,你可以找到一个热爱的、乐意做的事情、工作。假如找不到,你的工作也不会白费——找不到可能是由于你没有使用正确的方法、不了解其它职业或自我意识能力稍差,而不是没有适合你的事业。这个时候,你有两种选择:

    • 改天再重复这个过程,死磕自己
    • 找职业规划师聊聊

    我的建议是等一段时间再重复,如果重复几次都不能找到自己想做什么,那就找职业规划师聊聊。职业规划师有很多方法论和分析工具,可以帮助你梳理自己,找到你想做的事。

    去做你想做的事

    然而,无论你自己找到方向,还是职业规划师帮你找到方向,这都仅仅是第一步:定位。接下来的事情更为重要:假如你的方向与你现在的工作不符,你能不能真的放弃现在的工作,去做你想做的事。因为离开现在的工作,很可能就会失去收入来源,生活质量会下降;并且你找到的事,真的去做了,可能也会遇到各种各样的不美好,可能最终又发现不是你想要的。然而,只有亲身去体验了,你才能验证你的分析,才能真的找到你想要的。

    如果你犹疑不定,无法成行,还有一个测试可以帮助你思考,下结论。

    诺,先看人们在考虑工作时会考虑的9种基本因素:

    • 工资高,福利好
    • 工作环境(物质方面)舒适
    • 人际关系良好
    • 工作稳定有保障
    • 能提供较好的受教育机会
    • 有较高的社会地位
    • 工作不太紧张、外部压力少
    • 能充分发挥自己的能力特长
    • 社会需要与社会贡献大

    然后,从上面的九种因素里,分别挑出对你来讲最重要的、次重要的、最不重要、次不重要的。一定要挑出来,挑不出来你就使劲死磕自己,死磕死了还挑不出来就算了。

    其实这样的测试是帮助你分析你最看重的东西。如果你说你真的挑不出来,那还是慢慢干你的软件开发吧,因为,很多时候产品经理也挑不出来哪个需求优先级最高,都重要,都紧急,对吧,是不是看起来和你很般配,你们再相互折磨折磨,也许到一定时候就能分析出你最看重的因素了。

    言归正传再绕回来吧,离开现有工作做你想做的事,其实是相当难的,需要勇气,也需要家人和朋友的支持,祝你早日迈出这一步。

    注:本文写于10月22日,文中的“成就事件”这种说法,原本我用的是“开心时刻”,周末参加了一个职业生涯的培训,10月26日早起做了一些修订,修改为更专业的说法。

    接下来我还想写一篇设定目标的文章和一篇执行的文章,不定什么时候,也许明天,也许后天,也许没个准信儿,但,大约在冬季,就会完成这两篇文章。


    更多精彩文章,参看“漫谈程序员”专栏。

    困惑、发展、加薪、升职、找工作、增值,尽在微信订阅号“程序视界”:

    程序视界

    展开全文
  • 好了小伙伴们,从今天开始,我们就要开始逐步地学习逆向工程的正确操作,包括快速定位,修改逻辑,插入代码等。前面的相关工具学习相当于牢固地基,接下来也正是需要建高楼...茫茫一望无际的Smali代码找到...

    好了小伙伴们,从今天开始,我们就要开始逐步地学习在逆向工程中的正确操作,包括快速定位,修改逻辑,插入代码等。前面的相关工具学习相当于牢固地基,接下来也正是需要建高楼的时候了。在接下来的讲解中我也会给大家介绍在逆向工程中实用的小技巧,一定要好好学习呀!

    在本篇博客中,你将会学习到如何快速定位到关键代码的相关知识和技巧,其核心技术点我这里总结一下就是:顺藤摸瓜!在茫茫一望无际的Smali代码中要找到我们想要的那段关键代码,如果你采用从头到尾捋逻辑,那难度无疑是大海捞针,工作量大得惊人,所以要想找到那个我们最终想要的“甜瓜”,掌握必要的快速定位技巧是不可或缺的!闲话少说,就让我们赶快开始今天的学习吧!

    想要顺藤摸瓜,我们还需要一个利器傍身,那就是在上篇博客中我们学习的ADM,设备监控器。目前在最新的Android Studio版本中,谷歌官方已经下架了Tools中的Android工具,使用最新版本的小伙伴可以看我上一篇博客中关于找不到ADM的解决办法。下面就让我们开始逆向解析的第一步,打开ADM设备监控器:这里首先要确保你的手机已经连接电脑

     在最左边一列显示的是目前手机中安装的所有应用列表,这里展示的是每一个应用的包名。中间下面部分是手机状态的实时输出,这里并不是我们关注的地方,最右边的OpenGL Trace View我们也不用管。看到中间部分的空白吗?这才是我们最关注的地方,当然我们现在还没有开始解析界面,所以这里空空如也~

    讲解还是需要一个例子,这里我使用百度手机助手来为大家演示。首先我们需要在最左边的应用列表中找到百度手机助手的包名:com.baidu.appsearch

    找到后进行点击,你会发现在最上面操作栏图标变为了可点击,而不再是灰色:

     下面我们就可以打开百度手机助手App,来到我们想要进行修改原有逻辑的地方,比如我这里想要修改百度手机助手里面对应用的评论操作,那么我就来到评论应用的界面,然后点击操作栏中的图标,接下来就会对该界面就行自动解析,解析完成你就会看到手机上的界面出现在中间位置:

    现在评论界面已经被解析展示出来了,这里博主说一句,所使用的百度手机助手版本为5.6.1,并不是最新的版本,所以评论界面和最新不同。ADM还是非常智能的,这里你根本不需要太多的复杂操作,只需要把鼠标在界面上移动,旁边就会随着移动自动展示鼠标下的布局或者控件,比如这里界面中”发表评论“是我们的关注点,所以我们把鼠标移动到发表评论位置:

    移动到之后点击一下就会锁定,然后我们在右边的显示框中就可以很清楚的看到这个布局的架构:整体使用的是RelativeLayout布局,里面嵌套了三个View控件和一个TextView控件,在右边的显示框中我们也是可以进行点击查看的,这里我们主要看的是控件的ID,ID值会在下面Node Detail的resource-id中展示,如果没有任何展示,说明该控件没有设定ID值。比如在上图中的View,下面Node Detail的resource-id中没有任何展示,说明该View没有设定ID,也就是告诉了我们,激发”发表评论“这个点击事件的并不是该View控件!因为要设定点击监听,肯定是要获取到该控件的。所以我们的目标就是在三个View控件和一个TextView控件要找到一个带有ID值的控件!

    最后我们会发现只有Text View控件有ID:

    通过 resource-id我们很清楚的就知道该ID值为app_content_btn_control_text,拿到了ID值我们下面就可以开始第二步,在smali代码中进行全局搜索该ID字符,看它在哪里被引用。

    这里进行全局搜索是在AndroidSudio中进行,这里我默认你会使用Android Studio进行全局搜索。打开全局搜索,输入ID值,如下图:

    这里并没有搜索到具体逻辑中的引用,很正常,回想一下在java代码中我们是如何获得一个控件的?通过R.id.xxx我们获取到该控件。在Java代码中我们可以直观的感受到这个字符被引用,那么这里是Smali代码,接近机器语言,在Smali代码中如果引用某一个资源,直接使用的是该资源所在的地址,这里为资源标识符,也就是在R.java文件中标识的地址。如下图所示:

    上图只是给大家展示一下例子,和我们教案对象无关。从上图中我们可以看到,每一个ID都在这里赋值了一块标识符,我们通过R.id.xxx访问到的是该资源所在的地址。findViewById ()方法自然也是根据这个地址找到该控件。那么这里我们进行全局搜索的对象应该为”发表评论“该Text View控件所在地址,Smali代码中在哪里引用了该地址,就说明这里引用了该Text View。地址也很明朗,我们直接去R.java文件中看看是谁就好了,在上面的全局搜索中已经找到了该ID在R.java文件中的位置:

    很清楚的看到该ID地址为”0x7f09025e“ ,下面我i们就把全局搜索对象改为”0x7f09025e“,再次进行搜索:

    果然如此,我们很快就获得了Text View的引用位置。public和R不用管,这两个都是实际的逻辑引用,剩下我们就发现有两个活动进行了引用,一个是LocalSystemAppRecycleActivity,一个是AppDetailsActivity,其中AppDetailsActivity引用次数最多,引用了三次,而LocalSystemAppRecycleActivity只引用了一次。这里我们还需要判断哪一个活动才是我们需要的关键代码呢?

     这里我们遵守一个原则:选多不选少。为什么?当一个资源在某一个类中被引用的次数比较多,我们就可以大概确定这个类是这个资源的消费类。毕竟被引用的目的只有一个,那就是使用它,被使用的次数越多,说明这个资源在这个类中起到的作用越大,对这个类也就越重要!同理,不单单指的是资源,也可以是一个变量值,一个类的对象,都遵守这个原则。

    当然也会出现多个类中引用次数一致的情况,对于这种情况我们就需要进行相关的动态调试了,在每个类引用处打上断点,然后进行调试,观察程序走进了哪几个类,注意程序执行的先后顺序,这样就很容易分辨得出具体消费类了。

    在本次教案用例中,我们使用选多不选少原则,判断AppDetailsActivity为主要的消费类,下面我们就可以直接进入AppDetailsActivity活动中,看看引用TextView控件地址的代码,这里为了方便下次解析阅读,建议找到关键代码后记得加上注释,Smali中加入注释关键符为”#“,而不是Java代码中的”//“或者”/**/“。这里我已经加上了注释”#发表评论的实例“。

    下面就是第三步,进行代码逻辑分析了。代码逻辑分析的目的就是找出最终的那段关键代码所在。我们通过第二步的全局搜索发现,在AppDetailsActivity活动中”发表评论“TextView控件被引用了三处,这三处分别都干了什么,以及”发表评论“这个TextView控件在活动中的声明是什么,我们一概不知请,所以只能开始代码的逻辑分析,找出关键代码所在!

    我们首先先看一下出现的第一处:

    ......(省略)
    ......(省略)
        invoke-virtual {v0, v5}, Landroid/view/View;->setVisibility(I)V
    
        iget-object v0, p0, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->v:Landroid/widget/TextView;
    
        if-nez v0, :cond_4
    
        const v0, 0x7f09025e#“发表评论”textView的实例
    
        invoke-virtual {p0, v0}, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->findViewById(I)Landroid/view/View;
    
        move-result-object v0
    
        check-cast v0, Landroid/widget/TextView;
    
        iput-object v0, p0, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->v:Landroid/widget/TextView;
    
        :cond_4
        iget-object v0, p0, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->v:Landroid/widget/TextView;
    
        const/4 v2, -0x1
    ......(省略)
    ......(省略)

    是不是感觉瞬间头都大了,卧槽这是什么啊?先别急,从上面的smali代码中我们能够得到一条非常有效的信息,那就是该TextView在活动中声明的情况!其中关键代码为:

    const v0, 0x7f09025e#“发表评论”textView的实例
    
        invoke-virtual {p0, v0}, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->findViewById(I)Landroid/view/View;
    
        move-result-object v0
    
        check-cast v0, Landroid/widget/TextView;
    
        iput-object v0, p0, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->v:Landroid/widget/TextView;

    还记得我们之前学习的Smali语法吗,这里就要派上用场了。首先const是赋值命令,这里把地址交给了v0寄存器,然后调用了findViewById()方法,把v0寄存器中的地址为参数值传进去,p0我们有说过,这里指的是”this“指针。然后接受一个返回值放入v0寄存器中。翻译成Java代码就是findViewById(R.id.xxxx)。执行了强转,也就是  (TextView)findViewById(R.id.xxxx),这是我们都很熟悉的。下面就进行了赋值,这里就可以看出具体赋值对象了,变量名为”v“。也就是说该TextView控件在该类中是变量v声明。翻译一下就是”this.v=(TextView)findViewById(R.id.app_content_btn_control_text)“。

    下面就需要jadx工具上场了,在jadx直接打开该Apk文件,打开AppDetailsActivity查看它的Java代码,不知道jadx使用方法的可以看我上一篇博客,打开后如下:

    在左边中直接点击v变量,就会自动定位到 该变量的声明处。下面我们就可以直接在jadx中查找变量v在该类中使用的情况,你可以直接快捷键”Ctrl+F“,就会打开搜索框,在里面输入”this.v“,就可以直接进行查看了:

    jadx的搜索功能和AndroidStudio的搜索比较相像,使用起来会让你很熟悉,记得勾选”标记全部“:

     

    这样颜色区分就会显示出来了,在代码中很明显就会看到! 那么我们就可以愉快的查找关键代码啦,目的是找到它的点击事件,要首先查找它注册点击事件的代码,也就是this.v.setOnClickListener();,可是你怎么也找不到,只能发现TextView在活动中设置了几次文本信息。这是怎么回事?难不成我们遗漏了什么?找错方向了?既然没有找到this.v.setOnClickListener();那就说明该TextView并没有设置点击事件,那么”发表评论“的点击事件到底是谁注册的?仔细想一下,我们还真的遗漏了一个,那就是RelativeLayout布局!赶快回去瞅瞅RelativeLayout布局:

    发现这个布局还真的设置了ID值 ,ID值为”app_content_btn_control_progress“,很好,那么下面就简单了,使用我们上面的三部曲,直接定位到该布局:

    发现别的类也引用了,但是我们不用管,因为上面我们已经明确的是AppDetailsActivity是具体的消费类, 所以直接进入AppDetailsActivity中引用布局的位置,代码为;

     const v0, 0x7f09020a
    
        invoke-virtual {p0, v0}, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->findViewById(I)Landroid/view/View;
    
        move-result-object v0
    
        check-cast v0, Lcom/baidu/appsearch/ui/ColorfulProgressBar;
    
        iput-object v0, p0, Lcom/baidu/appsearch/appcontent/AppDetailsActivity;->K:Lcom/baidu/appsearch/ui/ColorfulProgressBar;

    发现是变量k,这里你可能会疑问,不是RelativeLayout布局吗,怎么这里变成了ColorfulProgressBar?这里很明显的是,这个ColorfulProgressBar是百度自己写的一个自定义布局,继承的是RelativeLayout,不信我们可以去看一下:

    看见了吧,.这里指明了继承自 RelativeLayout布局。

    下面我们就通过jadx进行查找变量k是否注册了点击事件,发现还真的注册了,有三处:

     

    这里要注意下是,查找的时候要勾选区分大小写:

    因为这里是全混淆的代码,变量里面有大写的K和小写的k,这里我们要查找的变量值为大写的K。

    我们发现这里注册的事件分别是变量an,ao,c。我们可以看一下这三个变量都是什么:

    原来是Onclicklistener类。怪不得我们没有发现 AppDetailsActivity类继承了View.OnClickListener接口,原来这里的点击事件都是通过外部的接口实现的!

    至此我们整个快速定位的流程和学习就已经结束了。

    总结一下,三步走战略:

    1.通过ADM进行界面解析,找出相关布局或者控件的ID值;

    2.通过Android Studio对ID进行全局搜索,然后在R文件中获取该ID对应的地址,接着全局搜索该地址;找到后按照选多不选少的原则进行判断;

    3.对引用处的smali代码进行逻辑分析,找出关键变量;然后在jdax中进行查找,开始下面细致的分析工作。

    今天学习了这么多不知道你记住了多少,赶快消化消化今天的知识点,多多练习,相信你很快就会掌握的!

    本文到此结束,有需要引用的地方请标明出处,谢谢!有不懂的小伙伴可以评论留言,我会一一解答!

    展开全文
  • 桔妹导读:定位是所有LBS服务的基础服务。滴滴的业务场景下,定位主要是指各类终端设备的位置,包括手机、单车、行车记录仪、车机端等。作为底层服务,滴滴日均提供700亿次定位服务,支撑着...

    桔妹导读:定位是所有LBS服务的基础服务。在滴滴的业务场景下,定位主要是指各类终端设备的位置,包括手机、单车、行车记录仪、车机端等。作为底层服务,在滴滴日均提供700亿次定位服务,支撑着平台的各类业务。

    今天给大家分享的是机器学习在滴滴网络定位中的实践工作,会重点介绍三阶段的演进:无监督模型、有监督回归模型、端到端CNN模型。

    1. 

    什么是网络定位

    目前定位技术主要包括GPS、网络定位、惯性航位推算、MM(地图匹配)、视觉定位等。GPS是最为人熟知的定位技术,是依靠设备与卫星交互来获取经纬度的方式。GPS精度高,但有冷启动耗时长、耗电大、遮挡场景不可用等缺点。在滴滴场景下,乘客和司机在有遮挡的场景下,例如室内、高架下等,GPS通常处于不可用状态。这时就需要有其他定位技术作为GPS的补充,使得乘客发单、司机导航等服务依然可用。其中最主要的补充便是网络定位。

    室内类场景虽然有遮挡,但设备通常可以扫描到Cell(基站)和Wifi列表,而且Cell和Wifi设备位置相对稳定,连接其上的设备可以借其定位,这就产生了网络定位。网络定位包括wifi定位和基站定位,是指基于终端扫描到的wifi或基站列表进行的定位技术。Wifi的接入设备通常称为AP(Acess Point),方便起见,下文将AP和基站统称为AP。

    网络定位通常采用的是指纹定位技术,是一个根据query匹配指纹库信息,并计算得到坐标位置的过程。如下图所示,网络定位系统主要包括离线建库和在线定位两个阶段。

    离线建库主要是基于有GPS时的采集数据,建指纹库的过程。指纹库中记录AP的各类信息在不同地理网格内的采集数据分布,如下图所示。

    在线阶段,根据线上query匹配指纹库信息,并计算得到坐标位置。

    本文介绍的主要是在线定位部分,即query匹配指纹库、计算坐标位置。

    2. 

    网络定位匹配算法迭代

    在线定位算法共经历了无监督概率模型、有监督回归模型、端到端CNN模型三次大的迭代。前两个阶段的网络定位主要包括网格召回、网格排序、网格平滑三步,如下图图一所示。端到端CNN模型去除了网格排序和网格平滑,基于一个召回中心点,直接回归位置坐标,如下图图二所示。

    图一

    图二

    2.1 无监督概率模型

    网络定位要完成在线AP与离线AP指纹库的匹配,是联合概率计算的过程。

    以AP指纹库的信号强度分布为例,看下网格概率计算过程。

    纵轴为采集数据中的AP编号,横轴为空间网格编码,相交点表示每个AP在对应网格中的采集信号强度分布。空值表示AP在对应的位置无采集数据。

    以一个实时定位query信息:(AP1:RSSI=1,AP3:RSSI=0)为例,介绍网格召回、排序、平滑的过程。

    召回阶段,基于扫描到的AP1和AP3,可以召回Grid1、Grid2、Grid4;

    排序阶段,结合离线AP库,基于独立性假设和贝叶斯公式,计算各网格的权重:

    表示观测到的APj的信息。以信号强度RSSI单一特征为例,上例中,

    网格平滑阶段,基于上述的统计概率,排序获取TopK个网格,采用爬山法求解最优坐标:

    其中,为预测位置到的距离。

    2.2 有监督回归模型

    无监督概率模型的方法,思路清晰易懂,易实现,是早期网络定位的主要方式。但有以下问题:

    • 联合概率的方式对采集信息不充分的位置不友好,例如上例

    • 难以拟合多维特征,尾部badcase较严重

    • 技术目标无法得到直接优化,天花板较低

    出于对以上问题的思考,整体流程仍保持网格召回、排序、平滑三阶段,我们将网格排序升级为有监督回归模型,通过引入多元特征和显式的优化目标,实现对网格的更精准打分。

    Label:待预测网格与真实位置的位置偏差,回归任务。

    特征工程:构建近百维特征,主要包含AP特征,网格特征,前文信息等。

    模型选择:一期上线GBDT模型;二期对比了GBDT、FM、DeepFM、FM+GBDT等,最终线上最优融合模型结构如下。

    原始特征中的稠密特征和低维稀疏特征经过GBDT进行特征组合、交叉;GBDT输出的叶子节点编号与高维稀疏特征经过DeepFM网络,最终输出网格与真值的位置偏差。

    TopK网格平滑:预测偏差距离从小到大排序,截取TopK网格;爬山法,梯度下降求解最优坐标。

    2.3 端到端CNN模型

    有监督模型在特征利用、模型结构、优化目标等方面提供了更大的操作空间,可以极大地打开天花板。上线后定位精度等指标取得了显著的收益。

    但该方法仍有以下问题:

    • 每个网格孤立刻画,信息采集时的不均衡、有偏的问题无法有效解决

    • TopK平滑层与排序层割裂,无法联合优化,且引入部分人工超参

     

    对于以上问题,考虑以下解决方案:

    • CNN网络:充分利用空间信息的局部相关性,增强特征的提取能力

    • 端到端网络:合并排序与平滑层,改为直接回归位置坐标,目标更统一,减少人工超参

    最终,整体网络结构如下:

    下面以基站定位为例,介绍该结构的实现细节。

    首先介绍下输入特征的构建:

    • Wide网络特征:表达Query信息的Wide特征共十几维

    • CNN特征图的构建:

      • 召回中心:采集热度较高的TopN网格的经纬度中位数作为图的中心点。

      • 特征图构建:选取C维图特征,每一维特征为一个channel;基于召回中心,构建M*M分辨率的特征图。

    CNN特征类别

    网格上各个channel的特征计算

    输入特征图的示例

    网络结构:在CNN网络部分,采用多尺度卷积核提取特征后,经过两个卷积+池化层后,将特征图打平。Wide部分稀疏特征经过embedding后,与稠密特征级联。两部分tensor级联后经过全连接层,最终输出与召回中心点的位置偏差。

    Label与Loss:label为真实位置与召回中心位置的偏移dx和dy,召回中心点+预测偏移即得预测位置。loss最初使用的是经纬度的L2 loss:

    考虑到经纬度在球面上表达距离的差异,我们改为了使用球面距离偏差作为label,也获得了稳定的收益:

    dx和dy表示真实空间距离

    CNN模型在线上AB实验取得了显著的收益,已全量上线。

    CNN端到端模型升级了信息的表达方式,由单网格、结构化的信息表达改为了Image的表达方式,配合cnn网络结构,获取了效果的显著提升;并且将几十甚至几百个网格的预测问题改为了单次位置回归问题,虽然模型复杂度有所增加,但整体性能基本持平。

    2.4 线上效果

    网络定位三阶段的模型先后上线进行了AB对比实验。以基站定位三个主要技术指标为例,对比结果如下表所示:

    3. 

    总结与展望 

    本文总结了定位策略团队在网络定位算法侧的工作,介绍了无监督概率模型、有监督回归模型、端到端CNN的演进及其中的思考。

    无GPS时的定位仍面临着很多困难,未来我们将在以下方面持续探索:

    • 模型效果优化:

      目前CNN模型在基础信息利用、召回等方面仍有较大优化空间。

    • 性能问题:

      考虑线上性能,在基础信息和网络结构上做了很多删减。期望通过更优的召回策略、蒸馏剪枝等平衡效果与性能。

    • 5G技术:

      5G的天然优势(高频率、高密度、低延时)也必定会带来定位精度的显著提升,相关调研工作正在进行。

    • 复杂场景定位:

      对于室内、地下停车场等典型复杂场景,网络定位面临着真值获取难、移动ap等难点。细分场景也逐渐向模型化方向演进。

    以上就是滴滴网络定位近期工作的实践介绍,欢迎随时交流。

    本文作者

    2017年加入滴滴,目前从事地图定位算法方向,多年LBS领域算法研究工作,在滴滴先后从事猜你想去、上下车点推荐、定位算法等方向的开发工作。

    2018年加入滴滴,主要从事网络定位、惯导推算等方向的算法开发工作。

    2018年加入滴滴,主要从事网络定位、融合定位等方向的算法开发工作。

    团队招聘

    滴滴地图与公交事业群定位团队负责为滴滴平台上的司乘双方提供精准的定位服务,构建出行基础设施,发挥平台的大数据优势,应用概率统计、机器学习、深度学习等技术,在GPS质量优化、网络定位、惯导推算、融合定位等细分方向上持续深耕,以技术驱动用户体验的提升。

    团队长期招聘算法工程师,包括机器学习、惯导推算等方向,欢迎有兴趣的小伙伴加入,可投递简历至 diditech@didiglobal.com,邮件请邮件主题请命名为「姓名-应聘部门-应聘方向」。

    扫描了解更多

    延伸阅读

    
    内容编辑 | Charlotte、Teeo联系我们 | DiDiTech@didiglobal.com
    
    
    展开全文
  • 如何CAD快速定位坐标?

    千次阅读 2019-09-04 16:01:57
    我们CAD制图工作中会遇到关于定位坐标的各种问题。如何CAD快 速定位坐标?今天我就这里和大家分享一下,本次使用CAD编辑器标准版快 速定位坐标方法。 步骤1,安 装运行CAD编辑器标准版,左侧选择【文件】-...

    我们在CAD制图工作中会遇到关于定位坐标的各种问题。如何在CAD中快 速定位坐标?今天我就在这里和大家分享一下,本次使用CAD编辑器标准版快 速定位坐标方法。
    步骤1,安 装运行CAD编辑器标准版,在左侧选择【文件】-【打开】,选择需要编辑的CAD图纸。
    如何在CAD中快速定位坐标?_1步骤2,切换到【查看器】选项卡,在工具区域找到【显示点】功能,将鼠标放在上面可以查看到该功能的作用。查找点:在绘图中查找给定坐标点,并将其显示视窗中 心。
    如何在CAD中快速定位坐标?_2步骤3,接下来,在弹出的“显示点”对话框中,输入“X、Y、Z”轴坐标位置,然后点 击“显示”按钮即 可快 速定位到该坐标。
    如何在CAD中快速定位坐标?_3根据以上方法就可以轻 松快 速定位坐标啦。希望今天分享的CAD教程能够帮助到大家。

    展开全文
  • Java面试Offer直通车

    万人学习 2019-12-18 15:19:52
    5、本课程已经在线下的培训课程经过实际检验,老师每次培训结束后,都能帮助同学们运用面试技巧,成功找到更好的工作。 【超人气讲师】 胡书敏 | 10年大厂工作经验,8年Java面试官经验,5年线下Java职业培训经验...
  • VBA还有其他的方法可以用来定位最后单元格。工作示例数据如下图所示,注意其中A4为空,A6至A7单元格看似空白,其实是有内容的,A6为零长度公式,A7为空格,A8为前缀字符。 示例代码如下。 Sub Demo2() Dim...
  • Excel技巧分享1-利用VBA定位工作

    千次阅读 2018-10-31 14:45:41
    如果你的Excel 工作簿内有成百上千个工作表, 要查找其中的某一个工作表会很麻烦。使用下面的VBA 代码进行查询会极大的缩短查询时间。 Sub GoToSheet() Application.ScreenUpdating = False SheetName = ...
  • GPS定位原理、系统组成及工作频段

    万次阅读 2019-12-20 15:59:22
    四个卫星的坐标(X1~X4,Y1~Y4,Z1~Z4)和时间戳T1~T4都是已知的,因为卫星会时刻广播自己的位置信息并且会带上时间戳,接收机很容易得到这些位置信息,接收机得到卫星位置信息的时间戳就是t,那卫星到接收机的距离R...
  • 该方法利用捷联惯性导航系统的三轴加速度计和三轴陀螺仪实时测量采煤机的加速度和角速度信息,并根据四元数捷联惯导位姿解算方法解算出采煤机的实时位置和姿态信息,得到精确的采煤机运动轨迹,实现对采煤机的实时体...
  • 手机定位是指通过特定的定位技术来获取移动手机或终端用户的位置信息(经纬度坐标),电子地图上标出被定位对象的位置的技术或服务。定位技术有两种,一种是基于GPS的定位,一种是基于移动运营网的基站的定位。...
  • 有了这些驱动程序,VR HMD 和解决方案提供商能很容易获取被定位设备的姿态和位置信息,灯塔的位置和状态,并和 Hypereal 定位算法库集成,第三方可以把 HYPEREAL 的灯塔定位方案集成到自己的 SDK 或者应用。...
  • 蓝牙定位技术工作原理分析

    千次阅读 2020-04-24 16:27:30
    由于其功耗与成本较低,蓝牙从高速汽车设备到复杂医疗设备等应用领域的发展过程发挥着至关重要的作用。下面给大家分析一下蓝牙定位技术的工作原理! 一、蓝牙定位原理 蓝牙定位基于RSSI(ReceivedSignalStren...
  • 声源定位

    千次阅读 多人点赞 2019-11-06 13:08:35
    尝试电子设备复制相同的系统可以证明是一种有价值的方式来感知机器人、安全和一系列其他应用的环境。我们构造了一个三角形排列的麦克风来定位任意声音的方向。通过记录来自三个麦克风的输入,我们可以将记录相互...
  • 2013年9月,国家导航与...此基础上,通过提供室内导航信号和室外卫星导航增强信号,具备室外广域实时定位精度优于1米、室内定位精度优于3米的定位能力。从而基本满足了人们对于全时空高精度定位导航服务的需求,一...
  • GPS定位基本原理解析

    千次阅读 2020-06-24 17:14:28
    然后就去查找资料了解了一下导航这个玩意,最后发现其实不管什么导航其实都差不多,只是用的卫星不一样,如果用GPS导航可能就是使用美国那边发射的卫星,如果使用北斗导航,就使用咱们国家自己发射的卫星。...
  • 无线定位技术概述

    千次阅读 2018-12-03 20:23:50
    阎啸天于蓉蓉武威 (中国移动通信有限公司研究院业务... 要介绍了位置信息和定位性能分析指标等基本概念,根据定位原理与策略的差异对各种定位方法进行分类,概要阐述和比较说明了蜂窝网络、无线局域网络(WLAN)拓扑...
  • WEB自动化测试Xpath定位方法

    千次阅读 2018-03-16 16:21:44
    Xpath是XML文档查找信息的一种语言,使用路径表达式来选取XML文档的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档的节点或节点集。...
  • 今天分享的是《OPPO安全应急响应中心》公众号里的一篇文章——移动APP测试关键代码定位 思路明确,干货不少,现在App防护的整体难度越来越大,单纯静态分析掉头发太多,因此都是动静态结合。静态分析即使用Jadx反...
  • 记一次性能测试过程遇到的问题的定位思路

    千次阅读 多人点赞 2018-10-28 10:38:21
    本次稳定性压测过程出现了内存泄露的情况,具体引起的原因还分析,但问题已经定位到。稳定压测的前20小时之内,系统很稳定,20小时之后,出现了大量的报错,并且报错信息一直增加,部分交易响应时间达到二十几秒...
  • 地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序的指令和数据进行修改的过程 将逻辑地址空间重定位到物理地址空间的时机有三... 这之前我一直对地址重定位的细节不是很了解。...
  • app自动化 - 三大元素定位工具

    千次阅读 2020-04-14 16:18:42
    日常android app自动化测试工作当中,使用一种工具可能难以定位到元素,今天,我来说说我平时用到的三大工具有哪些。。。 这三种工具定位的前提: 1、通过adb devices命令能够识别到至少一个android设备, 2、设备...
  • UWB定位技术原理图解

    万次阅读 多人点赞 2019-11-25 17:51:56
    ToF为飞行时间测距法,通过测量脉冲信号从出发到返回的时间,乘以传播速度(脉冲信号空气的传播速度为定值v=30万KM/秒),得到往返一次的距离,除以2即为UWB定位标签到定位基站间的距离。 UWB定位基站的坐标已知...
  • 行车定位是无人驾驶最核心的技术之一,全球定位系统(GPS)无人驾驶定位中也担负起相当重要的职责。然而无人车是复杂的动态环境中行驶,尤其大城市,GPS多路径反射的问题会很明显。这样得到的GPS定位信息很...
  • GNSS定位导航

    千次阅读 2020-12-17 13:48:25
    车载定位包括:GNSS,IMU,RTK,DR 1、GNSS GlobalNavigation Satellite System 全球导航卫星系统 2、定位系统的三部分 空间星座部分:获取卫星运动轨迹,确定用户接收机的空间位置 地面监控部分(监测站、...
  • 指纹算法Wi-Fi定位中的应用与改进

    千次阅读 2015-08-04 10:48:44
    目前的定位方法,指纹定位是主流的一种定位算法,论文也多有提及,之前的工作中,作者也实现了这种算法,但是要想做到很好的效果,也并不是那么容易的,中途遇到了一些问题: 1、如何对指纹进行抽稀 2...
  • 三边测距定位算法详解

    千次阅读 2021-08-25 00:45:10
    关注、星标公众号,直达精彩内容来源:平行机器人|赵得江整理:李肖遥通过GPS定位系统实现无人机的空中悬停定点飞行 “定位”这个概念我想大家并不陌生,可以说定位技术的迅猛发展给我...
  • 目标检测的分类和定位冲突问题

    千次阅读 2020-07-02 07:00:00
    上面三个工作都是two-stage detector上做的,从RPN得到proposal之后,根据分类和定位两个任务的具体需求,对proposal做了相应的变换。one-stage detector上,应该也同样存在两个task冲突的问题,目前我还没看到...
  • 由于工作紧张,不能一一回复大家的问题,正好借助“百度地图技术团队”微信公众号宣传普及的机会,给大家做一个系统性介绍,希望对大家了解和应用室内定位技术有所帮助。(文中如有不当词语或者观点言论,敬请谅解并...
  • Android应用使用百度地图API定位自己的位置(二)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 446,377
精华内容 178,550
关键字:

如何在工作中找到自己的定位