
启动的过程如下:
Shell接收到命令,启动一个程序,此时shell首先会fork一个新的进程
新fork的进程,通过execve系统调用,陷入到内核中,内核检查和加载需要执行的二进制映像文件,检验其合法性及权限。通常用户态进程要启动一个新的程序(如shell),fork后,execve要紧跟着执行,这样会有更好的效率(由于使用COW技术,这样可以避免页表复制,而execve后,之前进程中的所有内容都是无用的,若execve紧跟fork后,可以避免COW引起的拷贝);
通常二进制文件都会要依赖一些系统动态库,此时kernel会启动加载器/system/bin/linker,执行linker的__linker_init()
Linker的linker_init(),会分析二进制的elf文件,加载依赖的动态库文件,然后转入二进制映像的入口函数__start中执行
__start会调用C库的初始化函数__libc_init()
__libc_init()会调用映像的main函数,这个main函数也就是用户app的入口函数
main() 函数执行完毕后,通过exit()退出进程执行
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
1 在应用程序的AndroidManifestxml中的manifest节点中加入android:sharedUserId="androiduidsystem"这个属性。
2 修改Androidmk文件,加入LOCAL_CERTIFICATE := platform这一行
3 使用mm命令来编译,生成的apk就有修改系统时间的权限了。()
第二个方法
1 同上,加入android:sharedUserId="androiduidsystem"这个属性。
2 使用eclipse编译出未签名apk文件,
3 用google带的签名来签名
最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。如何使Android应用程序获取系统权限
getTotalPrivateDirty()就是获得自己进程所独占的内存
getTotalPss()意思就是假如有A,B,C,D,E 5个进程共享一片10kb的内存,A,B,F 3个进程又另外共享了30kb的内存,那么进程A调用这个函数返回就是10/5+30/3=12
所以理论上只要监视getTotalPrivateDirty()就能监视自己进程的内存变化
最后附上代码
public void getThisProcessMemeryInfo() {
int pid = AndroidosProcessmyPid();
androidosDebugMemoryInfo[] memoryInfoArray = activityManagergetProcessMemoryInfo(new int[] {pid});
Logd(TAG, "本应用当前使用了" + (float)memoryInfoArray[0]getTotalPrivateDirty() / 1024 + "mb的内存");
}
一、方法介绍:
每个Android应用程序都可以通过Context来获取与应用程序相关的目录,这些目录的功能各异,每一个目录都有自己的特点,有时候可能会搞混淆,本文结合android源码注释和实际 *** 作,详细介绍一下每个方法:
方法:getFilesDir
释义:返回通过ContextopenFileOutput()创建和存储的文件系统的绝对路径,应用程序文件,这些文件会在程序被卸载的时候全部删掉。
方法:getCacheDir
释义:返回应用程序指定的缓存目录,这些文件在设备内存不足时会优先被删除掉,所以存放在这里的文件是没有任何保障的,可能会随时丢掉。
方法:getDir
释义:这是一个可以存放你自己应用程序自定义的文件,你可以通过该方法返回的File实例来创建或者访问这个目录,注意该目录下的文件只有你自己的程序可以访问。
方法:getExternalCacheDir
释义:使用这个方法需要写外部存储的权限“<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE" />”,调用该方法会返回应用程序的外部文件系统(EnvironmentgetExternalStorageDirectory())目录的绝对路径,它是用来存放应用的缓存文件,它和getCacheDir目录一样,目录下的文件都会在程序被卸载的时候被清除掉。
方法:getExternalFilesDir
释义:使用这个方法需要写外部存储的权限“<uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE" />”,这个目录是与应用程序相关的外部文件系统,它和getExternalCacheDir不一样的是只要应用程序存在它就会一直存在,这些文件只属于你的应用,不能被其它人访问。同样,这个目录下的文件在程序被卸载时也会被一同删除。
方法:getExternalFilesDir
释义:和上面的方法一样,只是返回的是其目录下某一类型的文件,这些类型可以是: Environment#DIRECTORY_MUSIC 音乐 Environment#DIRECTORY_PODCASTS 音频 Environment#DIRECTORY_RINGTONES 铃声 Environment#DIRECTORY_ALARMS 闹铃 Environment#DIRECTORY_NOTIFICATIONS 通知铃声 Environment#DIRECTORY_PICTURES Environment#DIRECTORY_MOVIES 视频
方法:getDatabasePath
释义:保存通过ContextopenOrCreateDatabase 创建的数据库文件
方法:getPackageCodePath
释义:返回android 安装包的完整路径,这个包是一个zip的压缩文件,它包括应用程序的代码和assets文件。
方法:getPackageResourcePath
释义:返回android 安装包的完整路径,这个包是一个ZIP的要锁文件,它包括应用程序的私有资源。
方法:getObbDir
释义:返回应用程序的OBB文件目录(如果有的话),注意如果该应用程序没有任何OBB文件,这个目录是不存在的。
二、测试程序:
测试代码如下:
private StringBuilder getFilePath( ){
StringBuilder filePathBuilder = new StringBuilder( );
// 返回通过ContextopenFileOutput()创建和存储的文件系统的绝对路径,应用程序文件,这些文件会在程序被卸载的时候全部删掉。
filePathBuilderappend( "getFilesDir == " )append( getFilesDir( ) )append( "\n" );
// 返回应用程序指定的缓存目录,这些文件在设备内存不足时会优先被删除掉,所以存放在这里的文件是没有任何保障的,可能会随时丢掉。
filePathBuilderappend( "getCacheDir == " )append( getCacheDir( ) )append( "\n" );
// 这是一个可以存放你自己应用程序自定义的文件,你可以通过该方法返回的File实例来创建或者访问这个目录,注意该目录下的文件只有你自己的程序可以访问。
filePathBuilderappend( "getDir == " )append( getDir("testtxt", ContextMODE_WORLD_WRITEABLE) )append( "\n" );
/ 需要写文件权限 <uses-permission android:name="androidpermissionWRITE_EXTERNAL_STORAGE" /> /
// 调用该方法会返回应用程序的外部文件系统(EnvironmentgetExternalStorageDirectory())目录的绝对路径,它是用来存放应用的缓存文件,它和getCacheDir目录一样,目录下的文件都会在程序被卸载的时候被清除掉。
filePathBuilderappend( "getExternalCacheDir == " )append( getExternalCacheDir( ) )append( "\n" );
// 这个目录是与应用程序相关的外部文件系统,它和getExternalCacheDir不一样的是只要应用程序存在它就会一直存在,这些文件只属于你的应用,不能被其它人访问。同样,这个目录下的文件在程序被卸载时也会被一同删除。
filePathBuilderappend( "getExternalFilesDir == " )append( getExternalFilesDir( "/" ) )append( "\n" );
/
和上面的方法一样,只是返回的是其目录下某一类型的文件,这些类型可以是:
Environment#DIRECTORY_MUSIC 音乐
Environment#DIRECTORY_PODCASTS 音频
Environment#DIRECTORY_RINGTONES 铃声
Environment#DIRECTORY_ALARMS 闹铃
Environment#DIRECTORY_NOTIFICATIONS 通知铃声
Environment#DIRECTORY_PICTURES
Environment#DIRECTORY_MOVIES 视频
/
filePathBuilderappend( "getExternalFilesDir == " )append( getExternalFilesDir( EnvironmentDIRECTORY_PICTURES ) )append( "\n" );
// 保存通过ContextopenOrCreateDatabase 创建的数据库文件
filePathBuilderappend( "getDatabasePath == " )append( getDatabasePath( DATA_BASE_NAME ) )append( "\n" );
// 返回android 安装包的完整路径,这个包是一个zip的压缩文件,它包括应用程序的代码和assets文件
filePathBuilderappend( "getPackageCodePath == " )append( getPackageCodePath( ) )append( "\n" );
// 返回android 安装包的完整路径,这个包是一个ZIP的要锁文件,它包括应用程序的私有资源。
filePathBuilderappend( "getPackageResourcePath == " )append( getPackageResourcePath( ) )append( "\n" );
// 返回应用程序的OBB文件目录(如果有的话),注意如果该应用程序没有任何OBB文件,这个目录是不存在的。
filePathBuilderappend( "getObbDir == " )append( getObbDir( ) )append( "\n" );
return filePathBuilder;
}
以上就是关于如何查看androidapp启动过程全部的内容,包括:如何查看androidapp启动过程、android中 获取一个应用程序的所用权限的方法、获取应用程序占用了多少内存 android.os.Debug.MemoryInfo等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)