学习进度(1):2021年1月6号~2021年1月10号

2021年1月6号

早上六点到七点四十:

1、《人生护城河:如何建立自己真正优势》(完结)

2、《投资至简:从原点出发构建价值投资体系》~p30

3、俯卧撑40

晚上:

1、《Android插件化开发指南》第5、6、7、8、9、10章

2、《投资至简:从原点出发构建价值投资体系》p30~p112


「《投资至简:从原点出发构建价值投资体系》随记:」

投资第一性原理:“投资就是放弃一种资产,获得另一种资产更多的未来现金流的折现值。”,可以推导出整个投资大厦。一切资产的“内在价值”都可以用现金流折现这个尺度来统一地衡量和评估。但是,不同资产类别的未来现金流特征是差异巨大的,据此可分为“现金类资产”“交易类资产”“股权类资产”。其中,股权类资产是长期收益最好的资产,是投资者资产配置的重点。

一个具有“企业思维”的长期投资者,主要赚的是企业业绩增长的钱,而不是估值变化的钱。赚估值变化的钱,对长期投资者来说,某种意义上在整个持股期只有一次。

P=EPS×PE这个公式,揭示了投资者应该修炼的能力,EPS是商业判断力,PE则代表洞察人性的能力。

股权思维投资者更关注企业,现金思维投资者更紧盯市场。


「工作随记:」

周一的时候和同事聊起EventBus导致事件过多,从而引起项目中到处充斥着事件订阅方法。打个比方,现在有个页面订阅了很多种事件用来刷新,在后面新增模块时某个操作也需要刷新该页面,也就是说我们还得在之前页面去订阅该事件,一个页面还好,那多个页面呢?事件漫天非,项目越大,逻辑越混乱。

之前的流程图如下:

学习进度(1):2021年1月6号~2021年1月10号_第1张图片
未命名文件 (2).png

经过充分思考,在不影响现有项目的情况下想要改善这种现象,为此我想到了模块化思想,也就是说按照模块建立统一事件接收类,再由统一的模块事件类分发事件,对于之前的页面就可以只定义一个事件,多种事件引起的操作由功能模块事件类处理。

改动后:

学习进度(1):2021年1月6号~2021年1月10号_第2张图片
未命名文件 (3).png

好处:

  1. 事件由同一模块管理,降低页面的事件处理方法数
  2. 起到自动梳理逻辑的作用,新人针对某功能的修改可以很清楚知道该功能会影响到项目内的哪个页面

这种方式肯定不是最好的,对于特定事件来说并不需要这种处理方式,但对于目前来说是最合适的,后面继续去思考如何更好的来管理项目内的事件传递。

牢记:实现只不过是达到该目的的一种手段和方式。脱离目的的实现,如缘木求鱼,很容易偏离事物本质。

今天研究了下手动分包,将指定的class打到主dex文件,通过优化主dex文件,可以优化app的启动速度,后面进行实践,看效果如何。


美国作家戴维·希尔为父亲写了一本传记,中文名叫《人生谢幕前,请全力以赴》,英文名The Thing About Life Is That One Day You'll Be Dead更加有启发,直译过来是:生命的真相是你会在某天死去。

该书的扉页上这样写道:

“父亲年过90,依旧热爱生命,精力旺盛得有点过了头,身体比正值壮年的我还皮实。他9岁时被电倒在铁轨上大难不死;成年后经历严重车祸、失业、忧郁症及丧偶的打击仍奋力活着;86岁时在球场上心脏病发作又延迟就医却逃过一劫……”

戴维·希尔说:“生命仅有一次,我们只有活得义无反顾,才能活得无可替代。希望我们在认清生活的真相之后,依然能纯粹而热烈地活着。”


2021年1月7号

早上五点二十到七点四十:

1、《投资至简:从原点出发构建价值投资体系》p112~p182

2、俯卧撑50

晚上:

1、《Android插件化开发指南》第11、12、13章

2、《投资至简:从原点出发构建价值投资体系》p182~p223


「《投资至简:从原点出发构建价值投资体系》随记:」

通过寻找市场机会,将我们大比例资产换成优秀企业尽可能多的股权资产,并长期固定下来。股票不是买来卖的。

股票市场的三条公理(公设):

  • 公理一:每股股票都代表对企业拥有一个基本单位的所有权,优秀企业的股票所代表的自由现金流和内在价值长期是增长的。
  • 公理二:股票价格长期来看会回归企业的内在价值。
  • 公理三:股票的“主观定价”规则和“边际定价”机制,决定了股票价格在短期内和给定时间点具有随机性,完全不可预测。

企业内在价值是动态变化的,事物的发展具有多重性。我们在做投资时并不是上帝视角,而是根据眼前可见的所有信息对未来做大概率的合理判断。


早年写了几篇四大组件启动流程的文章,当时自以为已经懂了十之八七,最近重新开始看插件化相关的知识点时,脑海中已经对这些底层知识已经忘了很多,从今天看早年的文章,发现深度不够,过于流程化。

怎么办?针对各个知识点进行逐个突破。


2021年1月8号

早上六点四十到七点四十:

1、《投资至简:从原点出发构建价值投资体系》p182~p268

2、俯卧撑50

晚上:

1、《Android插件化开发指南》第14、15、16、17、18、19、20、21、22章(完结)

2、《投资至简:从原点出发构建价值投资体系》p223~p370

早上起来的有点晚,可能是昨晚看电视太晚了,没有克制自己,还是得要合理的控制自己的娱乐时间,在不影响睡眠质量的前提下适当的娱乐下。


「《投资至简:从原点出发构建价值投资体系》随记:」

集中和分散,只是投资的表象,关键目的是在把风险控制到尽可能小的基础上获得满意的回报。

不预测市场,但利用市场已经给出的机会,不断将自有资产转换为少数价格合理,且我们可以深刻理解的优质股权尽量多的份额,逐步构建一个稳健均衡的优质股权资产组合,耐心持有这些公司,伴随其尽可能长的经营时间。

商业的核心有如下四点:

  • 第一点是实现0到1,即通过生产某种产品和服务来满足人类中某单一个体的某一种(一组)需求,从而获得价值增值。
  • 第二点是从1到N,个体中包含了整体。从1到N有三个层面。第一个层面是单一个体单一需求的重复性满足。第二个层面是满足了单一个体的单一需求后,就可以扩张至更多人类个体的这一种(一组)需求。第三个层面是用具有协同效应的多种产品和服务,去满足这些个体更多种(多组)需求。实现大规模复制0到1过程中的价值增值。
  • 第三点就是如何使竞争者不能实现或者慢于自己实现从0到1,再从1到N的进程。
  • 第四点则是需要优秀的企业家、管理团队、治理结构和企业文化来将前面三点变成现实。

上述第一点就是企业最基本的商业模式,决定了生意是不是好生意,“生意能不能做成”。第二点是企业的成长空间,决定了“生意能做多大”。第三点是企业的竞争壁垒,决定了“生意会不会被别人抢去”。第四点企业管理和企业文化,决定“谁来怎么做这个生意”。

商业模式是指,企业以什么样的方式,提供什么样的产品和服务,来满足什么样的客户的什么样的需求,如何实现盈利,这项生意有什么样的经济特征和自由现金流状况。


「《Android插件化开发指南》总结:」

其中Activity的插件化解决方案,分为动态替换和静态代理两种。

其中动态替换是一种“占位”的思想,在宿主中事先声明一个占位的Activity,当启动插件中Activity时,通过hook技术替换占坑的Activity,绕过AMS的检查,检查通过后再替换回插件Activity,这里就需要同学们对Activity的启动流程要有比较清晰的认识,理解Activity与ActivityManagerService 的整个通信流程,知道Instrumentation、AMN、Handler.Callback在整个通信中的作用。

而静态代理采用的是一种牵线木偶的思想,在宿主端通过一个代理类来全权控制插件中的类,其中插件中的类就没有对应的生命周期,通过依赖倒置原则定义一系列生命周期的接口,由插件类实现,再通过宿主端去创建插件类(实现生命周期接口),从而在宿主端的代理中直接调用对应的生命周期。

在进行Activity插件化时会遇到资源获取、资源ID冲突与LaunchMode的问题。资源获取问题可以通过App的AssetManager来加载资源,通过addAssetPath方法(通过反射)加载指定位置的资源,像换肤可以通过这种形式来实现;资源ID冲突问题可以通过修改AAPT,为每个插件的ID指定不同的前缀,也可以通过修改resources.arsc文件来达到相同的目的;LaunchMode问题可以通过事先占位不同启动模式的Activity,也可以自己去模拟实现Activity四种启动模式。

Service的插件化可以通过事先占坑或静态代理的思想也能实现,这种的方式唯一不好的地方就在于不能动态新增Service,当然我们可以通过分发技术,在宿主中只声明一个占位的Service,由它来统一分发。

BroadcastReceiver的插件化可以通过把静态Receiver转换成动态Receiver,其中的方案有三种,一是动态替换,把插件中的静Receiver注册为宿主中的动态Receiver;二是通过预选占位,先将插件中的所有静态Receiver都注册为动态Receiver,再通过这个占位的Receiver来分发;三是静态代理的思想,在宿主中定义一个代理的Receiver,由它分发到具体的插件中的某个Receiver。

ContentProvider的插件化可以通过事先占坑或静态代理的思想也能实现;另一种方案是通过动态替换,在宿主提供一个占位的ContentProvider来绕过AMS的检查, 通过这个占位ContentProvider分发到具体插件中的ContentProvider。


2021年1月8号

早上:

1、《投资至简:从原点出发构建价值投资体系》p370~p435

2、俯卧撑50

下午:

1、《移动App性能评测与优化》第1章

晚上:

1、《投资至简:从原点出发构建价值投资体系》p435~p471


「《投资至简:从原点出发构建价值投资体系》随记:」

商业模式是解决从0到1的问题,这个从0到1也决定了三个从1到N的程度。第一个从1到N,单个消费者的复购,由购买频次决定;第二个从1到N,向更多的客户复制,取决于客户群大小,以及产品的标准化和可复制性;第三个从1到N,满足消费者更多不同的需求,取决于使用场景的广泛性,取决于产品和相近产品的范围经济程度。

护城河就是一家企业所具有的竞争壁垒。通俗地说,就是我能做的生意你做不了,我能赚的钱你赚不到,我能进的市场你进不去,我们都能做的你也没有我做得更快、更好或者更便宜。即使你知道我是如何做的,你在相当长时间内也无能为力。


「《移动App性能评测与优化》随记:」

分析内存数据工具可以选择MAT,它一款使用非常广泛的Java内存分析工具。通过Android SDK提供的hprof-conv或是OQL去除一些干扰信息,再通过MAT工具查看,没有了系统类所占内存的干扰,只有应用自身代码创建的对象,对于发现内存问题比较有帮助。

在性能测试中,可以通过Monkey/UIAutomator类的常规压力测试、大数据/操作的峰值压力测试、长时间运行的稳定性测试等。这些方法都可以叠加在内存测试的方案中,观察这类场景下的应用内存情况。

功能反复执行造成的Heap内存持续增长,一般是内存泄漏,可以通过LeakCanary来检查;执行时频繁GC,通常是分配了过多的临时变量或数组,随后又被迅速收回,可以通过Heap Viewer / Allocation Tracker等工具来查看具体分配的对象;启动应用后,Heap内存相比以前版本稳定增长,可能是由新功能及代码改动引入的固定内存增长。可以获取Heap Dump后进行多版本或功能使用前后的对此,能够迅速找到增长原因;Heap Alloc变化不大,但进程的Dalvik Heap Pss(Proportional Set Size)内存明显增加,是由于分配了大量小对象造成的内存碎片。

dex优化的思路就是调整dex文件中数据的顺序,将能够用到的数据紧密排列在一起。

针对应用层开发人员来说,底层以及涉及性能的测试经验并不太多,这方面可以借鉴Linux系统的测试经验,了解内核及进程相关的知识,熟悉常用工具。

内存工具:

  • Android Studio/Memory Monitor:观察Dalvik内存
  • dumpsys meminfo:观察整体内存
  • smaps:观察整体内存的详细组成
  • Eclipse Memory Analyzer:详细分析Dalvik内存

测试经验:

  • MAT是探索Java堆并发现问题的好帮手,能够迅速发现常见的图片和大数组等问题。
  • 仅靠MAT提供的功能也不是万能的,比如内存碎片问题就隐藏在对象的地址中。
  • 要测试非Dalvik部分,有必要了解Linux的进程和内存原理、内存共享机制,熟悉常用命令行工具。
  • 内存分配的最小单位是页面,通常为4KB,这个限制往往会引发各种碎片问题。
  • 碎片不仅仅是Dalvik内存,包括各种文件的mmap也有可能产生碎片。

性能优化:

  • 尽量不要在循环中创建很多临时变量。
  • 可以将大型的循环拆散、分段或者按需执行。
  • 引入SDK库和调用新的系统API时需要考虑成本。有可能一些不常用的功能会导致大量的消耗。这时候有可能需要多进程方案,将这些影响内存的操作放入临时进程执行。
  • 除了Dalvik堆内存,还有其他类型的内存在了解了原理后也能够进行分析和优化。

dex文件有很多优化空间。在仔细统计并调整了dex文件的顺序后,往往能够节约1MB以上的mmap内存。


2021年1月8号

早上:

1、《投资至简:从原点出发构建价值投资体系》p435~p554

下午:

1、《移动App性能评测与优化》第2章

2、《投资至简:从原点出发构建价值投资体系》p554~p575


「《投资至简:从原点出发构建价值投资体系》随记:」

当我们刚刚从短缺经济走过来时,更多的选择是一件好事,但当我们已经物质极大丰富的时候,太多的选择反而意味着巨大的交易成本。现在的消费者都有了“选择恐惧症”,选择太多也是一种负担。

未来人们的时间成本越来越高,商品市场极大丰富却良莠不齐。人们越来越需要忠心耿耿的管家,帮助严选商品,还不拿一分回扣。这种商业模式非常具有生命力。会员获得的总消费者剩余与会员费的巨大落差形成了强大客户黏性。


「《移动App性能评测与优化》随记:」

GT、PowerStat以及BatteryHistorian都是基于Android系统本身就有的接口。

电量优化方法:CPU时间片、wake lock、传感器、云省电策略。

你可能感兴趣的:(学习进度(1):2021年1月6号~2021年1月10号)