如何查看androidapp启动过程

如何查看androidapp启动过程,第1张

启动的过程如下:

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9680291.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存