android 如何根据已安装程序获得安装包路径或安装包

android 如何根据已安装程序获得安装包路径或安装包,第1张

android的硬存储是按照linux系统规则来划分的,用于存储客户信息和客户安装的应用的是/data分区,你如果使用的是c程序的话,应该是在/data/app之类的下面,我手头没有板子没法给你查。文件夹是google约定俗成的,不同厂家应该都是一样的路径。如果是厂家定制的应用则是在/system分区下,路径应该是/system/app下。

如果你是一个android系统学习者,而不是应用开发者的话,我建议看看以下system/etc/initrc对于你会有很大的帮助。

EnvironmentgetDataDirectory()getPath() : /data

EnvironmentgetDownloadCacheDirectory()getPath() : /cache

EnvironmentgetExternalStorageDirectory()getPath() : /mnt/sdcard

EnvironmentgetRootDirectory()getPath() : /system

ContextgetCacheDir()getPath() : /data/data/包名/cache

ContextgetExternalCacheDir()getPath() : /mnt/sdcard/Android/data/包名/cache

ContextgetFilesDir()getPath() : /data/data/包名/files

ContextgetObbDir()getPath() : /mnt/sdcard/Android/obb/包名

ContextgetPackageName() : 包名

ContextgetPackageCodePath() : /data/app/应用名

ContextgetPackageResourcePath() : /data/app/应用名

这个是我以前在网上看过的,关于android中具体路径与获取方式之间对应关系的描述。

/data/data/cntonyapp/files/这种路径,可能是在包名为“cntonyapp”的应用下,通过在Context的子类(Activity,Service等等)中调用getFilesDir所得到的。

而/mnt/sdcard/,应该是在40以下的android系统上,通过Environment类的getExternalStorageDirectory方法获取的。

其实getExternalStorageDirectory这个方法,不如说是获取默认存储器的。在不同版本不同设置的android系统上,指向的位置也不太一样。比如在40以上的系统上,它一般指向“storage/sdcard0”(内置SD卡),但也有厂家或个人把它设置为“storage/sdcard1”(外置SD卡)。就像window,系统一般是装在C盘,但装在D盘上其实也可以。

至于区别,我觉得主要是与外置SD卡有关。android44系统对外置SD卡做了一定限制。在它的设置中,手机内存储(内置SD卡)属于共有资源,只要有权限,各种应用都能可以上面自由的读写文件夹和文件。而外置SD卡则管的比较严,它给每个第三方应用都划了块“个人空间”。就是“data/data/[包名]”目录,应用只能在它自己的地盘上活动( *** 作文件)。举例来说,如果我有个包名叫a的应用,它可以在内置SD卡上任意位置创建读写文件,而对于外置sd卡,则只能 *** 作"data/data/a"目录下的文件。这种方式文件结构比较清晰,同时还避免了一些隐患,删除时也方便。

PS:有些44以上的手机,SD卡仍是一团乱。可能有两个原因,一个是系统在SD卡上创建文件,这个是不受限的;还有一个就是上面说的,把默认设为了外存储,纯粹属于把外置SD卡当内置SD使了。

大前提:Android程序其实就是os的插件

插件框架实现思路及原理

一、技术可行性

a) apk的安装处理流程

i apk会copy到/data/app;

ii 解压apk中的classdex,并对其进行优化,获得odex(即JIT)。最后保存到/data/dalvik_cache;

iii 还有一些权限和包信息,会缓存到/data/system中的packageslist和packagesxml中。

b) 在Android上,对apk包的加载逻辑

i 加载逻辑

Zygote(孵化器)在成功启动一Android进程后,会根据packageslist的内容(启动时会加载到system_process中的pakcagemanager中),把odex文件,加载到dalvik中,完成逻辑的加载;

ii 资源读取

资源读取,主要有两三个类,分别是Resource、AssertManager和LayoutInflater。

当在显示界面时,就通过这三个类读取资源。

c) 结论和猜想

i

apk相对于整个android系统而言,其本身就是一种插件形式体现。根据上面关于逻辑和资源的读取概述,完全是可以静默实现的。其次,classdex并没有包含Android

SDK的代码,只是保留对Android SDK接口的调用。 可以这样想象,Android SDK即插件框架,而Android

OS即为整个插件的宿主环境。因此这就可以解释了,为什么在1x编译的代码,在2x甚至3x都可以运行,因为只要插件宿主的接口(即Android

SDK)不变,插件运行时所调用的接口都可以被找到。

ii

为了减少内存占用,Resource、AssertManager和LayoutInflater必然不会把apk中的所有资源都加载进来,而是用时才加载并缓存,而且还有一些的处理机制(如最不常用清除等)。因此这些类当中,必然存在一个指明资源路径的字段或者结构。

iii 要保证兼容性,插件框架公开给插件的接口,必须遵守Open-Close(开发-封闭)原则。另外,一些已经废弃掉接口,同样需要保留。比如Service中的setForeground和JDK的中关于Thread的一些接口等。

iv 可以尝试通过反射,修改Resource、AssertManager和LayoutInflater中指明资源路径的字段;另外,还可以查看源码,查找设置资源路径的方法。

以上就是关于android 如何根据已安装程序获得安装包路径或安装包全部的内容,包括:android 如何根据已安装程序获得安装包路径或安装包、android 文件路径问题、如何找到apk所在的路径等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9385416.html

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

发表评论

登录后才能评论

评论列表(0条)

保存