大家好,km_v1.0.2.apk破解版5.7相信很多的网友都不是很明白,包括Android Dalvik 使用详解也是一样,不过没有关系,接下来就来为大家分享关于km_v1.0.2.apk破解版5.7和Android Dalvik 使用详解的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
阅读5分钟,每日十点、和您一起终身学习,这里是程序员Android
Android虚拟机是app运行的基石,本篇主要参考MTK解决方案,部分方案仅适合MTK平台手机。
通过本篇文章阅读,你将收获以下知识点:
1.Java语言在Android上运行流程
2.虚拟机发展过程
3.AndroidDalvik模式
4.AndroidN中dex2oat原理以及模式
5.如何判断dex2oat采用的相关参数
6.如何查看dex2oat的log
7.什么时候进行dex2oat
8.手机反应慢的原因
9.解决手机反应慢的方法
1.Java语言在Android上运行流程
Java语言在android运行流程
2.虚拟机发展过程
1.初期Dalvik2.中期Dalvik3.后期ART模式为了让APK在不同的虚拟机都可以运行,Google采取了适配器模式,在让虚拟机运行之前先执行dexopt,即将dex文件优化成odex文件,可以让虚拟机更加优化的执行。在ART虚拟机中,dexopt将dex文件优化成二进制格式的问题,从而可以让ART虚拟机执行。dexopt会调用dex2oat进行优化,dex2oat的任务是将原来的dex文件进行预翻译,从而可以加快app运行的时间,但是由于某些app比较复杂,所以优化的时间就比较长。优化是以dex文件中的Method方法为单位,dex2oat在优化时候,会根据需求优化一定量的Method,即不是所有的Method都回翻译成oat模式。3.AndroidDalvik模式
根据优化Method量的多少分的模式
AndroidDalvik
4.AndroidN中dex2oat原理以及模式
N版本当中强化了JIT模式。JIT模式是Justintime的简称。意思是在运行的时候,根据method有使用频率来决定是否要对某一个方法进行优化。虚拟机会统计每一个方法被执行的次数。如果某一个方法执行的次数比较多,达到一定的阈值,就会将升级为hotmethod,并将其记录在一个profile当中。在系统空闲并且在充电的时候,只将这些方法进行优化。在运行的时候,也会对这些方法进行优化,以方便在运行的时候使用。
1.AndroidNdex2oat模式图AndroidNdex2oat模式图
2.AndroidNdex2oat原理图AndroidNdex2oat原理图
5.如何判断dex2oat采用的相关参数
dex2oat的参数会在代码中通过如下函数打印
L版本L版本会无条件打印
timings.StartTiming("dex2oatSetup");
1436LOG(INFO)<<CommandLine();
2.M和N版本在M和N当中会有条件的打印不同的内容。
例如在会在debug版本中打印非常详细的dex2oat参数,而在非debug版本中打印部分内容。
if(kIsDebugBuild||dex2oat.IsImage()||dex2oat.IsHost()||!kIsTargetBuild){n2144LOG(INFO)<<CommandLine();n2145}else{n2146LOG(INFO)<<StrippedCommandLine();n2147}n
6.如何查看dex2oat的log
搜索关键字
dex2oatdex-file被优化的dex文件信息oat-fdoat-locationoat存放位置compiler-filter判断采用的那种优化模式eg1:
01-0104:28:03.47126556545654Idex2oat:Startingdex2oat.n01-0104:28:37.54843956545654Idex2oat:dex2oattook34.077s(threads:4)arenaalloc=23MBjavaalloc=14MBnativealloc=88MBfree=5MB01-01n其中:dex2oattokk34.077s表示dex2oat的耗时情况,(threads:4)表示,一共用了4个线程做这件事情。n
eg2:
01-0108:34:27.063I/dex2oat(7714):/system/bin/dex2oat--runtime-arg-classpathn--runtime-arg--instruction-set=arm--instruction-set-features=default--runtime-arg-Xrelocate--boot-image=/system/framework/boot.artn--dex-file=/data/data/com.tencent.mm/app_dex/secondary-2.dex.jar--oat-fd=62--oat-location=/data/data/com.tencent.mm/app_cache/secondary-2.dex.dexn--runtime-arg-Xms64m--runtime-arg-Xmx512m--compiler-filter=speednM和N版本,可以通过会打印出较多的dex2oat参数。n上面的Log中,可以得出很多信息来:n1.被优化的dex文件信息,可以通过--dex-file获取,形如上面我们就知道优化的是微信里面的内容,因为--dex-file参数的dex文件位于ncom.tencent.mm目录下面的。n2.优化之后oat存储的位置,可以看到--oat-location其是保存在包名下面的app_cache目录下面的。n3.是对插件优化还是对APK本身优化。在L的时候所有的PMS优化的内容都会放在data/dalvik-cache目录下面,所以如果oat放的位置是data/ndalvik-cache目录下面,那么就是优化主APK,否则就是优化插件的。n而在M和N当中,优化的结果会放在自己的包下面,但是不会是这种类似app_cache这种,根据这个可以判断是对插件的优化。n4.优化采用的模式n根据--compiler-filter可以判断采用的是哪种模式。n如果我们关注的信息没有打印出来,可以修改上面打印这些Log的条件。n
7.什么时候进行dex2oat
dex2oat一般发生在如下的时候:
第一次开机当第一次开机的时间,PackageManagerService会扫描手机中的各个目录,
当检测到APK之后,就会执行安装流程,在安装的时候,就会对这些APP进行dex2oat操作。
如果说APP比较多,或者dex2oat比较慢,那么开机时间就会比较长。
安装APP当系统开机之后,我们安装APP的时候,也会进dex2oat。n实质上这时候也是走到了PackageManagerService的流程。n由PMS执行安装的运行,并发起dex2oat的动作。n优化插件
当APP运行的时候,会根据自己的需要,优化自己需要的插件文件。
例如自己引用到的非系统类的jar包。
综上来看,系统执行dex2oat的主解有两类,一类是systemserver中的Packagemanagerservice发起的并让installd执行的;另一类是APP自身根据需要优化自己的插件。
8.手机反应慢的原因
慢的原因如下
工作量dex2oat发生的时候,会将原文件中的dex文件抽出来,逐个指令的判断,然后进行翻译,并生成大量的中间内容。并占用所有有CPU(目前的策略是有多少个核,就启动多少个线程)CPU如果CPU越多,则启动的线程数越多,这样的话,就会比较快做完。EMMC如果dex文件比较大,会产生大量的中间内容,这些在memory当中是保存不下的,所以采用了swap机制,会将一些内容交换到EMMC当中,而且有大量的读操作,同时会将结果保存至emmc当中,所以emmc的性能也是非常关键的。Memory如上面所述,memory越少,越容易发生交换,所以就会引起IO上的瓶颈。Patchgoogle之前有一个优化,就是在dex2oat做完的时候,不进行析构,因为析构会将交换出去的内容再读进来,从而导致耗时较长。1.M版本的patch为:ALPS027369152.N版本当中,暂时没有9.解决手机反应慢的方法
遇到慢的问题的时候,先从上面几个方面找原因,如果无法解决,那么就只好调整APP的安装策略。例如原来为speed模式,就改为interpreter-only模式。
参考修改方法如下:
N版本(L/M不适用)在PMS中添加白名单/frameworks/base/services/core/java/com/android/server/pm/PackageDexOptimizer.javaprivateintperformDexOptLI(PackageParser.Packagepkg,String[]sharedLibraries,String[]targetInstructionSets,booleancheckProfiles,StringtargetCompilerFilter){n//在这函数中,可以判断传递下来的pkg是否是我们需要的package,如果是的话,将targetCompilerFilter设置为speed-profile。n//speed-profile会在安装的时候采用interperter-only,然后,运行一段时间之后,会将那些常用的方法优化成为speed模式。也就是说是有选择性的优化。nif(isProfileGuidedFilter&&isUsedByOtherApps(pkg)){ncheckProfiles=false;ntargetCompilerFilter=getNonProfileGuidedCompilerFilter(targetCompilerFilter);nif(DexFile.isProfileGuidedCompilerFilter(targetCompilerFilter)){nthrownewIllegalStateException(targetCompilerFilter);n}nisProfileGuidedFilter=false;n}n//Ifwe'reaskedtotakeprofileupdatesintoaccount,checknow.nbooleannewProfile=false;n###mtkaddbeginnif(pkg.contains("com.tencent.mm")){ntargetCompilerFilter="interpret-only";n}n###mtkaddendn2.在Installd中进行白名单处理适用于LMN版本实现思路
//1.通过property来增加白名单n//注意Facebook是apk的名字,后面不用带后缀,但是大小写一定要匹配。nadbshellsetpropro.mtk.dex2oat_white_listFacebook:n//2.如果需要增加到开机启动当中,可以如下修改在device.mk中加入n//多个APK名字之间用冒号隔开。nPRODUCT_PROPERTY_OVERRIDES+=ro.mtk.dex2oat_white_list=facebook:Facebook:youtube:skype:twitter:n
修改点
\frameworks\native\cmds\installd\commands.c
staticintshouldUseInterpretonly(constchar*input_file_name);nstaticvoidrun_dex2oat(intzip_fd,intoat_fd,constchar*input_file_name,nconstchar*output_file_name,intswap_fd,constchar*pkgname,constchar*instruction_set,nboolvm_safe_mode)n{n......n########MTKaddstartn//适当的时候,进行调用nif(shouldUseInterpretonly(input_file_name))n{nstrcpy(dex2oat_compiler_filter_arg,"--compiler-filter=interpret-only");nhave_dex2oat_compiler_filter_flag=true;//关键是设置这个参数的值nALOGW("%sisinwhitelistfrompropertysosetinterpret-only",input_file_name);n}n########MTKaddendnALOGV("Running%sin=%sout=%s\n",DEX2OAT_BIN,input_file_name,output_file_name);n.....n}n######MTKaddstartn/**n*函数功能,根据input的filename判断,当前来优化的APK名字判断是否在白名单当中。n*白名单来自于propertyn*/nstaticintshouldUseInterpretonly(constchar*input_file_name)n{ncharprop_buf[PROPERTY_VALUE_MAX];nmemset(prop_buf,0,PROPERTY_VALUE_MAX);nboolhave_whitelist=property_get("ro.mtk.dex2oat_white_list",prop_buf,NULL)>0;nif(!have_whitelist)nreturnfalse;nchar*str=prop_buf;ncharappname[128],*ptrname=appname;nmemset(appname,0,128);nwhile(*str)n{nif(*str!=':')n{n*ptrname=*str;nptrname++;nstr++;n}nelse{nstr++;nif(*appname!=0)n{nif(strstr(input_file_name,appname))//foundn{nreturn1;n}nelsen{nmemset(appname,0,sizeof(appname));nptrname=appname;n}n}n}n}nreturn0;n}n###MTKaddendn3.在dex2oat.cc中进行白名单处理
/art/dex2oat/dex2oat.ccn
由于插件不会走PMS和installd这一路,所以,只能想办法在dex2oat中进行拦截。在这里面需要解决的问题是:如何判断来优化的就是我们关注的插件。
通过判断dex2oat进程的父pid来判断是插件如果是插件进行的dex2oat,有一个特点就是这个进程的父进程不是installd。所以可以根据一点进行判断。但是有一个特点,会将所有的插件全部优化成interpreter-only。以N版本为例,建议的代码如下:
/*n*调整编译的模式,规则:如果当前进程的父进程是installd,不做修改,否则修改为interpreter-only。n*因为插件类的,都是进程本来fork的dex2oat.n*onlyfordeviceendn*n*/nvoidadjustCompilerOptions(constCompilerOptions*compiler_options){nnintppid=getppid();//获取当前进程的parentpidncharcmdline_path[256];ncharcontents[256];nmemset(cmdline_path,0,sizeof(cmdline_path));nmemset(contents,0,sizeof(contents));nsnprintf(cmdline_path,"/proc/%d/cmdline");nFILE*fd=fopen(cmdline_path,"r");//打开proc/pid/cmdline文件,以读取对应ppid进程的名字nnif(fd==NULL){nLOG(ERROR)<return;n}nnfgets(contents,sizeof(contents),fd);//读取文件中的内容nfclose(fd);nif(strstr(contents,"installd")){//判断是否是installdnreturn;n}nnLog(INFO)<<"parentisnotinstalld,maybeisapluginadjustittointerpret-only";ncompiler_options->SetCompilerFilter(kInterpretOnly);//如果是的话,强行调整编译模式为interpreteronly模式nnn}n在ParseArgs函数中对dex2oat的模式进行调整:nProcessOptions(parser_options.get());n//Insertsomecompilerthings.nInsertCompileOptions(argc,argv);nnif(!IsHost())//注意一定要判断非host端,否则会有问题nadjustCompilerOptions(compiler_options_.get());nn}n根据dex文件名字或者oatlocation名字来判断n
L版本:
/art/dex2oat/dex2oat.cc
方法1:
n//mtkaddbeginnif((!oat_filename_.empty()&&(oat_filename_.find("facebook")!=std::string::npos))||(!zip_location_.empty()&&(zip_location_.find("facebook")!=std::string::npos))||((!oat_location_.empty())&&oat_location_.find("facebook")!=std::string::npos)){//mtkmodify2016-06-06ncompiler_filter_string="interpret-only";nLOG(INFO)<<"Thisapkisinwhitelistfrompropertysosetinterpret-only";n}n//mtkaddendnif(compiler_filter_string=nullptr){ncompiler_filter_string="speed";n}n
注意:CTS测项用的包不能使用interpret-only模式,因为一些CTS测项是性能相关的,如果改为interpret模式,会导致CTS不过。之前有客户为了追求更快的安装速度,将所有的包都改为interpret-only的,结果CTS就不过了,针对这种情况,可以把CTS的包再放到speed模式的白名单当中。cts的关键字为test.
方法2(若上述方法无效):
1420if(num_methods<=compiler_options_->GetNumDexMethodsThreshold()){n1421compiler_options_->SetCompilerFilter(CompilerOptions::kSpeed);n1422VLOG(compiler)<<"Belowmethodthreshold,compilinganyways";n1423}n1424}n1425n1426//mtk_add_beginn1427staticconstexprsize_tkMinCompileDexSize=4;n1428if(!image_&&dex_files_.size()>kMinCompileDexSize){n1429compiler_options_->SetCompilerFilter(CompilerOptions::kInterpretOnly);n1430LOG(INFO)<<"EnableWhitelistRules.CurrentDexFileSizes:"<<dex_files_.size();n1431}n1432//mtk_add_endn1433n1434returntrue;n1435}n1436n1437//Createandinvokethecompilerdriver.Thiswillcompileallthedexfiles.n1438voidCompile(){n1439TimingLogger::ScopedTimingt("dex2oatCompile",timings_);n1440compiler_phases_timings_.reset(newCumulativeLogger("compilationtimes"))n
或者如下
[SOLUTIONL版本]n在device.mk中加入PRODUCT_PROPERTY_OVERRIDES+=ro.mtk.dex2oat_white_list=com.tencent.mm:(注意包名后又冒号“:”nn[添加sourcecode](抱歉不能排版)n/art/dex2oat/dex2oat.cc添加红色部分:nn#ifdefHAVE_ANDROID_OSnextern"C"{nstaticintshouldUseInterpretonly(constchar*filename){ncharprop_buf[92];nmemset(prop_buf,0,92);nboolhave_whitelist=property_get("ro.mtk.dex2oat_white_list",prop_buf,NULL)>0;nif(!have_whitelist)nreturnfalse;nchar*str=prop_buf;ncharappname[128],*ptrname=appname;nmemset(appname,0,128);nwhile(*str)n{nif(*str!=':'){n*ptrname=*str;nptrname++;nstr++;n}else{nstr++;nif(*appname!=0){nif(strstr(filename,appname))//foundn{nreturn1;n}else{nmemset(appname,0,sizeof(appname));nptrname=appname;n}n}n}n}nreturn0;n}n}n#endifnstaticintdex2oat(intargc,char**argv){nstd::stringdex_filename;//mtk_addn......nif(option.starts_with("--dex-file=")){ndex_filenames.push_back(option.substr(strlen("--dex-file=")).data());ndex_filename=option.substr(strlen("--dex-file=")).data();//mtk_addn}elseif......nnif(compiler_filter_string==nullptr){nif(instruction_set==kMips64){n//TODO:fixcompilerforMips64.ncompiler_filter_string="interpret-only";n}elseif(image){ncompiler_filter_string="speed";n}else{n#ifART_SMALL_MODEncompiler_filter_string="interpret-only";n#elsen#ifdefHAVE_ANDROID_OSnif(shouldUseInterpretonly(zip_location.c_str())){ncompiler_filter_string="interpret-only";nLOG(INFO)<<"Thisapkisinwhitelistfrompropertysosetinterpret-only";n}elseif(shouldUseInterpretonly(dex_filename.c_str())){ncompiler_filter_string="interpret-only";nLOG(INFO)<<"Thisjarisinwhitelistfrompropertysosetinterpret-only";n}else{n#endifncompiler_filter_string="speed";n#ifdefHAVE_ANDROID_OSn}n#endifn#endifn}n}nCHECK(compiler_filter_string!=nullptr);n.......n}n
关于km_v1.0.2.apk破解版5.7,Android Dalvik 使用详解的介绍到此结束,希望对大家有所帮助。
本文由欣欣吧手游攻略栏目发布,感谢您对欣欣吧的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“km_v1.0.2.apk破解版5.7”