Android rom解包打包

最近查一个特定rom的bug,打算反编译rom查看rom中的源码,于是总结了下大致的方式。

修改Android Gradle plugin的aapt路径

最近在做一套Andorid插件化方案,在解决资源id冲突的问题时,采用的是修改aapt的方式来做的,修改aapt的方式遇到的最大的问题就是编译插件的时候得替换sdk中的aapt,或者采用自己写的脚本来编译,这样开发过程肯定是很不方便的。因此本文尝试在Gradle plugin上修改aapt路径。

Android模拟后台进程被杀

Android开发中,有时候我们需要测试下后台进程被杀,然后重新进入App时恢复现场的case。如果采用填充内存的方式,比较麻烦,下面介绍几种快速模拟后台进程被杀的方式:

解决QQ登录SDK不能网页授权登录的问题

现象

QQ登录SDK在用户设备没有安装手机QQ客户端的情况下,默认是会调起网页授权的,但是可能是因为腾讯的某些限制,新申请的app_id都无法使用网页授权,打开后有些是跳转到下载手Q页面,有些是一直显示“正在打开授权登录页…”

从一次实例的注入看ClassLoader的一个坑

背景

在Android上使用MediaPlayer时发现某些情况下的会导致莫名的NPE:

java.lang.NullPointerException
at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2398)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5331)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:832)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:648)
at dalvik.system.NativeStart.main(Native Method) 

从淘宝广告SDK看Instrumentation注入

用途

监听Activity的创建,生命周期等

ApplicationContext、ActivityContext、ViewContext和ContextImpl(BaseContext)的区别

ContextWrapper

  • ContextWrapper 是 ContextImpl(也就是BaseContext) 的包装,所有对 ContextWrapper 的操作都会用代理到 BaseContext 上。
  • Application和Activity和Service都继承自ContextWrapper
  • android.content.ContextWrapper#getApplicationContext 获得Application实例,和Application.this 是同一个对象。因此Activity.getApplicationContext == Application.getApplicationContext == Service.getApplicationContext == Application.this == Activity.getApplication
  • android.content.ContextWrapper#getBaseContext 都获得的是ContextImpl对象。

Android中Touch事件分发过程全解析

分发过程

1
2
 首先事件从native分发,会传递给 ViewRootImpl.WindowInputEventReceiver.onInputEvent ,然后会经过ViewRootImpl的分发到DecorView,DecorView会根据之前给Window设置的CallBack(具体可以参考Activity的启动过程系列文章),也就是Activity,会调用Activity的dispatchTouchEvent,然后Activity会调用DecorView的superDispatchTouchEvent,从而开始到ViewHierarchy的事件分发。
 ViewHierarchy中事件分发,简单来说就是ViewGroup.dispatchTouchEvent->ViewGroup.onInterceptTouchEvent->View.dispatchTouchEvent->View.OnTouchListener.onTouch->View.onTouchEvent,具体过程如下:

1px图片的Crash

问题描述

最近在项目中遇到一个奇葩的Crash,在创建bitmap时Crash,log如下:

java.lang.IllegalArgumentException: width and height must be > 0
  at android.graphics.Bitmap.nativeCreate(Native Method)
  at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
  at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
  at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
  at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:614)
  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:589)
  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439)
  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
  at android.content.res.Resources.loadDrawable(Resources.java:1709)
  at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
  at android.view.View.<init>(View.java:1952)
  at android.widget.ImageView.<init>(ImageView.java:112)
  at android.widget.ImageView.<init>(ImageView.java:108)

Selector的一个坑

创建selector时,有个小坑,就是默认没有指明任何状态的item必须写在末尾。因为系统会拿第一个item去匹配当前状态,如果没有指明state的item放在第一个的话,会匹配任何state,会造成与实际期望的效果不符合的情况。
参考:http://developer.android.com/intl/zh-cn/guide/topics/resources/drawable-resource.html#StateList

Note: Remember that Android applies the first item in the state list that matches the current state of the object. So, if the first item in the list contains none of the state attributes above, then it is applied every time, which is why your default value should always be last (as demonstrated in the following example).