추천: "2020 안드로이드 면접 질문 요약 [컬렉션] "
안드로이드의 주요 성능은 응답 속도와 UI 새로 고침 속도입니다.
블로그를 참조할 수 있습니다: Android 시스템 성능 튜닝 도구 소개
우선, 기능 시간이 많이 걸린다는 측면에서, 기능 시간을 측정하는 데 사용되는 androidsdk에 내장된 TraceView 도구가 있습니다. 태워 버리는.
UI 레이아웃 분석은 두 부분으로 구성될 수 있습니다. 하나는 보기의 레이아웃 수준과 각 보기의 새로 고침 및 로드 시간을 볼 수 있습니다.
이렇게 하면 가장 오래 걸리는 레이아웃과 보기를 빠르게 찾을 수 있습니다.
또 다른 옵션은 보기를 사용자 정의하여 보기 수준을 줄이는 것입니다.
메모리 누수는 어려운 문제입니다.
메모리 누수는 언제 발생하나요? 메모리 누수의 근본 원인: 수명이 짧은 개체를 보유하는 수명이 긴 개체입니다. 수명이 짧은 개체는 제때에 해제될 수 없습니다.
I. 정적 컬렉션 클래스로 인해 메모리 누수가 발생합니다.
주로 해시맵, 벡터 등입니다. 이러한 컬렉션이 정적 컬렉션인 경우 null이 시간에 설정되지 않으면 이러한 객체는 항상 유지됩니다.
II.remove 메소드는 Objects.hash(firstName, lastName) 세트를 삭제할 수 없습니다.
테스트 후 해시코드가 수정된 후에는 제거할 수 있는 방법이 없습니다.
III.observer 리스너를 사용할 때 xxxlistener를 추가하는 경우가 많지만, 필요하지 않을 때 xxxlistener를 제거하는 것을 잊어버리면 메모리 누수가 발생하기 쉽습니다.
방송이 수신자를 등록 취소하지 않습니다
IV. 다양한 데이터 링크가 닫히지 않습니다. 데이터베이스 콘텐츠 제공자, io, sokect 등. 커서
V. 내부 클래스:
Java의 내부 클래스(익명 내부 클래스)는 호스트 클래스에 대한 강력한 참조를 보유합니다.
따라서 새 스레드와 같은 백그라운드 스레드 작업인 경우 스레드가 끝나지 않으면 활동이 재활용되지 않습니다.
컨텍스트 참조, TextView 등은 컨텍스트 참조를 보유합니다. 정적 드로어블이 있으면 메모리가 해제되지 않습니다.
VI. 싱글톤
싱글톤은 복사된 클래스 A를 보유할 때 A를 해제할 수 없으며 메모리가 누수됩니다.
프로그램에서 "대형" 메모리를 적용해야 하는데 GC 작업을 수행한 후에도 가상 머신이 제때에 이를 제공할 수 없는 경우
이 경우 OOM인 OutOfMemoryException이 발생합니다
단일 앱이 전체 시스템에 미치는 영향을 줄이기 위해 Android는 각 앱에 메모리 제한을 설정합니다.
public void getMemoryLimited(Activity context) { ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); System.out.println(activityManager.getMemoryClass()); System.out.println(activityManager.getLargeMemoryClass()); System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024)); }
HTC M7 실제 측정, 상한은 192M입니다. 512M 일반적인 상황에서는 192M이 상한이지만, 일부 특수한 상황으로 인해 안드로이드에서는 더 큰 RAM 사용을 허용합니다.
I. 해시맵 대신 ArrayMap/SparseArray
II. Android에서 Enum 사용을 피하세요
III.SampleSize: 스케일링 비율, 로드 전. 이미지를 메모리에 저장하려면 대용량 이미지를 불필요하게 로드하는 것을 방지하기 위해 적절한 크기 조정 비율을 계산해야 합니다.
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192 09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 512 09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192
에서 포착되지 않은 예외를 잡는 방법은 Thread.UncaughtExceptionHandler
를 구현하는 것입니다. oncreate에 애플리케이션을 등록하세요. 5.ANR이란 무엇인가요? ANR 방지 및 해결 방법 (중요) ANR->애플리케이션이 응답하지 않습니다즉, 지정된 시간 내에 응답이 없습니다. 세 가지 유형: 1) KeyDispatchTimeout(5초) -- 주요 유형의 키 또는 터치 이벤트가 특정 시간 내에 응답하지 않습니다. 2) --BroadcastReceiver는 일정 시간 내에 처리할 수 없습니다. 특정 시간 3) ServiceTimeout(20초) - 특정 시간 내에 서비스 유형을 처리할 수 없는 가능성이 있습니다. 시간 초과 이유: 이벤트가 처리될 기회가 없습니다. ANR을 피하는 방법ANR의 핵심 처리 타임아웃이므로 UI 스레드, BroadcastReceiver 및 서비스 메인 스레드에서 복잡한 로직 및 계산 처리를 피하고 작업에 넘겨야 합니다. 작업용 스레드입니다. 1) oncreate 및 onresume에서 시간이 많이 소요되는 작업을 피하세요2) onReceiver에서 너무 많은 작업을 수행하지 마세요3) Intent Receiver에서 액티비티를 시작하지 마세요. 새 화면이 생성되고 도용되기 때문입니다. 현재 사용자가 실행 중인 프로그램에서 포커스를 받습니다.4)尽量使用handler来处理UI thread & workthread的交互。
首先定位ANR发生的log:
04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstarted
CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用情况04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
从log可以看出,cpu在做大量的io操作。
所以可以查看io操作的地方。
当然,也有可能cpu占用不高,那就是 主线程被block住了。
1)共享变量(内存)
2)管道
3)handle机制
runOnUiThread(Runnable)
view.post(Runnable)
Dalvik进程。
每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。
所以dalvik进程和linux进程是可以理解为一个概念。
从小到上就是:
linux kernel,lib dalvik vm ,application framework, app
activitymanager.getMemoryClass() 获取内存限制。
关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。
1)main code
2) unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.
google建议只把启动图片放入。
5)lib
6)color
文件的系统权限是由linux系统规定的,只读,读写等。
运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。
Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。
简单来说framework就是提供app生存的环境。
1)Activity在attch方法的时候,会创建一个phonewindow(window的子类)
2)onCreate中的setContentView方法,会创建DecorView
3)DecorView 的addview方法,会把layout中的布局加载进来。
线程间的通信可以参考第6点。
进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,
Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。
屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。
dp来适配屏幕,sp来确定字体大小
drawable-xxdpi, values-1280*1920等 这些就是资源的适配。
wrap_content,match_parent, 这些是view的自适应
weight,这是权重的适配。
Android Interface Definition Language
AIDL是使用bind机制来工作。
参数:
java原生参数
String
parcelable
list & map 元素 需要支持AIDL
参考:android 进程/线程管理(一)----消息机制的框架 这个系类。
android 事件分发机制
EventBus,广播,view.post, runinUiThread
但是无论各种花样,本质上就2种:handler机制 + 广播
必须可以。子线程 可以new 一个mainHandler,然后发送消息到UI Thread。
视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。
属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0
帧动画,通过drawable一帧帧画出来。
Gif动画,原理同上,canvas画出来。
具体可参考:https://i.cnblogs.com/posts?categoryid=672052
overridePendingTransition
view的更新必须在UI thread中进行
surfaceview会单独有一个线程做ui的更新。
surfaceview 支持open GL绘制。
I.EventBus 事件分发机制,由handler实现,线程间通信
II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
III.百度地图
IV.volley
V.fastjson
VI.picciso
VII.友盟
VIII.zxing
IX.Gson
pull2RefreshListView
package com.joyfulmath.samples.Cycle;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;/** * Created by Administrator on 2016/9/11 0011. */public class CycleView extends View { Paint mPaint = new Paint(); public CycleView(Context context) { this(context, null); } public CycleView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(100,100,50,mPaint); } }
CycleView
关键是canvas.drawCycle & paint.setsytle(stoken)
可以不需要adapter
TBD.
QQ & 微信都有第三方登陆的sdk,要去注册app
需要看支付宝的API文档
위 내용은 안드로이드 고급 면접 질문과 답변 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!