【android面试】2019年知识点总结(2)

【上一篇 android面试 2019年知识点总结(1)】

异常数据捕获问题

CrashHandler

android程序非常容易crashcrash之后,我们需要知道程序在哪里挂掉,时间点,手机的机型,屏幕,内存情况等等。所以,我们需要CrashHandler

一个标准的CrashHandler这样用:

  1. 定义CrashHandler
public class CrashHandler implements Thread.UncaughtExceptionHandler {
    private Context mContext;
    private Thread.UncaughtExceptionHandler mDefaultExceptionHandler;

    @Override
    public void uncaughtException(Thread t, Throwable e) {
    		// 把异常信息,保存到SD卡,等待上传到服务,或者本地查看
    		// 注意:要通知下文件系统,文件发生改变,不然可能adb命令读不到,这里没做
        dumpToSDCard(t, e); 
        e.printStackTrace();
        if (mDefaultExceptionHandler != null) { //交给系统的UncaughtExceptionHandler处理
            mDefaultExceptionHandler.uncaughtException(t, e);
        } else {
            Process.killProcess(Process.myPid()); //主动杀死进程
        }
    }
    
    public void init(Context context) {
        this.mContext = context;
        mDefaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();//获取当前默认ExceptionHandler,保存在全局对象
        Thread.setDefaultUncaughtExceptionHandler(this);//替换默认对象为当前对象
    }

 }
  1. 初始化 CrashHandler

然后一般在ApplicationonCreate方法,初始化这个CrashHandler对象。

  class MyApplication extends Application {
      @Override void onCreate() {
      	// 一般采用单例模式,上面代码省略了
      	CrashHandler handler = CrashHandler.getInstance();
      	handler.init(this);
  }

源码说明:

Thread类有一个异常处理器,获取方式如下:

上面init方法,就调用了 Thread.getDefaultUncatchExceptionHandler(),得到异常处理器。

Thread类还有一个静态方法 setDefaultUncatchException(UncaughtExceptionHandler handler) ,可以在发生异常时,监听异常的发生。 handler要实现方法:public void uncaughtException(Thread t, Throwable e), 我们在这个方法里处理异常信息,可以保存异常信息到文件,上传该文件, 还可以杀死进程。

mutidex

app的总体方法数有65536的个数限制,会导致一些问题:

  1. 编译出问题,抛异常 DexIndexOverflowException, 相信很多人遇到过。
  2. 低版本的系统上安装错误。 Optimization failed. mutidextest-2.apk@classes.dex res = 65589
    所以我们需要拆包,把构建生成的dex文件,拆分成多个。
    mutidex可以解决这个问题。
    android的sdk提供了工具帮助开发者分包:5.0以前提供 android-support-mutidex.jar包。

自己在项目中可以通过gradle配置:

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"
    defaultConfig {
        applicationId "graphic.com.game"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        multiDexEnabled true 
    }
}

dependencies {
	
	implement ...
	// 引入 multidex 包
	implement 'com.android.support:multidex:1.0.0'

}

还差一步,就可以实现分包工作了:

  • Application 继承 MutiDexApplication,

  • 或者在 Application的 attachBaseContext(Context context) 方法中,调用:

MultiDex.install(this);

通过这样,超过65536个方法,项目中的 dex文件就会被拆分成多个 dex文件。

动态加载,插件技术

这种技术,需要的功底挺深厚的,参考一个项目:dynamic-load-apk

逆向,反编译技术

建议去看尼古拉斯-赵四的博文。

安全技术是学不完的,这辈子都学不完的~~ 摔!!!!

参考:
1.《Android艺术开发探索》第13章 综合技术
2. CrashHandler–程序异常退出处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值