1.查看private key
openssl pkcs8 -in my_private_key -passin mypassworld
openssl pkcs12 -info -in my_private_key -passin mypassworld
注意不同的加密格式对应不同命令
在app/src/main/jniLibs下按照硬件分文件夹放**.so(jniLibs好像大小写不分)
在项目目录下的app/libs下按照硬件分文件夹放**.so
1 | android { |
https://blog.csdn.net/shengyingpo/article/details/51538444
如果没有提供硬件平台就不需要选择,不然APP会到相应目录下寻找.so文件。
1 | android { |
有时候第三方的jar包放到libs下时,不会智能提示,gradlew clean也没有用,这个时候就是之前设置有过问题,去File->Invalidate Caches/Restart -> Invalidate and Restart, 然后就修复了。
https://blog.csdn.net/Sailor_luo/article/details/80277695
https://blog.csdn.net/ToBeTheOnlyOne/article/details/78491024
优点:
先观察,我觉得一个开源的软件好,必须生态好,就是说能吸引足够多的开发者,而吸引开发者的原因就是它帮助开发者解决了什么问题。Dart对开发者不友好就是个不好的起点,期待它改变。
但是Dart比JS的执行效率高,性能好是个优势,但是JS普通APP的性能需求也可以满足了。
这些都是架构的演变,按照MVC->MVP->MVVM,变化方向是让View能适应不断的变化,而Model尽量保持不变。
业务在Model中。由于网站的三层设计和这个有点混淆,网站三层设计UI、BLL、DAO,对应关系是UI(View+Controller), BLL+DAO(Model)。在DDD的设计中,核心业务也是在Model中,下面的DAO是支撑服务。中台设计中,业务是一个个核心微服务,DAO是支撑服务(PASS),实际存储是IASS。这些划分是按照不同的方面划分的,有联系但是不是同一个东西。
未来的架构是微服务或者是Service Mesh,都是一个目的:功能服务化,更加有弹性。
Model,View,Controller,虽然实现了分离,但是不够明确,View可以读取Model让View包含了一部分业务,耦合不够松散。
对MVC做出了一些改进,让View不可以访问Model,而是通过Presenter来通信。缺点是Presenter和View的耦合关系,Presenter需要控制View的渲染。
在MVP的基础上,让Presenter变成了VM(View-Model),核心是让View<->和ViewMode绑定了,隐藏了View的UI更新细节和ViewModel的值设置细节。
代表: WPF, Angular, React(一般不是双向绑定,而是单向绑定), Vue。
在选择架构的时候,不一定要照搬,而是要按照需求,技术,业务场景进行衡量。
比如Android为什么要用MVP,而不用MVC?那是因为Activity中不能写太多业务代码,不然维护困难。
https://blog.csdn.net/lmj623565791/article/details/46596109
https://www.cnblogs.com/xishuai/p/microservices-and-service-mesh.html
运行beyond compare4的安装命令行工具,然后设置git
1 | git config --global diff.tool bc4 |
这个用来mock数据,用本地文件代替接口的response.
https://www.cnblogs.com/dsxniubility/p/4621314.html
这个是每次可以修改接口返回,只能在url上设置,不能在每个具体请求上设置。第一次excute可以改request,第二次excute是可以改response.
https://blog.csdn.net/qqgirllianxin/article/details/44593255
如果 reducer 里面是用的return fromJS(action.payload),然后 dispatch 同一个 action 在极短的时间内 2 次,导致的结果就是第二次使用的 immutable state 是旧的,它没有被第一次的 action 所更改,这样的后果就是状态丢失了。JS 执行时单线程,所以 reudx 这里并没有 race condition,真正的原因是这两次 dispatch 是在同一 render 桢中运行的,所以它们 mapStateToProps 中原始 state 是相同的,事实上就是第二次修改覆盖了第一次修改(reducer 中使用了 fromJS,而非 mergeDeep)。
解决方案:
好像如果有一个循环,大约 100 多次,在循环体里面 yield select(selctor), 那么可能导致 saga 不工作,但是 redux 还是工作的。
特点是命令行启动,不需要RN启动remote js debugging.只能看React布局,如同Chrome的React插件,不能看网络,不能看Redux。
特点是:独立的Electron程序,集成了react-devtools, Redux, chrome的调试。需要启动remote js debugging,而且要关掉默认的chrome的调试网页。
集成Redux调试工具时,需要添加增强代码。
1 | const composeFuncs = [applyMiddleware( |
1 | // 1. for 普通循环 |
所以,应该优先使用for of,其次for 普通的循环。
APT英文全称:Android annotation process tool是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,使用Annotation进行额外的处理。
Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成源文件和原来的源文件,将它们一起生成class文件。简言之:APT可以把注解,在编译时生成代码。
ButterKnife
BindView绑定View,不需要findViewById了。
dagger
Binds等一些类注释工具