android怎么预置app(Android 系统如何预置 APP?)

生活常识 2023-04-19 20:07生活常识www.baidianfengw.cn

Android是如何隐藏手机软件的?安卓如何预置APP?

Android系统预置APP是框架应用开发中的常见任务。预置app有两种,一种是直接预置APK,一种是预置有源代码的app。

预置 apk

示例说明

以Shadowsocks.apk为例,在AOSP/packages/apps中新建一个名为Shadowsocks的文件,放到Shadowsocks.apk中,然后创建Android.mk,内容如下

LOCAL _ PATH :=$(call my-dir)include $(CLEAR _ VARS)LOCAL _ MODULE _ TAGS :=option allocal _ MODULE :=你的app文件夹名# Signature LOCAL _ certificate :=desired key #指定src目录LOCAL _ src _ files :=appapkfilename LOCAL _ MODULE _ class 3360=本模块的apps #后缀。不需要定义# local _ module _ suffix :=$(common _ Android _ package _ suffix)include $(build _ pre build)解释.

LOCAL_PATH :=$(调用my-dir)每个Android.mk文件都必须以LOCAL_PATH的定义开头,这个定义用来在开发树中查找源文件。

include $(CLEAR_VARS)CLEAR_VARS变量由Build System提供,指向一个指定的GNU Makefile,负责清理很多LOCAL_xxx。

例如local _ module、local _ src _ files、local _ static _ libraries等。但未清理LOCAL_PATH。

local _ module _ tags:=user eng tests optional可选定义,指明版本是在哪个版本下编译的,缺省为optional。

User:表示模块只在用户版本下编译。

Eng:表示该模块仅在Eng版本中编译。

Tests:表示模块只在Tests版本下编译。

Optional:表示该模块在所有版本中编译。

不需要定义LOCAL_MODULE的模块名。默认值为=$(LOCAL_PACKAGE_NAME),不能与现有模块相同。如果未设置此变量,将使用LOCAL_PACKAGE_NAME。否则,编译将会失败。

LOCAL_CERTIFICATE在什么情况下签名。

Testkey:普通APK,默认使用。

平台APK完成了系统的一些核心功能。在对系统中存在的文件夹进行访问测试之后,

以这种方式编译APK的进程的UID是system,如设置中所示。

共享APK需要与“家庭/联系人”流程共享数据。请参考启动器。

媒体APK是媒体/下载系统的一部分。请参考图库。

LOCAL_MODULE_CLASS指定了模块的类型,它没有 不需要定义。

#编译apk文件LOCAL_MODULE_CLASS :=APPS#编译jar包LOCAL _ MODULE _ CLASS :=Java _ librayies #定义动态库文件LOCAL _ MODULE _ CLASS :=shared _ librayies #编译可执行文件LOCAL _ MODULE _ CLASS :=executables include $(BUILD _ PACKAGE)意味着生成apk,apk可以是各种类型的(apk和资源包文件都可以编译,需要指定LOCAL _ export _ PACKAGE _ resources :=true)。BUILD_JAVA_LIBRARY(java共享库)BUILD_STATIC_JAVA_LIBRARY(java静态库)BUILD_SHARED_LIBRARY(原生共享库)BUILD_STATIC_LIBRARY(原生静态库)完整示例.

Shadowsocks.apk对应于以下内容

LOCAL _ PATH :=$(call my-dir)include $(CLEAR _ VARS)LOCAL _ MODULE _ TAGS :=option allocal _ MODULE :=shadow socks #系统签名LOCAL _ certificate :=presigned LOCAL _ src _ files :=$(LOCAL _ MODULE)。apklocal _ module _ class:=AP。

PS#LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)include $(BUILD_PREBUILT)

更改 device.mk 文件

AOSP/build/target/board/lunch的版本/device.mk 文件,我编的是 aosp_x86-eng,所以增加或者更新 AOSP/build/target/board/generic_x86/device.mk

PRODUCT_PACKAGES += \ Shadowsocks \

使用 mmm 命令来编译指定的模块

mmm packages/apps/Shadowsocks

编译好模块后,还要重新打包一下 system.img 文件

make snod

完成后就可以烧录了。

问题

1、如何将 APK 预置到 system/priv-app 里?

加入 priv-app :在 Android.mk 中增加 LOCAL_PRIVILEGED_MODULE := true

预置有源码 APP

预置有源码 APP 比预置 APK 要麻烦很多,可能会涉及 jar 包和 so 库等。现在基本都是基于 Android Studio 的项目 MyTestProject1,我们先在 AOSP/packages/apps 新建名为 MyTestProject2 的文件夹,在新建 MyTestProject2/libs、MyTestProject2/res、MyTestProject2/src,分别将 MyTestProject1 下 jar 包和 so 库拷到 MyTestProject2/libs 和 MyTestProject2/libs/armeabi,将 MyTestProject1/app/src/main/res 拷到 MyTestProject2/res,将 MyTestProject1/app/src/main/java 下文件拷到 MyTestProject2/src 下。

引用第三方 jar 包

假设,我们当前目录下的 libs 有 AndroidUtil.jar包,我们想引用它,需要做两个步骤

之一步、 声明我们 jar 包所在的目录

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AndroidUtil:libs/AndroidUtil.jar

这行代码的意思大概可以理解成这样,声明一个变量 AndroidUtil,它的 value 是 libs/AndroidUtil.jar

include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AndroidUtil:libs/AndroidUtil.jarinclude $(BUILD_MULTI_PREBUILT)

第二步、 引用我们声明 jar 包的变量

include $(CLEAR_VARS)# 省略其他LOCAL_STATIC_JAVA_LIBRARIES := \ AndroidUtil# 省略其他include $(BUILD_PACKAGE)引用 so 库

假设,我们当前目录下的 libs/armeabi 有 libBaiduMapSDK1.so、libBaiduMapSDK1.so,我们想引用它,有两种 ,可以在根目录 Android.mk 引用 so 库,也可以在 libs 下再建个 Android.mk 配置好 so 库,然后 include,推荐第二种方式。

libs/Android.mk#====================================================include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE_SUFFIX := .soLOCAL_MODULE := libBaiduMapSDK1LOCAL_MODULE_CLASS := SHARED_LIBRARIESLOCAL_SRC_FILES :=libs/armeabi/$(LOCAL_MODULE).soLOCAL_MULTILIB := bothinclude $(BUILD_PREBUILT)#====================================================#====================================================include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE_SUFFIX := .soLOCAL_MODULE := libBaiduMapSDK2LOCAL_MODULE_CLASS := SHARED_LIBRARIESLOCAL_SRC_FILES :=libs/armeabi/$(LOCAL_MODULE).soLOCAL_MULTILIB := bothinclude $(BUILD_PREBUILT)

引用 so 库

include $(CLEAR_VARS)# 省略其他LOCAL_JNI_SHARED_LIBRARIES := \ libBaiduMapSDK1 \ libBaiduMapSDK2# 省略其他include $(BUILD_PACKAGE)##########引用第三方 so 库##########include $(LOCAL_PATH)/libs/Android.mk

完整示例

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_PACKAGE_NAME := TestNameLOCAL_CERTIFICATE := platform# 引入系统资源文件LOCAL_USE_AAPT2 := true# Java文件LOCAL_SRC_FILES := $(call all-java-files-under, src)# 资源文件,可选定义,推荐不定义#LOCAL_RESOURCE_DIR = \# $(LOCAL_PATH)/res \# frameworks/support/v7/appcompat/res \# frameworks/support/design/res# 可以使用系统 hide apiLOCAL_PRIVATE_PLATFORM_APIS := true# 导入系统依赖LOCAL_STATIC_ANDROID_LIBRARIES := \ android-support-design \ android-support-v4 \ android-support-v7-appcompat \ android-support-v7-recyclerview LOCAL_STATIC_JAVA_LIBRARIES := \ AndroidUtilLOCAL_JNI_SHARED_LIBRARIES := \ libBaiduMapSDK1 \ libBaiduMapSDK2# R资源生成别名,--extra-packages 是为资源文件设置别名意思是通过该应用包名+R,com.android.test1.R 和 com.android.test2.R 都可以访问到资源LOCAL_AAPT_FLAGS := --auto-add-overlayLOCAL_AAPT_FLAGS += --extra-packages android.support.v4LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompatLOCAL_AAPT_FLAGS += --extra-packages android.support.designLOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview# 制定编译的工程,不要使用代码混淆的工具进行代码混淆LOCAL_PROGUARD_ENABLED := disabled# 指定不需要混淆的native 与变量的proguard.flags文件LOCAL_PROGUARD_FLAG_FILES := proguard.flagsinclude $(BUILD_PACKAGE)##########引用第三方 jar 包##########include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AndroidUtil:libs/AndroidUtil.jarinclude $(BUILD_MULTI_PREBUILT)##########引用第三方 so 库##########include $(LOCAL_PATH)/libs/Android.mk

问题

1、LOCAL_PRIVATE_PLATFORM_APIS 和 LOCAL_SDK_VERSION 有什么区别?

LOCAL_PRIVATE_PLATFORM_APIS := true

设置后,会使用 sdk 的 hide 的 api 来编译。

LOCAL_SDK_VERSION 这个编译配置,就会使编译的应用不能访问 hide 的 api,有时一些系统的 class 被 import 后编译时说找不到这个类,就是这个原因造成的。

2、如果直接用 mmm 编译然后 adb install -r xxx.apk 大概会出现如下错误

Failed to install out/target/product/p212/system/app/xxx/xxx.apk: Failure [INSTALL_FAILED_INVALID_APK: Package couldn't be installed in /data/app/com.droidlogic.mboxlauncher-1: Package /data/app/com.droidlogic.mboxlauncher-1/base.apk code is missing]

解决

在对应 app 的 Android.mk 文件中加入

LOCAL_DEX_PREOPT := false

关闭 dex 优化来提高调试过程,把编译后的 APK 直接替换安装 adb install -r XXX.apk,不然 APK 得 Push 到 system/app,重启设备。

3、在 Android Studio Gradle 方式中通过 implementation 方式加载的三方库,并没有下载 jar 文件放到 libs 文件夹下啊,该如何集成?

其实 jar 包有被下载到项目的 External Libraries 目录下,找到引用的 jar 包,点右键 Show in Files,就能得到了 jar 包的文件地址,然后把它拷到 libs 文件夹下,就能像别的 jar 包一样处理了。

在 External Libraries 目录还能看到隐藏的 jar,比如 retrofit,其实它有引用 okhttp,okhttp 又引用了 okio,这些也是需要

的,一并拷到 libs 文件夹下。

4、第三方无法定位?

第三方定位如百度、高德,申请 SDK 时会需要填写包名和打包签名等信息,如何正确地预置源码 APP 可以定位,除了配置LOCAL_CERTIFICATE := platform使用系统的签名,还得在项目的AndroidMainfest.xml 根节点配置android:sharedUserId=\"android.uid.system\"。

android 系统设置app androidapp怎么配置

Copyright@2015-2025 白癜风网版板所有