1)细说Bitmap
mini note:
内存模型:在Android 2.3.3(API10)之前,Bitmap的像素数据存放在Native内存,而Bitmap对象本身则存放在Dalvik Heap中。Native内存中的像素数据并不会以可预测的方式进行同步回收,有可能会导致内存升高甚至OOM。而在Android3.0之后,Bitmap的像素数据也被放在了Dalvik Heap中。
内存回收:Android3.0之后,并没有强调Bitmap.recycle();而是强调Bitmap的复用。Android3.0(API 11之后)引入了BitmapFactory.Options.inBitmap字段,设置此字段之后解码方法会尝试复用一张存在的Bitmap。这意味着Bitmap的内存被复用,避免了内存的回收及申请过程,显然性能表现更佳。不过,使用这个字段有几点限制:
声明可被复用的Bitmap必须设置inMutable为true;
Android4.4(API 19)之前只有格式为jpg、png,同等宽高(要求苛刻),inSampleSize为1的Bitmap才可以复用;
Android4.4(API 19)之前被复用的Bitmap的inPreferredConfig会覆盖待分配内存的Bitmap设置的inPreferredConfig;
Android4.4(API 19)之后被复用的Bitmap的内存必须大于需要申请内存的Bitmap的内存;
Android4.4(API 19)之前待加载Bitmap的Options.inSampleSize必须明确指定为1。
计算Bmp内存开销:
1.getByteCount() [since api 12]
2.getAllocationByteCount() [since api 19]
mini note:
Activity.startActivity => Instrumenttation.execStartActivity => ActivityManagerNative.startActivity => ActivityManagerProxy.startActivity => AMS.startActivity =>
我是因为前些天听插件技术分享听得不完全明白,所以要加强学习这块的知识。
mini note:
1. 新建了一个httpserver,通过screenshot.jpg获取截图,通过socket input接口来发送点击信息,通过h264这个接口来获取实时的屏幕视频流。
2. 反射Surface/SurfaceControl的screenshot方法
mini note:
public class FakeApiInterceptor implements Interceptor{
@Override
public Responseintercept(Chain chain) throws IOException {
Response response;
if(BuildConfig.DEBUG && chain.request().url().toString().equals(API_URL)) {
String json ="{\"code\": 200, \"message\": \"success\"}";
response =newResponse.Builder().code(200)
.addHeader("Content-Type","application/json")
.body(ResponseBody.create(MediaType.parse("application/json"), json))
.message(json)
.request(chain.request())
.protocol(Protocol.HTTP_2)
.build();
} else {
response = chain.proceed(chain.request());
}
return response;
}
}