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'。