1. 首页 > 手游资讯

Android系统如何预设APP android系统如何关闭通知

作者:admin 更新时间:2024-10-26
摘要:预设应用程序示例说明以Shadowsocks.apk为例,在AOSP/packages/apps中新建一个名为Shadowsocks的文件,放入Shadowso,Android系统如何预设APP android系统如何关闭通知

 

大家好,今天给各位分享Android系统如何预设APP?的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

预设应用程序

示例说明

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

LOCAL_PATH :=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS :=可选LOCAL_MODULE :=你的应用程序文件夹名称# 签名LOCAL_CERTIFICATE :=所需密钥# 指定src 目录LOCAL_SRC_FILES :=应用程序apk 文件名LOCAL_MODULE_CLASS :=该模块的APPS#后缀,无需定义#LOCAL_MODULE_SUFFIX :=$(COMMON_ANDROID_PACKAGE_SUFFIX)include $(BUILD_PREBUILT)

解释:

LOCAL_PATH :=$(调用我的目录)

每个Android.mk 文件必须首先定义LOCAL_PATH,用于在开发树中查找源文件。

包括$(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:表示该模块仅在eng版本下编译

tests:表示该模块仅在tests版本下编译

可选的:表示该模块在所有版本中都编译

本地模块

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

本地证书

什么情况下签字。

testkey:普通APK,默认使用。

platform:该APK完成系统的一些核心功能。测试对系统中现有文件夹的访问后,

这样编译出来的APK进程的UID是system,参见设置。

共享:此APK需要与home/contacts进程共享数据,请参阅Launcher。

媒体:此APK 是媒体/下载系统的一部分,请参阅图库。

LOCAL_MODULE_CLASS

指定模块的类型,无需定义。

# 编译apk文件LOCAL_MODULE_CLASS :=APPS# 编译jar包LOCAL_MODULE_CLASS :=JAVA_LIBRAYIES# 定义动态库文件LOCAL_MODULE_CLASS :=SHARED_LIBRAYIES# 编译可执行文件LOCAL_MODULE_CLASS :=EXECUTABLES

包括$(BUILD_PACKAGE)

表示生成apk,可以有多种类型

BUILD_PACKAGE(可以编译apk和资源包文件,但需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true) BUILD_JAVA_LIBRARY(java共享库) BUILD_STATIC_JAVA_LIBRARY(java静态库) BUILD_EXECUTABLE(可执行文件) BUILD_SHARED_LIBRARY(原生共享库) BUILD_STATIC_LIBRARY(原生)静态库)

完整示例

Shadowsocks.apk对应如下:

LOCAL_PATH :=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS :=可选LOCAL_MODULE :=Shadowsocks# 系统签名LOCAL_CERTIFICATE :=PRESIGNEDLOCAL_SRC_FILES :=$(LOCAL_MODULE).apkLOCAL_MODULE_ CLASS 3336 0=应用#LOCAL_MODULE_SUFFIX :=$(COMMON_ANDROID_PACKAGE_SUFFIX)include $(构建_预构建)

更改device.mk文件

AOSP/build/target/board/lunch的version/device.mk文件,我编辑了aosp_x86-eng,所以添加或更新AOSP/build/target/board/generic_x86/device.mk:

产品包+=\Shadowsocks\

使用mmm命令编译指定模块:

mmm 包/应用程序/Shadowsocks

模块编译完成后,需要重新打包system.img文件:

使斯诺德

完成后就可以开始刻录了。

问题

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包。如果我们想要引用它,我们需要做两步:

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=AndroidUtil:libs/AndroidUtil.jar

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

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库,然后包含它。推荐第二种方法。

libs/Android.mk#======================================================包括$(CLEAR_VARS)LOCAL_MODULE_TAGS :=可选LOCAL_MODULE_SUFFIX :=.soLOCAL_MODULE :=libBaiduMapSDK1LOCAL_MODULE_CLASS :=SHARED_LIBRARIESLOCAL_SRC_FILES :=libs/armeabi/$( ULE).soLOCAL_MULTILIB :=两者都包括$(BUILD_PREBUILT)#======================================================#=====================================================包括$(CLEAR_VARS)LOCAL_MODULE_TAGS :=可选LOCAL_MODULE_SUFFIX :=.soLOCAL_MODULE :=libBaiduMapSDK2LOCAL_MODULE_CLASS :=SHARED_LIBRARIESLOCAL_SRC_FILES :=libs/armeabi/$(LOCAL_MODULE) .soLOCAL_MULTILIB :=两者都包括$(BUILD_PREBUILT)

引用so库

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

完整示例

LOCAL_PATH:=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS :=可选LOCAL_PACKAGE_NAME :=TestNameLOCAL_CERTIFICATE :=platform# 引入系统资源文件LOCAL_USE_AAPT2 :=true# Java 文件LOCAL_SRC_FILES :=$( call all- java 文件下, 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#为不需要混淆的原生方法和变量指定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 :=真

设置完成后,将使用sdk的hide api进行编译。

LOCAL_SDK_VERSION的编译配置将阻止编译后的应用程序访问hide api。有时导入一些系统类,编译器会说找不到该类。这就是原因。

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

无法安装out/target/product/p212/system/app/xxx/xxx.apk: 失败[INSTALL_FAILED_INVALID_APK: 软件包无法安装在/data/app/com.droidlogic.mboxlauncher-1: 软件包/data/app/com 中。 droidlogic.mboxlauncher-1/base.apk 代码丢失]

解决方案:

添加到对应app的Android.mk文件中

LOCAL_DEX_PREOPT :=假

关闭dex优化以改善调试过程,直接用adb install -r XXX.apk替换编译好的APK,否则必须将APK推送到system/app并重启设备。

3、Android Studio Gradle模式下通过实现方式加载的第三方库不会下载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'。