android系统 修改优化,修改Android系统源代码,优化开机速度。
通常情况下,Android系统开机保持在20s~25s应该算是合格比较好的状态。
最近几天在看关于Android系统开机启动过程的相关内容。做个笔记。
关于有话Android系统开机时间有话,采取三个措施有话,修改ZygoteInit.java。 Android系统开机启动过程这里就不说了,网上很多大牛对应的文章。
1. 修改ZygoteInit.java 中预加载资源函数preload() , preloadClasses(); 与 preloadResources(); 并行加载。
2. 修改读取配置信息过程中GC频率。
3. 提升进程优先级。
1.
static void preload() {
//
Thread preloadRsThread = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//将该资源加载放在子线程中 。加载资源文件要比加载classes文件要快,因此这里不提升子线程优先级。
preloadResources();
}
}) ;
preloadRsThread.start() ;
preloadClasses();
//wait preloadRes complete.
try {
preloadRsThread.join() ;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//暴露什么问题。
preloadOpenGL();
}
2.
/**
* Performs Zygote process initialization. Loads and initializes
* commonly used classes.
*
* Most classes only cause a few hundred bytes to be allocated, but
* a few will allocate a dozen Kbytes (in one case, 500+K).
*/
private static void preloadClasses() {
final VMRuntime runtime = VMRuntime.getRuntime();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(
PRELOADED_CLASSES);
if (is == null) {
Log.e(TAG, "Couldn't find " + PRELOADED_CLASSES + ".");
} else {
Log.i(TAG, "Preloading classes...");
long startTime = SystemClock.uptimeMillis();
// Drop root perms while running static initializers.
setEffectiveGroup(UNPRIVILEGED_GID);
setEffectiveUser(UNPRIVILEGED_UID);
// Alter the target heap utilization. With explicit GCs this
// is not likely to have any effect.
float defaultUtilization = runtime.getTargetHeapUtilization();
runtime.setTargetHeapUtilization(0.8f);
// Start with a clean slate.
System.gc();
runtime.runFinalizationSync();
Debug.startAllocCounting();
try {
BufferedReader br
= new BufferedReader(new InputStreamReader(is), 256);
int count = 0;
String line;
while ((line = br.readLine()) != null) {
// Skip comments and blank lines.
line = line.trim();
if (line.startsWith("#") || line.equals("")) {
continue;
}
try {
if (false) {
Log.v(TAG, "Preloading " + line + "...");
}
Class.forName(line);
//减少GC频率,modify begin
if (count%128==0&&Debug.getGlobalAllocSize() > PRELOAD_GC_THRESHOLD) {//end
if (false) {
Log.v(TAG,
" GC at " + Debug.getGlobalAllocSize());
}
System.gc();
runtime.runFinalizationSync();
Debug.resetGlobalAllocSize();
}
count++;
} catch (ClassNotFoundException e) {
Log.w(TAG, "Class not found for preloading: " + line);
} catch (UnsatisfiedLinkError e) {
Log.w(TAG, "Problem preloading " + line + ": " + e);
} catch (Throwable t) {
Log.e(TAG, "Error preloading " + line + ".", t);
if (t instanceof Error) {
throw (Error) t;
}
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
throw new RuntimeException(t);
}
}
Log.i(TAG, "...preloaded " + count + " classes in "
+ (SystemClock.uptimeMillis()-startTime) + "ms.");
} catch (IOException e) {
Log.e(TAG, "Error reading " + PRELOADED_CLASSES + ".", e);
} finally {
IoUtils.closeQuietly(is);
// Restore default.
runtime.setTargetHeapUtilization(defaultUtilization);
// Fill in dex caches with classes, fields, and methods brought in by preloading.
runtime.preloadDexCaches();
Debug.stopAllocCounting();
// Bring back root. We'll need it later.
setEffectiveUser(ROOT_UID);
setEffectiveGroup(ROOT_GID);
}
}
}
3.
// ZygoteInit.java入口
public static void main(String argv[]) {
try {
//优化开机速度 begin
/* 20150127 begin */
//获取当前进程优先级
int currentPriority = Process.getThreadPriority(Process.myPid()) ;
//提升当前进程优先级。
Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO) ;
/* 20150127 end */
// Start profiling the zygote initialization.
SamplingProfilerIntegration.start();
// 1.注册socket服务端
registerZygoteSocket();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
// 5.加载资源
preload();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
// Finish profiling the zygote initialization.
SamplingProfilerIntegration.writeZygoteSnapshot();
// Do an initial gc to clean up after startup
gc();
/* 20150127 begin */
Process.setThreadPriority(currentPriority) ;
/* 20150127 end */
//优化开机速度 end
// Disable tracing so that forked processes do not inherit stale tracing tags from
// Zygote.
Trace.setTracingEnabled(false);
// If requested, start system server directly from Zygote
if (argv.length != 2) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
// 2. 调用starySystemServer()方法
if (argv[1].equals("start-system-server")) {
startSystemServer();
} else if (!argv[1].equals("")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
Log.i(TAG, "Accepting command socket connections");
//3.循环监听并接收客户端请求。
runSelectLoop();
//关闭socket
closeServerSocket();
} catch (MethodAndArgsCaller caller) {
// 4 《深入理解Android卷1》作者说这里比较重要
caller.run();
} catch (RuntimeException ex) {
Log.e(TAG, "Zygote died with exception", ex);
closeServerSocket();
throw ex;
}
}
4.修改gc调用阀值
/** when preloading, GC after allocating this many bytes
*
* 20150127 优化开机速度
*/
//- private static final int PRELOAD_GC_THRESHOLD = 50000;
private static final int PRELOAD_GC_THRESHOLD = 64*1024*1024;
/*20150127 优化开机速度 end*/
另外,Android系统启动过程中,会预先加载资源文件,这些文件中,包含了很多系统应用会频繁使用到的资源文件,比如图片资源等。因此,我们自己的新添加其他的部分资源也可以预先加载到内存,
这样不仅提升响应速度,而且也可以加快应用的冷启动速度。
Android系统性能优化是个大工程,从一个小小的细节出发,或许能收获哪怕几百毫秒的时间,也是不错的。细节决定成败。
关于进程优先级:
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //设置线程优先级为后台,这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理,有以下几种:
int THREAD_PRIORITY_AUDIO ;//标准音乐播放使用的线程优先级
int THREAD_PRIORITY_BACKGROUND ;//标准后台程序
int THREAD_PRIORITY_DEFAULT ;// 默认应用的优先级
int THREAD_PRIORITY_DISPLAY ;//标准显示系统优先级,主要是改善UI的刷新
int THREAD_PRIORITY_FOREGROUND ; //标准前台线程优先级
int THREAD_PRIORITY_LESS_FAVORABLE ;//低于favorable
int THREAD_PRIORITY_LOWEST ;//有效的线程最低的优先级
int THREAD_PRIORITY_MORE_FAVORABLE ; //高于favorable
int THREAD_PRIORITY_URGENT_AUDIO ;//标准较重要音频播放优先级
int THREAD_PRIORITY_URGENT_DISPLAY ;//标准较重要显示优先级,对于输入事件同样适用。
Android系统开机优化,可以修改的地方还有很多。后续会补上。
此外,Android开机过程中,PackageManagerService会扫描系统内置apk,因此这个过程也是耗费时间比较长的。
在这个过程中下功夫还是很有必要。
比如odex优化等。
android系统 修改优化,修改Android系统源代码,优化开机速度。相关推荐
- android odex版本调试_Android开启odex开关和开机速度优化
开odex优化首次开机速度,是牺牲空间换取时间的做法,仅限于空间足够的设备.开了odex之后,在编译的时候,整个system image就会被预先优化.由于在启动时不再需要进行app的dex文件进行优 ...
- 简单几步优化你的windows,加快开机速度(重装windows之后要做的几件事)
每个人都想要让自己的系统运行得快一些,开机快一些,我就来说说我自己的经验,我使用的系统是windows8.1,当然这有些方法也适用于其他的系统,我每次重装完系统之后第一件事就是下面几步,当然重装系统之 ...
- 不要相信修改注册表EnablePrefetcher文件达到加速开机速度的说法
EnablePrefetcher就是系统文件预读设置,默认是3代表系统将预读Windows系统文件和应用程序.所有系统预读文件都存放在 c:\windows\prefetch文件夹内,扩展名为PF,包 ...
- 如何利用注册表修改开机启动程序并提高电脑开机速度!
利用注册表修改开机启动程序: 修改以下三个地方就可以了,最主要的是Run这个地方.[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersi ...
- MTK android系统源码修改快速上手
1.拷贝代码仓库 从git@192.168.1.3:a89.git 到work目录下: cbk@YCS:~/work$ ll cbk@YCS:~/work$ rm -rf a89/ cbk@YCS:~ ...
- 修改MTK平台Android P系统支持系统A/B分区升级
文章目录 一.device目录下的修改 二.kernel 目录下的修改 三.lk目录下的修改 四.preloader目录下的修改 五.修改img分区大小 六.Android A/B System OT ...
- 【android开发】修改主题theme(系统自带样式总结)
很多情况下,我们要适当的改变开发系统的样式以满足项目的需求,这个就需要我们了解一下android系统自带的样式有哪些,具体是什么作用!因为今天遇到了一个问题,写了一个自定义的软键盘,发现每一个按钮的提 ...
- android 修改 dpi_设计规范 | Android系统
一.基础概念 1.1 屏幕尺寸 屏幕尺寸指的是手机屏幕的物理尺寸,一般用屏幕对角线长度表示,以英寸(inch)为单位.如,小米M4尺寸为5英寸. 1.2 屏幕密度 由于Android属于开源系统,任何 ...
- 安卓修改电池容量教程_安卓(Android)系统电池电量修改图文教程
安卓( Android )系统电池电量修改图文教程 有机友不喜欢新 rom 的电池图标, 想要官方的原版电池 图标,也有机友想更换其他电池图标.为了方便想更换电池 图标的机友,发一个最简易的教程. 在 ...
最新文章
- html5 css3雪花效果,HTML5 | CSS3水晶皇冠雪花形状
- 一张自拍变6种风格漫画,视频也支持,全程稳定不“掉线”,这个AI不到一天狂揽1800赞...
- Java学习之 多态 Polymorphism
- Docker操作容器2
- Windows——双系统环境下没有启动Windows 启动管理器(自动跳过操作系统选择界面)解决方案
- Hive mysql 内连接_Hive-表连接 | 学步园
- oracle导出BOM文件,ORACLE ERP导数据(BOM清单)-备份恢复-Oracle频道-中国IT实验室
- 如何修改TextView链接点击实现(包含链接生成与点击原理分析)
- (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)
- Android性能优化-Render篇
- Xcode不出错误提示,Indexing | Processing files
- Android 音视频开发学习思路大纲
- 尚硅谷WebService技术精讲教程
- 计算机学院方阵入场词,学校运动会方阵入场解说词
- vb access mysql_vb连接access数据库
- Connection: keep-alive——[HTTP权威指南]摘录
- linux中静态库和动态库的区别,Linux下静态库和动态库的区别
- 安全优雅的RESTful API签名实现方案(手机端)
- wts文件生成engine文件的方法
- 陶哲轩实分析 5.2 节习题试解
热门文章
- async/await剖析
- java html转图片_Python一键转Java?“Google翻译”你别闹
- tcp并发服务器_在Go中构建并发TCP服务器
- r语言中的shiny教程_如何使用Shiny在R中编写Web应用程序
- linux 穿件文件_关于Linux的25件事
- (30)Gulp 文件操作
- HTML5 Web Storage事件
- windows7计算机管理,windows7计算机管理
- Python依赖文件requirements.txt的生成和安装
- 摄像头系统linux,Linux摄像头编程