初识安卓客户端
这是我参与「第四届青训营 」笔记创作活动的的第1天
前言
我的个人情况
好像很长时间没有写过什么像样的笔记了吧,也比较感谢这次字节跳动的活动,可以给我一个耐心学习的机会。我是一名马上大一的学生,想来三年来也比较浑浑噩噩,对安卓客户端开发有着比较重的好奇心,以至于可以说是热爱这个东西。当他人使用自己的产品去做一些事,甚至还会给你反馈问题,这是很有成就感的。
因为喜欢所以是有在高二尝试去开发APP的,但想要和得到是有距离的,当我真正去下载Android studio后才是打击的开始,发现安卓开发不是那么简单的事情。到现在,我没有系统化的学习过安卓基础,仅仅是用到什么就去找什么,这样带来了很大的问题,有许多东西你不知道为什么这么做,就是个无情的搬运工,为此,我想通过这次的青训营,系统化的去了解学习安卓,把基础的东西学习好。
这一节课我学到了什么?
对于我而言,报名参加了青训营就是下定决心要学到东西的,那么不记录内容是不行的,这里我总结下我这一课的收获吧。
课听完了,但是对每一块的印象深浅是不同的,下面是我感觉自己有收获感觉感兴趣的。
- 第一小节
- 客户端的角色 —— 人与人之间的媒介
- 客户端需求的交付流程
- 第二小节
- 对外为用户创造价值
- 界面+数据+逻辑 —— 才是最基本的需求
- 个性化需求不是那么轻松 —— 背后需要庞大的代码量
- 成熟的APP背后要考虑更深的问题 —— 原来我们使用软件的随便是需要复杂的确定
- 对内减少公司成本
- 项目代码耦合度过大的危害 —— 牵一发动全身(原来这个东西是叫耦合度)
- 架构师的任务居然是理清复杂业务关系
- 自身的发展
- 长板理论 —— 应该去发展长处
- 未来不一定要走管理,还有架构和技术方向
- 对外为用户创造价值
- 第三,第四小节
- Android架构图各层含义以及使用情况
- 安卓APK安装包结构 (虽然我使用MT管理器打开过安装包,但是没想到这个也是压缩包
哈哈也许我的注意点有点奇怪,但是这是我真实的感,下面详细讲一下这些东西的认知吧。
第一小节
客户端的角色
入营前其实我们应该是回答过,或者说考虑过,我当时的回答:客户端是人们使用平台服务的一个媒介,人们利用客户端去使用这些服务端需要表达的功能,那么如果有一个流程图就是这样。
graph LR
用户 --> 客户端
客户端 -.发送请求...-> 服务端
服务端 -.处理消息...-> 客户端
客户端 --> 用户
咋一看好像是合理的,可是缺少了人的意图,当时是没有考虑到服务端为什么这么做,今天看了课程发现了另一种解释——客户端是人与人的媒介。
这个是我们课程的一张图,当时预先是看到的,只是当时的理解和课程是不一样的。
显然,我们不能单纯的理解为客户端是人与服务端的桥梁,归根结底还是人与人的关系, 用户渴望通过客户端进行一系列操作向外界发送信息或者说收到外界的信息,此时产品经理通过外界和用户的行为需要,形成需求,才给客户端和服务端,此时才是把人和人联系起来。
客户端需求的交付流程
这一块的话并没有什么可以展开说的,就是开发客户端仅仅是一个产品的其中一块,通过需求形成客户端和服务端的开发,客户端一般需要服务端提供数据和自身交互结合,然后还需要QA同学的验证测试,才能交付给同学,这部分并没有太吸引我的地方。
第二小节
对外为用户创造价值
界面+数据+逻辑
这一块我们课程分了三层,难度也是逐步递进的,首先就是界面+数据+逻辑,我之前是写过一个自己的小型APP的,对于一个从0接触按需实现功能的我而言,是非常困难的,当然慢慢的积累到现在这个并不是什么困难了。不过这显然是冰山一角,老师告诉我们这才是基础。
个性化需求
这才是让我大开眼界的地方,老师展示了一个拍视频界面,布局看起来是比较复杂的,但是我感觉要说起代码量来说,应该也不会太大吧,毕竟是个布局,没想到还是太天真了。我自己的布局不过几百行,复杂的可能也就400行,甚至都达不到,没想到这样的一个页面居然是上千行的。
那么逻辑代码肯定是就更可怕了,上万行的逻辑代码,加上底层还要更多,这是我想都不敢想的。
这也告诉我们不能把东西看的太简单了,每一个需求都是需要有耐心和技术去实现的。
安全,体验,功耗等更深层次的问题
当老师把数据列出来的时间是毕竟害怕的,消耗了多少电?我是很惊讶的,功耗这种东西也是需要考虑的吗,显然是这样的,数据让我大跌眼镜,这确实是一个该考虑的问题。
除此之外,还让我认识到的是,这个推荐机制,我其实以为这个东西就是个大数据的东西,没想到,安卓端居然也能做智能端,响应还能更快,这也为我拓展了之前的保守想法。
老师也衍生出了一个问题,我们使用抖音,快手,B站这样的APP,大多数时候是没有目的性的,就是看看,这个随便是一个问题,每个人的喜好是不一样,肯定不能随便推送。这也让我了解到我们的随便背后有这么多事情。
对内减少公司成本
这个东西对我来说太玄乎了,我还没有参与过团队协作,但是却有遇到过这样的问题
项目代码耦合度过大的危害
随着自己维护的项目功能越来越多,越来越复杂,想要改动或者优化一个东西变得非常困难,我一想好家伙,我就遇到过这种问题,这也是迫使我暂停维护自己软件的原因,真的是写不下去了,哈哈哈。
牵一发动全身过于印象,我之前写东西是没有这种想法和预计的就是为了实现一个功能而写的,这样导致拓展性和维护性出了很大的问题,加上我这安卓基础薄弱,啥都不知道,改起来就更可怕了。
往往实现功能后是这样的
因此就有了架构师,来帮助我们理清关系,这样也能提高我们编码效率。其实我一直以为架构师是个非常大佬的存在,就是给项目做框架和核心技术内容,没想到架构师是这样的作用。
给我的启示就是个人的东西应该先设计,再下手,不然后期就是这种情况。
自身的发展
这个我感觉是有启示意义的,我先来说下自身的情况下吧,初三毕业我也想做个软件,但是当时认知上是非常匮乏的,在假期,我选择了IAPP,这个是一个可以在手机上做软件的东西,代码是自己规定的一种,类似现在易语言的存在吧。
但是它是把代码转换为Java代码后打包APP的,我当时想要个壁纸软件,后来我发现需要有后端这种东西的存在,当然只是会用PHP源码搭建网站,没办法实现,就只能暂停了,后来我觉得这样不行,就去学了PHP,会点简单的东西,直到现在才是去,这个时候我感觉可以了,就去接触客户端,但是客户端又出问题了,IAPP不能实现我想要的一些效果,那时已经高二了吧,我就下定决心要学真正的安卓,下载了AS,现在就是出现了后端,客户端都能做一点,但都非常肤浅。
为此,我打算认真学习客户端,总要有一个长处的吧,这里老师也给我们了一些比较成熟的方向。
首先我们得有过硬的基础知识,一些基础需求需要能自己实现的。
然后就是能负责一些重要的项目
再往上就有三个大方向
- 走技术学习了解底层,在这方面有自己的见解
- 走架构,当一个架构师
- 走管理,带团队做项目
当然,这些对我来说可能暂时比较远,不是主要问题,那么现在我要做的就是去学习基础,夯实基础。
老师还有提到了一些软素质,这个就不展开说了有课程。
第三,第四小节
Android平台架构图
这个图可能都见过了吧,我也是,但确实是不知道这个东西各层级含义,这次课程也提到了。
最前面就是 系统应用层 安卓是提供了一些基础的应用的,包括我们的程序也在这一层级,是可以去调用谷歌官方的这些系统应用的,这个我之前是有体验到的,比如文件管理器,设置了什么的。
下来就是Java API Framework,这个四大组件也在其中,老师说我们后面打交道更多的是在这里,activity也在这里,想必是比较重要的东西,后面可能会了解到。
再往下就比较底层了,课程里好像会涉及这个ART,后面的就不阐述了。
安卓APK安装包结构
别的先不说,这个APK没想到也是个压缩包,其实学安卓开发前我是先了解逆向的,当时这个是论坛比较火的,当然现在热度也有,我使用过手机的MT管理器,可以反编译安装包的DEX,以及去汉化资源了什么的。
这个里边老师已经讲过了 基本上是吻合我的认知的,只是我忽略了一个东西——META-INF,之前我是玩过点手机逆向的,但是这个目录确实是没有注意过,以为大多数时候修改操作不用这个文件夹,没想到里边是签名和证书。
这里讲一点额外的,一开始接触逆向最先改的就是res里边的图片资源了,还有下面这个resources.arsc的资源。
图片资源篡改
res文件夹里边是有图片资源文件的,是可以改的,我会改成我自己喜欢或者有自己标识的内容,哈哈,那个时间比较天真是初二,初三吧,当时网上也盛行倒卖。
基础程序内容汉化
然后就是resources.arsc这个东西大多数时候是去汉化,我们去程序时字符串会有黄色的提示,目的是把字符串放到strings.xml里的,放进去后打包,在resources.arsc看到有映射,我们经常会汉化这个里边的东西,这块也是汉化后加入自己的信息的一个常见位置。 我使用的就是MT管理器当时电脑还接触不到现在的东西,手机会很方便,当然resources.arsc有些时候可能被不会仅仅有这个内容可能还有些系统上的东西,改了会有问题,需要注意。
程序修改和汉化进阶
当然并不是每一个程序的字符串都放这里,后来我了解到classes.dex里边装的就是我们的Java代码编译打包后的文件,Java文件->class->dex,这时有些程序字符串在resources.arsc找不到,就可以用mt管理器的工具在反编译的classes.dex中查询字符串,找到并且汉化。
同时早期游戏内购破解也是在这里的,提供找查字符串来篡改判断,这个东西是在本地判断的,不像现在是服务端下发内容,因此早期的游戏,软件内购采取反编译classes.dex修改是可以破解的,同样的,即使是现在也能这样篡改程序。
实践程序保护
为了保护防止篡改,我们可以使用加固等方案,但是我发现加固后启动会变慢。
那么我使用了一种客户端和服务端配合的方案,去检查这个签名信息是否一致,主要是对APK的SHA-1,MD5,CRC检验,但是打包后这个东西是会变化的,我们无法预先知道这个东西。这样我只能在客户端内置发送情况,通过服务端控制让客户端先把这几个内容发到服务端,服务器拿到后就关闭上传,这样在APP启动后就检测服务端和客户端拿到的是不是一样,不一样就被篡改了,激活逻辑。
当然我也发现有些客户端是签名校验,但上述两种简单的方案已知有破解办法,并不绝对安全,当然我的个人APP没啥价值很少有人去篡改。
但对于公司来说是有损失的,所以考虑可能也不一样。
结尾
以上便是这节课的总结,如果有错误欢迎大家指正。