天问

  • Blog
  • 热修复与动态加载
  • python爬虫
  • 专栏
    • 热修复与动态加载
    • NDK开发
    • 设计模式与架构
    • React Native
  • 好文转载
    • 计算机技术
    • 投资理财
    • 摄影与拍照技巧
  • 投稿
  • 关于本站及隐私政策
  • Github
StevenQ
为今天工作,为明天投资,为未来孵化一些东西!
插件化

【插件化】从插件化看Activity的启动流程

关于Activity的启动流程网上有很多分析文章,但绝大部分都是直接分析源码,这是我一直不赞成的一种方式,首先Activity的启动流程非常复杂,如果直接分析源码那么文章必然长篇大论,让人看的云里雾里抓不住重点,只见树木不见森林。另一方面个人认为单纯从理论角度分析源码是没有意义的,分析源码应该是为了解决某一个业务难题或开发疑惑,带着这个问题或疑惑从源码中去探寻解决这个问题的思路或方法。也就是输出倒逼输入。比如现在老板让你做一个Activity的插件化方案,你不知道该如何下手,假设网上也没这方面的资料,那么你是不是可…

2019年2月23日 0条评论 402点热度 5人点赞 天问 阅读全文
插件化

【插件化】开篇总述

前段时间因为工作需要开发环境安全SDK,在开发该SDK的过程中有一个子功能就是检测App是否运行在可信环境中,其中一项就是对虚拟环境的检测,也即多开/分身类App的检测。因此调研了下这类App的实现原理,发现其原理本质上就是通过插件化技术达到在多开App的沙盒环境中免安装运行用户App。检测多开App其实很简单,但是多开App背后的原理插件化却没那么简单甚至可以说是非常复杂,不过我认为也是非常值得我们学习的。首先插件化和热修复一样本身属于安卓应用层安全的范畴,另外在学习插件化的过程中我发现如果能够把插件化的原理了解…

2018年12月15日 0条评论 560点热度 8人点赞 天问 阅读全文
NDK

【NDK开发之】使用cmake编译管理cpp文件

在安卓NDK开发之java JNI技术中已经提到过对于安卓的NDK开发而言,本质上是2大知识体系组成,一部分是java的JNI技术。另一部分就是对c/c++源文件的编译和管理。比如使用ndk-build模式对mk文件进行编译或cmake模式对CMakeList文件进行编译。新版本的Android Studio默认使用cmake对JNI代码进行管理和编译。而不在推荐使用Android.mk和Application.mk进行编译选项配置。 先来看下AS向导创建一个NDK工程之后为我们自动生成的CMakeList文件的内…

2018年10月28日 0条评论 2493点热度 5人点赞 天问 阅读全文
热修复

【native层方法替换热修复原理】之native方法在dalvik虚拟机中的执行流程

在前面【native层方法替换热修复原理】之虚拟机运行时数据结构ClassObject/Class和Method/ArtMethod 中我们讲到了2个重要的数据结构ClassObject和Mehod,也提到了这2个数据结构中的一些重要成员,这一节就来看看native方法在dalvik虚拟机中是如何执行的。也就是dalvik虚拟机中JNI模块的实现原理。 我们已经知道jni中native方法包括2种情况:一种是静态注册,一种是动态注册。不清楚的同学可以查看专栏:NDK开发从入门到精通。 这2种方式注册的native函…

2018年10月14日 0条评论 710点热度 3人点赞 天问 阅读全文
热修复

【native层方法替换热修复原理】之虚拟机运行时数据结构ClassObject/Class和Method/ArtMethod

通过前面热修复与动态加载专栏热修复系列文章的讲解我们知道了以下2点重要信息 在安卓java层,描述dex文件的数据结构是DexFile这个类,PathClassLoader对dex文件的加载在java代码中最终都是委托DexFile调用loadDex完成的 在native层,在dalvik模式下描述dex文件中一个类的数据结构是ClassObject这个类 那么这里就有了另外一个问题,在dalvik虚拟机运行时环境中类和方法是如何描述的呢?Art模式下又是如何描述的呢? 根据前面dex中类的加载流程和unexpec…

2018年10月7日 0条评论 1141点热度 2人点赞 天问 阅读全文
安卓开发

【NDK开发之】SDK体积优化最佳实践

先交代下背景,我们的SDK是一个包含so的aar,主要包括java代码以及so 2大部分,基本不含资源文件。为了安全我们将SDK的核心逻辑放到so中用c/c++代码实现。但是由于我们是SDK,在给我们客户接入的过程中发现某些客户会非常在意体积。尽管实际上我们的体积相对竞品而言已经小了约1M了,但是某些客户仍然要求(期望但不强制)接入我们的SDK后体积增加不能超过500kb同时包含5种主流abi。所以为了给客户更好的用户体验,需要考虑优化SDK的体积,经过一番调研和实践之后减小的体积还是比较客观的。 首先需要明确的是…

2018年9月15日 0条评论 1078点热度 1人点赞 天问 阅读全文
LLVM

llvm IR指令与llvm开发中对应的类与API

在llvm中间语言IR介绍中介绍了llvm中间语言IR相关的语法,重点介绍了指令相关的语法,llvm相关的语法远不止这些,之所以重点介绍指令相关的语法是因为我们学些llvm更多的是为了进行相关中间代码的优化,即基于llvm框架进行开发。而llvm开发本质上就类似用指令去完成函数功能,所以除了学习掌握中间语言IR的语法之外,更需要学会使用llvm提供给我们的API去实现这些功能,也就是需要掌握IR中相应指令在llvm中对应的类与API接口。 llvm的官方文档地址为:http://llvm.org/doxygen/m…

2018年7月14日 0条评论 2662点热度 2人点赞 天问 阅读全文
安卓开发

安卓WebView使用与安全开发指南

在Android中WebView是一个非常重要的控件,虽然在很多情况下绝大部分开发者不会用到该控件,但个人觉得其重要程度丝毫不亚于TextView和RecycleView等我们常用控件,尤其是在hybrid开发中,作为高级开发工程师掌握WebView的使用以及安全问题是最基本的要求之一。 在绝大多数情况下,WebView不会仅仅只是用来进行UI展示,还会和用户进行UI交互同时响应用户的操作。这就涉及到web端的js代码和App端的java代码的相关通信了。 使用WebView有很多需要注意的一些细节,这些在前面讲解…

2018年6月2日 0条评论 418点热度 5人点赞 天问 阅读全文
字节码

使用javassist操作java字节码文件

在使用ASM操作java字节码中我们讲到过主流的修改java字节码的框架包括ASM和javassist,其中ASM的使用在使用ASM操作java字节码中已经讲解过了,这里为何打算讲下javassist操作java字节码文件呢?因为虽然javassist能够完成的功能ASM都能完成,但是在实际的开发过程中发现这2个库其实各具优点,它们分别适合在不同的场景下使用,换而言之,在不同的场景下选择合理的库能够使得我们开发时的代码量和开发时间大大缩短。因此推荐大家对这2个库的使用及其优缺点都能够掌握,这样在实际工作中遇到需要修…

2018年5月27日 0条评论 2393点热度 6人点赞 天问 阅读全文
热修复

从Instant Run看安卓Application的启动流程与替换

关于Application启动流程网上有很多文章分析,但绝大多数文章都是为了讲Application启动流程而讲的,因此绝大多数文章就是分析源码流程,但是大家都懂的,Application启动流程的这个源码是相当的的复杂,绝大多数人看了不一定能够很好的理解,因为源码细节太繁琐,只见树木不见森林,没有一个很好的目标感,而我觉得分析源码最好的方式就是带着某个问题去看,即我要分析这个源码是为了解决什么疑惑?这样才能更好的做到点到为止,能放能收,不过分注重细节,也不漏掉某些重要细节(比如关于Instant Run中类加载器…

2018年4月15日 0条评论 1255点热度 16人点赞 天问 阅读全文
热修复

从ClassNotFoundException看java的类加载机制和Instant Run类加载部分的设计

我们都知道java中的类加载机制采用的是双亲委派机制(其实更严格的说法应该是未经加载过的类采用双亲委派机制加载,已经加载过的不是)。利用这种特性我们可以做到自定义ClassLoader加载额外路径的jar进而做到代码热更新,考虑如下一种场景:在宿主jar中存在一个类X,在该类中存在一个函数someFun,在另外一个插件jar中包含一个和宿主jar同包名同类名的类X,在该类中也存在和宿主jar中X的相同签名的函数someFun,在宿主jar的main函数中调用了类X的someFun函数,那么如何做到让main函数中调…

2018年2月23日 0条评论 1382点热度 16人点赞 天问 阅读全文
安卓安全

安卓源码的下载与编译

最近在研究对脱壳工具dexhunter进行自己需求的定制的时候涉及到了安卓源码的编译,因此记录一下,编译安卓源码是一个坑坑不息之路,各种让你意向不到的错误都会出现,而且因为编译环境的不同,每个人出现的错误可能完全不一样,因此在网上找的解决方案可能对你的环境而言根本不起作用,谁搞过谁就知道,如果说你能够第一次编译就成功的话,那我只能说你可以去买彩票了。 PS:最好自己下载安卓源码编译而不要使用从网上别人分享的网盘下载下来的源码编译,自己在使用别人下载的源码编译的时候遇到过各种奇怪的问题,但是使用自己从谷歌官网下载的源…

2017年10月21日 0条评论 1275点热度 15人点赞 天问 阅读全文
热修复

dex中类的加载流程和unexpected DEX异常

在也谈安卓dex的动态加载与MultiDex和热修复中我们讲解了安卓dex文件的加载过程,那么dex文件加载到内存后类的加载流程是怎样的呢?为何被打上预校验的类与其引用的类不在同一个dex中会出现unexpected DEX异常呢?这就需要从安卓中类加载的native层代码寻找答案了。从native代码我们能够更加清楚的明白QQ空间热修复的插桩字节码的原理以及比QQ空间更优的解决办法。 前面说过加载一个类起始于ClassLoader中的loadClass方法,关键函数的调用流程如下: ClassLoader.loa…

2017年10月15日 0条评论 1206点热度 12人点赞 天问 阅读全文
热修复

也谈安卓dex的动态加载与MultiDex和热修复

在前面从java虚拟机ClassLoader到安卓dex动态加载之ClassLoader动态加载jar的文章中讲到了java中jar的动态加载,而安卓和java一样都是使用的java语言开发,因此最终文件肯定还是字节码,只不过安卓不在使用java虚拟机来加载这些字节码,而且字节码也不再是.class/jar的文件格式,而是安卓特有的dex文件格式。也正因为这些相似性,java中的类加载机制被安卓给借鉴过来了,只不过安卓实现了自己的类加载器,而不在是java中的那些ClassLoader,因为要加载的文件格式已经不同…

2017年10月8日 0条评论 1093点热度 10人点赞 天问 阅读全文
安卓开发

你真的会用View的post方法吗

安卓中在非UI线程中需要更新界面的时候,我们往往使用Handler的post方法或者View的post方法(当然还可以使用Activity的runOnUiThread),当我们已经有一个view对象的时候往往会选择后者,即使用该view对象调用post方法。但是你真的了解View的post方法吗?有没有遇到过View的post的Runnable对象中的代码在某些机型上未被执行?遇到之后深入探究过是什么原因吗? 最近在开发智能无感知SDK的时候遇到过一个很奇怪的坑,这里简单交代下背景,用户点击登录按钮后智能无感知SD…

2019年1月12日 1条评论 992点热度 6人点赞 天问 阅读全文
设计模式

【设计模式之】适配器模式

将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式使用最广泛的就是如下2个场景: 系统需要使用一些已存在的类,但是这些类接口不符合当前系统需要,即接口不兼容 需要一个统一的输出接口,而输入端类型不可预知。通过Adapter抽象将变化的部分隔离出去 对于第一个场景在现实生活中太常见了,比如笔记本的电源适配器,家用电压一般是220v的,但是笔记本的输入电压一般是5v的,所以笔记本的电源线上都会有一个电源适配器用来将原本不兼容的接口(220v)转换为当前笔记…

2019年1月5日 0条评论 468点热度 1人点赞 天问 阅读全文
设计模式

【设计模式之】代理模式与动态代理技术(JDK自带与CGLIB)

代理模式也是实际开发中使用非常频繁的一个设计模式,原因还是我前面提到的,程序是用来解决实际问题的,而实际生活中代理也很常见,比如朋友圈经常看到代购的帖子,在比如在国内访问谷歌,往往需要使用vpn代理。 按照代理类的生成时期来看可以分为静态代理和动态代理。 静态代理:在程序运行前代理类的代码就已确定 动态代理:在运行时动态生成代理类,也就是代理类的字节码.class文件是在运行时才生成的。JDK已经内置了对动态代理功能的提供,即通过反射包Reflect下的Proxy类的newProxyInstance方法配合Invo…

2018年12月22日 0条评论 484点热度 1人点赞 天问 阅读全文
设计模式

【设计模式之】观察者模式

观察者模式是开发中使用非常频繁的一个模式,用的最多地方就是将UI层和业务逻辑层解耦,比如安卓中ListView控件所关联的Adapter的数据变化时通知ListView控件界面更新。观察者模式和发布订-阅模式很类似,很多开发者觉得观察者模式和发布-订阅模式是一回事,但我个人觉得可以认为观察者模式是简化版的发布-订阅模式,但实际上这2者有着本质的区别,具体的区别请看文末的说明。前者比后者要简单的多,后者多用在跨组件消息传递上,用来简化组件间的通信,如EventBus。 将UI层和业务层逻辑解耦 跨组件传递消息(此时实…

2018年12月8日 0条评论 500点热度 4人点赞 天问 阅读全文
设计模式

【设计模式之】策略模式

策略模式也是使用非常广泛的一种设计模式,因为程序往往是用来解决实际问题的,而在实际生活中很多问题往往不止一种解决方案。也就是说解决该问题可以使用不同的算法或者在不同情形下需要使用不同算法。这种场景我们就可以将不同算法抽象为不同的策略,在程序运行时根据实际情况选择不同的策略。 同一个场景/问题有多种不同解决方案。传统的做法就是使用if-else或者switch-case根据不同参数选择不同解决方案。但这种做法代码耦合度高,不易于日后的扩展。一旦随着项目推移,if-else或者switch-case部分很可能越来越臃肿…

2018年12月2日 0条评论 395点热度 1人点赞 天问 阅读全文
设计模式

【设计模式之】工厂方法模式

在讲工厂方法模式之前先来看看简单工厂模式,虽然简单工厂模式不属于23种设计模式的范畴,但是前面提到过,学习设计模式以应用为主,简单工厂模式在实际开发中使用的场景也是很多的,在Android源码和很多知名开源项目中都能看到简单工厂模式的身影。 应用场景:工厂方法模式的应用场景和简单工厂模式差不多。 工厂方法模式对于简单工厂模式而言,主要是克服了简单工厂模式在工厂类创建新的产品类的时候扩展性差的问题。比如上面的实例,如果要增加一个VolleyPlus框架,那么需要首先需要增加一个VolleyPlusClient类实现I…

2018年11月25日 0条评论 562点热度 4人点赞 天问 阅读全文
设计模式

【设计模式之】建造者模式

本文讲解的Builder模式并非设计模式中定义的经典的Builder模式(即包含指挥者类Director),因为在实际开发和android上的一些知名的开源项目中看到的都是非经典的模式。关于Builder模式的经典模式的定义可参看:https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html 。 隔离复杂对象的创建和使用。 需要创建的类有复杂的内部结构:表现特征为:这个类包含多种不同签名的构造函数。或包含大量…

2018年11月24日 0条评论 394点热度 1人点赞 天问 阅读全文
设计模式

【设计模式之】OOP六大基本原则与单例模式

在看某些知名的Android开源项目的时候,比如Volley(个人觉得该开源项目是面向接口编程的绝佳典范,可扩展性极强,强烈推荐每一个想设计出优秀框架的人学习),OKhttp等,发现他们某些代码逻辑实现很优雅,而且可扩展性很强(表现出来的特征就是某些功能具备很强的用户自定义性),这里其实就是运用到了一些设计思想,比如OOP六大原则和设计模式等。再加上本来一直对设计模式比较感兴趣,所以后面打算系统的学习下设计模式,然后根据学习与理解整理一个设计模式系列的专题。 重在应用:也就是是说我不会过多的去讲这个设计模式的定义,…

2018年11月18日 0条评论 1032点热度 5人点赞 天问 阅读全文
12345…6

天问

追梦追自由,穷则独善其身,达则兼济天下

最新 热点 随机
最新 热点 随机
【插件化】从插件化看Activity的启动流程 你真的会用View的post方法吗 【设计模式之】适配器模式 【设计模式之】代理模式与动态代理技术(JDK自带与CGLIB)
llvm IR指令与llvm开发中对应的类与API 【设计模式之】OOP六大基本原则与单例模式 【native层方法替换热修复原理】之虚拟机运行时数据结构ClassObject/Class和Method/ArtMethod 你真的会用View的post方法吗
小伙伴们(排名不分先后)

尼古拉斯赵四

布兰柯基

 

COPYRIGHT © 2022 天问 ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang