分类目录归档:Android进阶

Android进阶

Android获取url重定向之后的地址

         有些时候,我们拿到的url地址是需要通过重定向之后,才能得到真实地址的,例如当服务端返回的response code为301,302,303,307值得时候。下面给出两种获取url重定向地址的方法源码下载

方法一

         直接将重定向交给HttpURLConnection完成,调用它的setInstanceFollowRedirects(true)方法,这样一来重定向对于外部来说是透明的,我们完全感知不到重定向的发生,但是我们没有办法截获重定向的过程,并且对于重定向次数有限制,如果超过4次的重定向,后续的重定向将会被忽略。下面直接贴代码 继续阅读

Android多渠道打包工具

        Anndroid app在发布的时候通常会发布到多个渠道,为了分析各个渠道的数据,需要打不通的渠道包,通常情况下,不通的渠道包也就是渠道号码不一样而已,所以只需要通过脚本对Manifest中的渠道号修改之后重新打包就可以搞定了。

        下面是采用Ruby Rakefile写的一个多渠道打包脚本,如果你对Ruby有一定了解,那么恭喜你,这个脚本很适合你。

继续阅读

LeakCanary让Android内存泄漏无处遁形

        在以前的文章中我讲到过如何使用eclipse和MAT分析内存泄漏(Android内存泄漏分析实战),但是这样的分析往往发生在内存泄漏之后,只能是亡羊补牢。那么我们能不能更早的发现内存泄漏呢?答案是肯定的,LeakCanary能够做到。延伸阅读(LeakCanary源码解析)

LeakCanary best practice

LeakCanary best practice

继续阅读

Android防止代码注入攻击

Shared storage cannot protect your application from code injection attacks

从Android4.1.2开始,App不能直接从sdcard中加载字节码,因为sdcard对于所有应用程序来说是共享的,为了防止恶意的代码注入,当采用DexClassLoader从sdcard中动态加载字节码的时候,就会抛出异常,
Caused by: java.lang.IllegalArgumentException: Optimized data directory /storage/emulated/0 is not owned by the current user. Shared storage cannot protect your application from code injection attacks.

源码分析

下面是DexFile的源代码,通过Libcore.os.getuid() != Libcore.os.stat(parent).st_uid判断文件的user id和进程的user id是否一致。如果不一致则抛出异常。
继续阅读

Android动态加载字节码

概述

面对App业务逻辑的频繁变更,如果每一次改变都对App进行一次升级,会降低App的用户体验,那么App进行模块化升级(这里与增量升级是不同的)是很好的解决方案,让用户在完全无感觉的情况下改变App中的业务逻辑。要实现这种模块化升级,动态加载字节码(jar/dex)就是实现这个需求的理论基础。

Android系统加载字节码

Android的虚拟机(Dalvik VM)无法识别普通jar包中的字节码,所以需要通过字节码转换工具将jar转换成dex,jar包中的所有字节码都会打进classes.dex,这样的字节码才能被Dalvik虚拟机识别。

实例讲解

源码下载,需要准备两个工程,一个Android工程(AndroidPractice),Android工程中去加载字节码。宁外一个普通的java工程(DexModule),下面看看工程结构。需要注意的是IDynamicLoad这个接口在两个工程中都需要,且包名一致。 继续阅读