APK预安装配置说明
1. APK简介¶
APK是AndroidPackage的缩写,即Android安装包。Android编译生成的APK本质还是一个压缩包文件,打开后可以查看里面的内容,以SStarSourceChange APK为例,解压后如下:
-
META-INF:关于签名的信息存放,应用安装验证签名的时候会验证该文件里面的信息。
-
res:这里面的资源是不经过编译原样打包进来的。
-
AndroidManifest.xml:程序全局配置文件。该文件是每个应用程序都必须定义和包含的文件,它描述了应用程序的名字、版本、权限、引用的库文件等等信息。
-
classes.dex:Dalvik字节码文件,Android会将所有的class文件全部放到这一个文件里。
-
resources.arsc:编译后的二进制资源文件,保存资源文件的索引,由aapt生成。
-
lib: 如果存在的话,存放的是ndk编出来的so库。
Android产品在出厂时,一般会预安装很多APP,关于这些APP,一般分类如下:
类型 | 是否可卸载 | 安装位置 |
---|---|---|
系统预安装的APK | 否 | system |
用户安装的第三方APK | 是 | data |
系统预安装的APK分为带源码的APK预安装和不带源码的APK预安装。本文基于Android 12 P5平台进行介绍。
2. 带源码的APK预安装¶
-
以SStarSourceChange APK为例,将源码包放置在/vendor/sigmastar/common/apps目录下。
-
配置Android.bp文件
通过设置system_ext_specific:true来设置apk生成的路径在/system/system_ext
-
在device/sigmastar/pioneer5/pioneer5_sdp/device.mk中将SStarSourceChange加入到PRODUCT_PACKAGES
-
编译系统。
3. 不带源码的APK预安装¶
-
以ExoPlayer为例,将apk放置在/vendor/sigmastar/common/apps
-
配置Android.bp文件
通过设置
product_specific: true
来设置apk生成的路径在system/product目录下。如果APP使用系统级别的权限,需要预置到pri-app目录下,则在bp文件中增加privileged: true
。
4. APP安装路径¶
-
/system/app: 系统预制的应用会安装在此目录。
-
/system/priv-app: 比/system/app中应用权限更高的应用会放置此目录。
-
/system/system_ext/app: /system_ext 分区是在Android 11 中引入, /system_ext 分区作为可选分区。(该分区是放置 /system 分区中与 AOSP 定义的组件紧密耦合的非 AOSP 组件的位置。)/system_ext 分区被视为是 /system 分区特用于 OEM 的扩展,且未在两个分区间定义接口。/system_ext 分区中的组件可以对 /system 分区进行私有 API 调用,反之,/system 分区中的组件也可以对 /system_ext 分区进行私有 API 调用。由于两个分区紧密耦合,Android 新版本发布时,这两个分区也会一起升级。为上一个 Android 版本创建的 /system_ext 分区不需要与下一个 Android 版本的 /system 分区兼容。如需将模块安装到 /system_ext 分区,请将 system_ext_specific: true 添加到 Android.bp 文件。
-
/system/system_ext/priv-app: 比如Launcher3/SystemUI/TvSettings
-
/vendor/app: 设备厂商提供的app
-
/data/app: 用户安装的app
其中data/data/PackageName用于存放对应应用的数据。当系统需要升级系统预制应用的时候,会将更新版本安装在/data/app目录中;当启动app的时候,系统会将应用指向/data/app目录中的对应应用。升级的应用可以删除,但删除后系统会恢复原先预制的版本。
5. APP安装方式¶
Android APP有如下四种安装方式:
-
预制应用安装―开机时完成,没有安装界面,在PMS的构造函数中完成安装。
-
网络下载应用安装―通过应用商店应用完成,调用PackageManager.installPackages(),有安装界面。
-
ADB工具安装――没有安装界面,它通过启动pm脚本的形式,然后调用PMS.installStage()完成安装。
-
第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。
6. APP安装时库文件处理¶
Android安装APP时,lib目录下的so文件会被解压到APP的原生库目录,一般是放到/data/data/<package-name>/lib
目录下,根据系统和CPU架构的不同,拷贝策略也不一样,若so文件没有正确配置,比如APP使用到第三方的so文件,只配置了某一种CPU架构的so,可能就会造成APP在某些机型上适配出问题。
so的使用和ABI紧密相关,ABI全称是:Application binary interface,即:应用程序二进制接口,它定义了一套规则,允许编译好的二进制目标代码在所兼容该ABI的操作系统和硬件平台中无需改动就能运行。处理so时应该为每个ABI目录提供对应的so文件。
常用的ABI有如下五种:
-
armeabiv-v7a:第七代及以上ARM处理器。2011年以后的生产的大部分Android设备都是用它。
-
arm64-v8a:第8代、64位ARM处理器,设备不多,比如三星Galaxy S6
-
armeabi:第5代、第6代ARM处理器,早期的手机用的比较多。
-
x86:平台、模拟器用得比较多。
-
x86_64:64位的平板。
如为适配armeabi/arm64-v8a/armeabiv-v7a架构,如下应用在libs目录下分别放置了对应的so文件。
. ├── AndroidManifest.xml ├── Android.mk ├── assets │ └── deviceInfo.json ├── libs │ ├── android-support-v4.jar │ ├── arm64-v8a │ │ └── libmt-jni.so │ ├── armeabi │ │ └── libmt-jni.so │ ├── armeabi-v7a │ │ └── libmt-jni.so
7. APP的安装常用调试命令¶
一般使用PMS的相关命令进行调试,如下:
-
已安装的APP的包名信息查询
pm list packages console:/ # pm list packages package:com.android.cts.priv.ctsshim package:com.android.dynsystem package:com.android.providers.calendar package:com.android.tv.settings package:com.android.providers.media package:com.sstar.systemcontrol ...
-
安装包路径查询
console:/ # pm path com.sstar.sourcechange package:/system/system_ext/app/SStarSourceChange/SStarSourceChange.apk console:/ #
-
安装包dump信息查询
console:/ # pm dump com.sstar.sourcechange DUMP OF SERVICE package: Activity Resolver Table: Non-Data Actions: android.intent.action.MAIN: b2ed1d2 com.sstar.sourcechange/.MainActivity filter 14982a3 Action: "android.intent.action.MAIN" Category: "android.intent.category.LEANBACK_LAUNCHER" Category: "android.intent.category.LAUNCHER" ...