Android系统开发 Android10_添加预装应用
<h1><span style="color: rgba(22, 145, 121, 1)">版权声明</span></h1><p>本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17855805.html</p>
<div>本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。</div>
<h1><span style="color: rgba(22, 145, 121, 1)">前言</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)"> 此博客以Android10为准,请注意在预装应用根据不同平台(MTK、展讯、瑞芯微),也是有所区别的,所以实际导入细节请你的平台文档为准。此篇博客只讲解原生AOSP的预装应用。</span></p>
<p> </p>
<p><span style="color: rgba(0, 0, 0, 1)"> 将应用添加到系统中,编译前只有2个目录可以存放应用<strong>vendor/apps与packages/apps</strong></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 这两个目录其实没啥区别,甚至存放应用就没有目录的限制,理论你随意创建一个文件夹都可以,因为识别路径的关键是PRODUCT_PACKAGES配置(这个后面会讲到)。<span style="color: rgba(186, 55, 42, 1)"><strong>但是这不符合规则默契</strong></span>,所以我们还是得老老实实的放到上面2个目录中。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> <strong>vendor/apps</strong>目录是厂商的客制化目录,存放一些第三方厂商的配置文件、firmware以及动态库等等,其中也包括了应用。vendor这个目录在原生aosp里是不存在的,它需要你自己创建。但是如果你是用MTK或者展讯、瑞芯微的这些厂商的aosp,那么 vendor目录他们早就创建好了。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> <strong>packages/apps</strong>目录,完全是Android原生的应用目录,里面包含了Email、Music、Gallery、Launcher3 等等系统应用,你也可以在这个目录下添加自己的应用。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> <strong><span style="color: rgba(186, 55, 42, 1)">所以这边推荐是将自己的应用放到vendor客制化目录下</span></strong>,方便与原生的应用隔开管理。至于有些人担心应用的是否可卸载、是否是系统级应用,这与在不在vendor或者packages等等无关。 有关系的是Android.mk文件的配置,所以这点无需苦恼。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 所以下面的博客中将讲解<strong>如何将应用添加到vendor/apps</strong>。不讲解如何将应用添加到packages/apps目录,因为操作上与添加到vendor/apps没区别,只是路径不同。</span></p>
<p> </p>
<p><span style="color: rgba(0, 0, 0, 1)"> 上面是编译前的目录,这里是编译后的目录,在配置Android.mk文件,可以将应用编译到如下目标文件:</span></p>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)">/system/framework 用于存放资源型应用(系统框架)</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">/system/app 用于存放系统应用,不能卸载</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">/systme/priv-app Android4.4+ 新增,系统 [ 核心 ] 应用存放路径(最高权限)</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">/vendor/app 用于存放厂商应用,可以卸载,恢复出厂时恢复</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">/data/app 用于存放用户应用,可以卸载,恢复出厂时不能恢复</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">/data/app-private Android4.4+ 新增,受 DRM 保护的应用存放路径 </span></li>
</ul>
<h1><span style="color: rgba(22, 145, 121, 1)">注意事项</span></h1>
<h2><span style="color: rgba(35, 111, 161, 1)">应用架构</span></h2>
<p><span style="color: rgba(22, 145, 121, 1)"> <span style="color: rgba(0, 0, 0, 1)">因为Android模拟器为了在电脑上流畅运行所以大部分人会选择x86_64架构,而实体机大部分是ARM架构, 所以在添加预装应用前,请先判断自己的app选择了什么架构,因为架构不支持会导致应用无法安装。而现在的大部分主流的应用都只支持ARM架构,如果你是用模拟器正在学习framework开发,这里建议自己用Android studio编译一个支持x86_64的应用。</span></span></p>
<p><span style="color: rgba(22, 145, 121, 1)"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/1497956/202311/1497956-20231127100150285-383163216.png"></span></span></p>
<h1><span style="color: rgba(22, 145, 121, 1)">将应用添加到data_无源码_无法卸载</span></h1>
<h2><span style="color: rgba(35, 111, 161, 1)">创建目录</span></h2>
<p>这里的vendor目录其实是需要你自己在aosp根目录下创建的(原生的aosp不自带这个目录),你可以通过下面这个命令一次性创建好全部目录。</p>
<pre class="language-bash highlighter-hljs" data-dark-theme="true"><code>mkdir -p vendor/apps</code></pre>
<p>接下来进入这个目录,创建一个你需要导入的应用目录,用来存放.apk与.mk文件,如下我创建了一个叫Calligraphy的应用目录</p>
<pre class="language-bash highlighter-hljs" data-dark-theme="true"><code>~/aosp/vendor/apps$ mkdir Calligraphy</code></pre>
<h2><span style="color: rgba(35, 111, 161, 1)">配置apk与android.mk文件</span></h2>
<p><span style="color: rgba(0, 0, 0, 1)">将apk文件cp到你创建目录下,并且创建Android.mk文件</span></p>
<pre class="language-bash highlighter-hljs" data-dark-theme="true"><code>$ touch Android.mk</code></pre>
<p>在Android.mk 填入如下内容</p>
<pre class="language-bash highlighter-hljs" data-dark-theme="true"><code>LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Calligraphy
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS:= APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := Calligraphy.apk
LOCAL_PROPRIETARY_MODULE := true
include $(BUILD_PREBUILT)</code></pre>
<p>最后目录下的2个文件</p>
<p><img src="https://img2023.cnblogs.com/blog/1497956/202311/1497956-20231127105015792-1085646031.png"></p>
<h2><span style="color: rgba(35, 111, 161, 1)">Android.mk的参数解释</span></h2>
<p><strong>LOCAL_MODULE</strong></p>
<p>用来指定模块的名称,该模块名称需要加入到PRODUCT_PACKAGES(加入这参数下面会说)</p>
<p><strong>LOCAL_MODULE_TAGS</strong></p>
<p>用来指定该app在编译什么样子的版本的时候会被安装到机器上;</p>
<ul>
<li>user: 指该模块只在user版本下才编译</li>
<li>eng: 指该模块只在eng版本下才编译</li>
<li>tests: 指该模块只在tests版本下才编译</li>
<li>optional:指该模块在所有版本下都编译</li>
</ul>
<p><strong>LOCAL_MODULE_CLASS</strong></p>
<p>在采用预装这种形式的时候,该变量来指定预装的模块的类型,此处为APPS;</p>
<p><strong>LOCAL_CERTIFICATE</strong></p>
<p>用于设置APK的签名模式,一共有如下四种:</p>
<ul>
<li><span class="code-block-extension-codeLine" style="color: rgba(0, 0, 0, 1)" data-line-num="3">media 使用media签名文件签名</span></li>
<li><span style="color: rgba(0, 0, 0, 1)"> <span class="code-block-extension-codeLine" data-line-num="4">platform 使用平台签名文件签名,也就是系统签名</span></span></li>
<li><span style="color: rgba(0, 0, 0, 1)"><span class="code-block-extension-codeLine" data-line-num="5"><span class="hljs-keyword" style="color: rgba(0, 0, 0, 1)">shared</span>使用<span class="hljs-keyword" style="color: rgba(0, 0, 0, 1)">shared</span>签名文件签名</span> </span></li>
<li><span class="code-block-extension-codeLine" style="color: rgba(0, 0, 0, 1)" data-line-num="6">PRESIGNED 如果文件已经签过名,不需要重新签名,则使用PRESIGNED</span></li>
</ul>
<p><strong>LOCAL_SRC_FILES</strong></p>
<p>要预装的APK源文件;</p>
<p><strong>LOCAL_PROPRIETARY_MODULE</strong></p>
<div>
<div><span style="color: rgba(0, 0, 0, 1)"><span class="code-block-extension-codeLine" data-line-num="2">LOCAL_PRIVILEGED_MODULE 决定了其编译后的在ROM中的安装位置: </span> <span class="code-block-extension-codeLine" data-line-num="3">如果不设置或者设为<span class="hljs-literal" style="color: rgba(0, 0, 0, 1)">false</span>,安装位置为system/app; 如果设置为<span class="hljs-literal" style="color: rgba(0, 0, 0, 1)">true</span>,安装位置为system/priv-app。</span></span></div>
</div>
<h2><span style="color: rgba(35, 111, 161, 1)">配置device.mk文件</span></h2>
<p>这里可以搜索下device.mk,会发现device.mk会有很多同名文件,如下图:</p>
<p><img src="https://img2023.cnblogs.com/blog/1497956/202311/1497956-20231127105510178-2014738238.png"></p>
<p>首先,我们需要修改目标在build/make目录下,所以把目标缩小到这些目录下,其次你会发现这些目录下也有很多device.mk,这是是与你需要编译的cpu架构有关,与你的在编译时选择lunch有关。 我自己这边是选择编译的是lunch 24 所对应的就是x86_64.</p>
<p>所以,我这边是打开generice_x86_64目录下的device.mk进行修改。增加需要编译的apk目录,如果是第一次配置,没有PRODUCT_PACKAGES配置项,你需要自己添加上去,并且增加上面的应用目录名称,如下图片:</p>
<p><img src="https://img2023.cnblogs.com/blog/1497956/202311/1497956-20231127110005019-1127637567.png"></p>
<h2><span style="color: rgba(35, 111, 161, 1)">执行编译后,查看结果</span></h2>
<h3><span style="color: rgba(0, 0, 0, 1)">在编译后的out文件查看结果</span></h3>
<p><img src="https://img2023.cnblogs.com/blog/1497956/202311/1497956-20231127110325701-1318950485.png"></p>
<p><img src="https://img2023.cnblogs.com/blog/1497956/202311/1497956-20231127110346513-1270695827.png"></p>
<h3><span style="color: rgba(0, 0, 0, 1)">刷机查看结果</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)">在设置中查看</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2023.cnblogs.com/blog/1497956/202311/1497956-20231127110437062-966622789.png"></span></p>
<p><span style="color: rgba(0, 0, 0, 1)">用adb查看结果</span></p>
<pre class="language-bash highlighter-hljs" data-dark-theme="true"><code>$ adb shell
my_device_01:/ # cd vendor/app/
my_device_01:/vendor/app # ls
BiliBili Bing Calligraphy</code></pre>
<h1><span style="color: rgba(22, 145, 121, 1)">将应用添加到vendor_无源码_无法卸载</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)">Android.mk</span></p>
<pre class="language-bash highlighter-hljs" data-dark-theme="true"><code>
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Calligraphy
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/app
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)</code></pre>
<p> </p>
<p><span style="color: rgba(22, 145, 121, 1)">end</span></p>
</div>
<div id="MySignature" role="contentinfo">
<div style="text-align: center">
<p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17855805.html </p>
<div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/17855805.html
頁:
[1]