沧州市东光建设局 网站,怎么卸载电脑上wordpress,重庆城市建设档案馆网站,wordpress word插件Android13 系统源码适配安装可卸载的三方apk应用 文章目录 Android13 系统源码适配安装可卸载的三方apk应用一、前言二、Android 系统运行后默认安装三方apk实现1、Android 系统默认安装三方apk实现主要思路2、Android 系统默认安装三方apk具体实现#xff08;1#xff09;准…Android13 系统源码适配安装可卸载的三方apk应用 文章目录 Android13 系统源码适配安装可卸载的三方apk应用一、前言二、Android 系统运行后默认安装三方apk实现1、Android 系统默认安装三方apk实现主要思路2、Android 系统默认安装三方apk具体实现1准备好需要安装的三方apk应用2编写一个installapk.sh脚本3执行PRODUCT_COPY_FILES指令4在某个init.XXX.rc中执行 installapk.sh脚本即可安装三方应用 3、报错解决1PRODUCT_COPY_FILES 命令复制文件是apk会报错2复制的apk文件命名包含特殊字符或者中文或报错3**SELinux**权限报错 三、其他1、Android 系统运行后默认安装三方apk实现总结2、在Android源码中配置第三方应用相对麻烦的大概原因3、如果把三方apk直接push 到 /data/app/XXX/目录 会默认安装吗4、一个遗留的问题init脚本未启动成功 一、前言
本文主要介绍 手机的三方应用比如游戏微博等应用在源码中如何默认配置到手机中的。
Android手机中的系统应用是无法手动卸载的但是这些三方应用安装后是可以手动卸载的。
源码编译中配置系统应用是比较简单的只要在apk文件并且再Android.mk或者Android.bp中进行配置即可。
但是如果要默认配置三方应用确实有点麻烦网上很多文章讲得都比乱
大部分只是贴了相关代码基本没有介绍完整流程和分享解决配置过程还有一些编译报错。
本文是一篇介绍Android 系统源码适配安装可卸载的三方apk知识比较全面的基于实际操作的有很大参考价值的并且对相关内容进行了介绍的文章。
为啥三方应用配置要比系统应用麻烦那么多本文最后有简单介绍。
如果把三方apk直接push 到 /data/app/XXX/这个三方应用安装的目录三方应用会默认安装吗同样最后介绍。
二、Android 系统运行后默认安装三方apk实现
这是本文的核心内容如果编译过源码修改过.mk文件、init.rc文件、shell脚本XXX.sh
那么下面的内容是不难的如果没有接触过也可以看着理解。
1、Android 系统默认安装三方apk实现主要思路
整体思路
1准备好需要安装的三方apk应用
2编写一个installapk.sh脚本
3在某个.mk文件执行PRODUCT_COPY_FILES指令把apk文件和installapk.sh脚本文件复制到运行环境的某个目录
4在某个init.XXX.rc中执行 installapk.sh脚本即可安装三方应用展开了说一下
installapk.sh文件的代码主要就是变量文件执行了 pm install XXX.apk不会写也没关系直接复制过来用就行XX.mk文件执行PRODUCT_COPY_FILES指令的使用修改一下具体源码的目录即可init.XXX.rc是根据自己系统代码的情况选择一个常用的init.XXX.rc在里面执行启动installapk.sh脚本即可启动脚本的代码也是比较简单只要几行固定的代码一看就能学会理解上面内容并且按照顺序一步一步来最后就能实现系统默认安装三方apk功能。网上很多文章只是贴了一下代码未介绍具体思路和先后过程所以会比较乱。
2、Android 系统默认安装三方apk具体实现
1准备好需要安装的三方apk应用
比如把所有三方apk放在源码/vendor/preinstallapk目录。
源码这里的apk目录其实无所谓只要在.mk文件里面填写正确就可以了。
2编写一个installapk.sh脚本
代码如下
#!/vendor/bin/sh
#给vendor目录读写和remount权限有些系统不用可以具体情况编写
/system/bin/mount -o rw,remount /vendor#读取是否设置的prop属性
installpropgetprop persist.mydebug.preinstall#定向日志到文件不然看不到
echo installapk.sh start /sdcard/Download/installapkLog.txtecho installapk installprop persist.mydebug.preinstall $installprop /sdcard/Download/installapkLog.txtif [ $my_property true ];thenecho installapk return! /sdcard/Download/installapkLog.txtreturn
else echo installapk start /sdcard/Download/installapkLog.txt
fi#遍历vendor/preinstallapk 里面的所以apk
for file in /vendor/preinstallapk/*
do
if [ -f $file ]
thenecho installapk apk $file /sdcard/Download/installapkLog.txtpm install -r $file
fi
done#最后复制一份apk到sdcard进行备份如果项目不需要就不用cpmkdir sdcard/Download/operatormkdir sdcard/Download/operator/appcp /vendor/preinstallapk/* sdcard/Download/operator/app/#设置prop表示表示已经安装过apk了setprop persist.mydebug.install true# 根据需求决定是否删除三方apkrm -rf /vendor/preinstallapk/*echo installapk end /sdcard/Download/installapkLog.txt上面的代码主要逻辑
1、给vendor 读写和remount权限有些系统不用有些要可以具体情况编写
2、获取prop属性查看是否已经安装过判断安装过就不再安装
3、未安装的情况遍历目录所有apk文件进行“pm install -r XXX”安装
4、安装完后复制一个apk到sdcard目录并且删除vendor目录的三方应用
5、记录prop属性设置应用已经安装其中一些细节
全过程使用定向日志输出到本地文件如果不想被用户看到可以输出到vendor分区/vendor/preinstallapk/目前是手机运行环境中存在apk的目录具体体现可以在后面的.mk中体现上面所有的目录都是手机设备真实可以cd到的目录.sh文件就是安卓设备中可执行的shell脚步获取属性的错误写法
my_property$(getprop persist.mydebug.preinstall)
正确写法
propstringgetprop persist.mydebug.preinstall
如果想要脚本简单一些去掉prop属性的判断去掉复制文件去掉定向日志生成。
精简后的 installapk.sh代码如下
/system/bin/mount -o rw,remount /vendor
for file in /vendor/preinstallapk/*
do
if [ -f $file ]
thenpm install -r $file
fi
done
rm -rf /vendor/preinstallapk/*把写好的 installapk.sh放到源码的 /vendor/scripts/ 目录下这个目录也是可以更加自己的项目情况修改的。
3执行PRODUCT_COPY_FILES指令
找到一个执行 PRODUCT_COPY_FILES 执行的XXX.mk文件在里面多加下面两行代码。
PRODUCT_COPY_FILES \$(call find-copy-subdir-files,*,vendor/preinstallapk,$(TARGET_COPY_OUT_VENDOR)/preinstallapk)PRODUCT_COPY_FILES \$(call find-copy-subdir-files,*,vendor/scripts,$(TARGET_COPY_OUT_VENDOR)/bin)代码编译运行后就会在 根目录的 vendor 下面的 preinstallapk 和 bin 文件夹看到 apk文件和 installapk.sh文件。
这里也不一定要copy到vendor 目录根据项目情况复制到 system 目录也可以的。
4在某个init.XXX.rc中执行 installapk.sh脚本即可安装三方应用
找到一个会执行的 init.XXX.rc 文件大概加入如下代码
# init 刚启动的时
on boot# installapk 监听服务执行sh脚本
service installapk /vendor/bin/installapk.shdisabledoneshotseclabel u:r:shell:s0on property:sys.boot_completed1start installapk
系统/device/init 目录下 很多init.XXX.rc 都可以正常运行如果不知道找哪个直接加在 init.rc 文件也可以。
也可以在Java代码中启动设置prop属性也是可以启动脚本的
SystemProperties.set(ctl.start,installapk);可以在xxx.sh脚本中添加属性判断或者设置在代码中判断属性后执行脚本也是ok 的。
3、报错解决
1PRODUCT_COPY_FILES 命令复制文件是apk会报错
这个是编译报错也是必须要要解决的报错报错日志
FAILED:
In file included from build/make/core/main.mk:1448:
build/make/core/Makefile:72: error: Prebuilt apk found in PRODUCT_COPY_FILES: device/preinstallapk/SystemAppDemo.apk:vendor/preinstallapk/SystemAppDemo.apk, use BUILD_PREBUILT instead!.日志提示PRODUCT_COPY_FILES 复制的文件是apk请用 BUILD_PREBUILT指令进行安装
BUILD_PREBUILT 指令就是Android.mk 里面的编译类型据我所了解Android.mk和Android.bp编译的apk都是不可以卸载的apk百度搜索也没有相关介绍。
所以还是要解决这个编译问题。其实解决也不难去除它的检测机制的几行代码就行解决方法
注释掉build/core/Makefile文件中检测apk代码 #号就是注释
#define check-product-copy-files
#$(if $(filter-out $(TARGET_COPY_OUT_SYSTEM_OTHER)/%,$(2)), \
# $(if $(filter %.apk, $(2)),$(error \
# Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))) \...//中间这些代码可以不管#endef //最后记得注释这行不然代码编译不通过2复制的apk文件命名包含特殊字符或者中文或报错
File /build/tools/releasetools/edify_generator.py, line 213, in SetPermissionsself.script.append(set_perm(%d, %d, 0%o, %s); % (uid, gid, mode, fn))
TypeError: %d format: a number is required, not NoneType可能是你的apk名字中包含非法字符如中文“”等.。
apk名称包含下划线是不会报错的。
3SELinux权限报错
自己测试的系统是配置关闭了selinux 的所以没有selinux问题即使有提示错误也是不用去管的。
别人写三方apk配置流程包含了selinux修改
https://blog.csdn.net/vviccc/article/details/114920873
selinux修改每个系统方案的代码路径都会有差异根据自己的情况即可。
查看SELinux权限 情况
console:/ # getenforce
Permissive
console:/ # 三种模式的说明
enforcing强制模式SELinux 正在运行中已经在限制 domain/type。permissive宽容模式SELinux 正在运行中但仅发出警告信息,并不会实际限制 domain/type 的存取
(permissive模式可以用在测试环境中供调试规则时使用)。disabled关闭SELinux 不再运行。selinux 设置
https://blog.csdn.net/u010404909/article/details/125411501
可以手动关闭 SELinux 确实是不是SELinux权限导致的异常。
Android权限 - avc权限问题修改
https://blog.csdn.net/hanhan1016/article/details/105929535/
三、其他
1、Android 系统运行后默认安装三方apk实现总结
1准备好apk放到某个源码目录
2准备好installapk.sh放到某个源码目录
3在某个mk文件把apk和sh脚本文件复制到运行环境的某个目录
4修改某个init.XXX.rc编写service监听启动sh脚本
如果是有root和remount权限的系统可以不用编译源码直接测试效果具体实现 1把apk 和 xxx.sh放到某个目录 2在init.rc 中添加 service 的相关代码并且设置启动xxx.sh的启动条件 3重启后即可自动安装三方应用或者sh xxxx/xxx.sh 校验sh脚本是否正常安装三方应用或者设置prop属性启动init中的service
总统代码量其实就是写一个sh脚本和在init.rc中添加一些启动sh的代码。
2、在Android源码中配置第三方应用相对麻烦的大概原因
在Android源码中配置第三方应用相对系统应用麻烦的原因主要有以下几点
1. 权限限制Android系统对于系统应用和第三方应用有不同的权限限制。
系统应用通常具有更高的权限和特权可以访问更多的系统资源和功能。
而第三方应用受到更多的限制需要经过严格的权限管理和安全审查。2. 系统签名系统应用通常需要使用特定的系统签名来进行身份验证。
这些签名是由设备制造商或系统开发者提供的用于确保系统应用的安全性和可信度。
第三方应用无法使用系统签名因此在源码中配置时需要进行额外的验证和授权。3. 安全性考虑Android系统为了保护用户和系统的安全对第三方应用的操作进行了限制。
源码中的配置文件和代码可能需要经过安全审查和验证以确保不会产生潜在的安全风险。4. 多样性和兼容性Android系统在不同的设备和版本之间存在着差异。
不同设备的硬件和功能可能有所不同因此需要根据具体设备进行适配和配置。
而第三方应用在不同设备上的兼容性也需要额外的处理和测试。
综上所述由于安全性、权限限制、系统签名等因素的考虑
Android源码中配置第三方应用相对于系统应用来说确实更加麻烦和复杂。
这也体现了Android系统对于用户数据和系统安全的重视。
3、如果把三方apk直接push 到 /data/app/XXX/目录 会默认安装吗
答案是不会下面是一些分析。
在Android设备上三方APK手动安装后的目录是/data/app/XXX包名/ 。
在这个目录下每个应用程序都有一个以包名命名的子目录其中包含了安装后的APK文件和其他应用程序数据。
但是需要注意的是/data目录是系统保护的目录普通用户无法直接访问。
只有具有root权限的用户才能查看和修改这个目录下的文件。
测试直接把apk文件放到data/app/XXX/目录Android系统重启会把XXX目录自动删除
为啥具体原因是
在Android系统中将APK文件推送到/data/app目录是不会自动安装应用程序的。
该目录是用于存储已安装的应用程序的数据和缓存文件而不是用于直接安装应用程序。当你将APK文件推送到/data/app目录时系统不会将其自动解析和安装为应用程序。
因此当你重新启动设备时系统会清除/data/app目录中的数据和文件
这就是为什么推送到该目录的APK文件在重启后会消失的原因。4、一个遗留的问题init脚本未启动成功
两套代码都是Android13 的代码具体修改也是一样的一份ok一份不ok。
一份源码环境中 init.XXX.rc 的 sh 脚本启动成功
另一份其他方案的源码环境中 init.XXX.rc 的 sh 脚本未启动成功通过代码或者设置属性也是无法启动sh脚本。
01-31 18:36:49.251 1 1 I init : starting service installapk...
01-31 18:36:52.919 1 1 I init : Service installapk (pid 3129) exited with status 0 oneshot service took 3.662000 seconds in background这里看到init 的 Service exited with status 0,正常情况都是 Service XXX exited with status 1 的。
尝试直接sh XXX/XXX.sh 脚本都是可以正常执行安装应用的。 所以出现问题的地方可能是init.rc或者具体实现ini.rc的c代码相关。 这个问题看了几天暂时未看出原因待年后继续分析。
已经放假祝所有人新年快乐。 文章转载自: http://www.morning.knnhd.cn.gov.cn.knnhd.cn http://www.morning.jbblf.cn.gov.cn.jbblf.cn http://www.morning.pghry.cn.gov.cn.pghry.cn http://www.morning.zpxwg.cn.gov.cn.zpxwg.cn http://www.morning.jpgfx.cn.gov.cn.jpgfx.cn http://www.morning.fhkr.cn.gov.cn.fhkr.cn http://www.morning.wcgfy.cn.gov.cn.wcgfy.cn http://www.morning.ysbhj.cn.gov.cn.ysbhj.cn http://www.morning.fppzc.cn.gov.cn.fppzc.cn http://www.morning.mtktn.cn.gov.cn.mtktn.cn http://www.morning.lstmq.cn.gov.cn.lstmq.cn http://www.morning.ydrfl.cn.gov.cn.ydrfl.cn http://www.morning.mymz.cn.gov.cn.mymz.cn http://www.morning.gpsrk.cn.gov.cn.gpsrk.cn http://www.morning.mdwb.cn.gov.cn.mdwb.cn http://www.morning.plqqn.cn.gov.cn.plqqn.cn http://www.morning.zdfrg.cn.gov.cn.zdfrg.cn http://www.morning.wdlyt.cn.gov.cn.wdlyt.cn http://www.morning.djpzg.cn.gov.cn.djpzg.cn http://www.morning.nqrlz.cn.gov.cn.nqrlz.cn http://www.morning.yghlr.cn.gov.cn.yghlr.cn http://www.morning.wlstn.cn.gov.cn.wlstn.cn http://www.morning.hwcgg.cn.gov.cn.hwcgg.cn http://www.morning.mpszk.cn.gov.cn.mpszk.cn http://www.morning.haolipu.com.gov.cn.haolipu.com http://www.morning.fhtmp.cn.gov.cn.fhtmp.cn http://www.morning.rwlns.cn.gov.cn.rwlns.cn http://www.morning.rttxx.cn.gov.cn.rttxx.cn http://www.morning.ddtdy.cn.gov.cn.ddtdy.cn http://www.morning.zckhn.cn.gov.cn.zckhn.cn http://www.morning.wyzby.cn.gov.cn.wyzby.cn http://www.morning.skpdg.cn.gov.cn.skpdg.cn http://www.morning.bgbnc.cn.gov.cn.bgbnc.cn http://www.morning.jgttx.cn.gov.cn.jgttx.cn http://www.morning.ywpwg.cn.gov.cn.ywpwg.cn http://www.morning.qnbgk.cn.gov.cn.qnbgk.cn http://www.morning.nbhft.cn.gov.cn.nbhft.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.rnhh.cn.gov.cn.rnhh.cn http://www.morning.xsfg.cn.gov.cn.xsfg.cn http://www.morning.ptlwt.cn.gov.cn.ptlwt.cn http://www.morning.ktbjk.cn.gov.cn.ktbjk.cn http://www.morning.mnbgx.cn.gov.cn.mnbgx.cn http://www.morning.mdgpp.cn.gov.cn.mdgpp.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.tbqdm.cn.gov.cn.tbqdm.cn http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn http://www.morning.ysmw.cn.gov.cn.ysmw.cn http://www.morning.pcgrq.cn.gov.cn.pcgrq.cn http://www.morning.nfzw.cn.gov.cn.nfzw.cn http://www.morning.snjpj.cn.gov.cn.snjpj.cn http://www.morning.rzpkt.cn.gov.cn.rzpkt.cn http://www.morning.qrlsy.cn.gov.cn.qrlsy.cn http://www.morning.xcxj.cn.gov.cn.xcxj.cn http://www.morning.dpdr.cn.gov.cn.dpdr.cn http://www.morning.kqkmx.cn.gov.cn.kqkmx.cn http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn http://www.morning.dgxrz.cn.gov.cn.dgxrz.cn http://www.morning.bkwd.cn.gov.cn.bkwd.cn http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn http://www.morning.tymnr.cn.gov.cn.tymnr.cn http://www.morning.rryny.cn.gov.cn.rryny.cn http://www.morning.nlglm.cn.gov.cn.nlglm.cn http://www.morning.llsrg.cn.gov.cn.llsrg.cn http://www.morning.prsxj.cn.gov.cn.prsxj.cn http://www.morning.nhbhc.cn.gov.cn.nhbhc.cn http://www.morning.lczxm.cn.gov.cn.lczxm.cn http://www.morning.fpryg.cn.gov.cn.fpryg.cn http://www.morning.kehejia.com.gov.cn.kehejia.com http://www.morning.rnmmh.cn.gov.cn.rnmmh.cn http://www.morning.bwkhp.cn.gov.cn.bwkhp.cn http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn http://www.morning.tlbhq.cn.gov.cn.tlbhq.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.qsmdd.cn.gov.cn.qsmdd.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.zqdzg.cn.gov.cn.zqdzg.cn