Android系统app开发,aosp中内置客户第三方apk

Android系统app开发

系统app阔以使用很多系统源码中隐藏的api

首先先编译出jar包

在这里插入图片描述

整编源码后,在这个目录下,这个就是包含系统源码隐藏api的jar包

在这里插入图片描述

系统app的标志

在这里插入图片描述

拷贝jar文件到app模块下

在这里插入图片描述

在编译之前把这个jar添加到classpath路径里面去,这样才能使用里面的api

在这里插入图片描述

app模块下,complieOnly,只在编译的时候需要,不需要把它打包到apk包里面去

在这里插入图片描述

制作系统签名文件

在这里插入图片描述

在这里插入图片描述

Androidstudio配置签名

 signingConfigs {
        sign {
            storeFile file('platform.keystore')
            storePassword 'android'
            keyAlias = 'platform'
            keyPassword 'android'
        }
    }

在这里插入图片描述

系统app和普通app区别

比如说 SystemClock.setCurrentTimeMillis()这个只有系统app能够调用的api,普通app调用不了

在这里插入图片描述

有这个hide标记的都不能让第三方app访问

系统app保活

android:persistent=“true”

1.内置普通apk

在package/apps/下创建对应的app文件夹,可以仿造系统应用的写法,

编写Android.mk文件

这段代码是一个Android.mk文件的内容,它是Android Native Development Kit (NDK)用来编译原生C/C++组件或预编译应用程序(如APK)的Makefile脚本的一部分。

这行代码定义了LOCAL_PATH变量,它指出了当前目录的位置。$(call my-dir)是一个NDK中预定义的函数,用于获取包含当前Android.mk文件的目录路径。
LOCAL_PATH:= $(call my-dir)
    
包含CLEAR_VARS变量指向的文件,通常是build/core/clear_vars.mk。这会清除许多 LOCAL_XXX 变量,确保它们为空或默认值,以便为新模块的定义提供一个干净的环境。
include $(CLEAR_VARS)

打印一个警告信息到编译日志中,显示LOCAL_PATH的当前值。这是一种调试手段,帮助开发者确认脚本中的路径设置是否正确。
$(warning "MyApp of LOCAL_PATH is $(LOCAL_PATH)")
# Module name should match apk name to be installed

定义了要构建的模块名称为MyApp。在这个上下文中,它指的是将要被安装的APK名称。
LOCAL_MODULE := MyApp
    
设置模块标签为optional。这意味着该模块默认不会被包含在某些构建变体中,特别是那些通过makedist目标构建的发行版,默认只会编译标记为required或未标记的模块,但可以通过指定标签来包含。
LOCAL_MODULE_TAGS := optional 

指定模块的源文件,这里是MyApp.apk。这意味着我们不是从源代码编译生成APK,而是直接使用一个已经预编译好的APK文件。
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    
指定模块的类型为APPS,意味着这是一个应用(APK),而不是库或其他类型的模块。
LOCAL_MODULE_CLASS := APPS

设置模块的后缀为$(COMMON_ANDROID_PACKAGE_SUFFIX),后者通常定义为.apk,这里是为了兼容性预留的写法,明确指出模块产物是一个APK文件。
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

指出APK已经是预先签名的。这意味着构建系统不会尝试重新签名这个APK,预期这个APK在加入到系统映像前就已经携带了有效的签名。
LOCAL_CERTIFICATE := PRESIGNED
    
最后一行包含了BUILD_PREBUILT变量指向的Makefile脚本(通常位于build/core/build-binary.mk),告诉构建系统这个模块是一个预编译的二进制文件(在这里是APK),应直接拷贝而不进行编译处理。
include $(BUILD_PREBUILT)

总结起来,这个Android.mk文件的作用是告诉Android构建系统如何处理一个已经预编译好的APK文件MyApp.apk,将其作为系统的一个可选组件包含在内,并在构建过程中直接复制该APK到相应位置,不进行重新编译或签名。

此时我们已经创建好了文件夹,但是他还不会被编译到我们的rom中,我们只是在里面写好了mk文件,指定了这个apk的一个编译方式而已。
在这里插入图片描述
要在build/make/target/product/core.mk加入该Module名字才算是打包到系统里面去

我们可以模仿别的app的方法,比如下面的
在这里插入图片描述
进入到这个目录下

build/make/target/product/handheld_product.mk

修改

PRODUCT_PACKAGES += \
    Browser2 \
    Calendar \
    Camera2 \
    Contacts \
    DeskClock \
    Gallery2 \
    Launcher3QuickStep \
    Music \
    OneTimeInitializer \
    Provision \
    QuickSearchBox \
    Settings \
    SettingsIntelligence \
    StorageManager \
    SystemUI \
    WallpaperCropper \
    frameworks-base-overlays \
    MyApp \
    MyApp_SO

编译报错解决,要在devices根目录下的mk文件中添加一个白名单就好了。
在这里插入图片描述
添加系统app白名单

PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \
    root/init.zygote32_64.rc \
    root/init.zygote64_32.rc \
    /system/app/FirstTestSystemApp/FirstTestSystemApp.apk \
    /system/app/MyApp/MyApp.apk \
    /system/bin/HelloServer \
    /system/bin/HelloClient \
    /system/etc/init/HelloServer.rc \

在这里插入图片描述
编译make -j4,可以看到这就是我们预制的客户的第三方app是成功了。
在这里插入图片描述

2.内置携带so库的apk

同样的写好mk文件,然后预制在这里
在这里插入图片描述
mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
$(warning "MyApp of LOCAL_PATH is $(LOCAL_PATH)")
# Module name should match apk name to be installed
LOCAL_MODULE := MyApp_SO
LOCAL_MODULE_TAGS := optional
#不管是user 还是eng 版本都会编译此app
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS := lib/x86_64/libnative-lib.so

LOCAL_CERTIFICATE := platform
#表示app已经签名
include $(BUILD_PREBUILT)

2.1 如何解压提取apk中的so库文件

要从APK文件中解压并提取SO库文件,按照以下步骤操作:

  1. 准备工具:首先,您需要一个能够解压APK文件的工具。最常用的工具有WinRAR(在Windows上)或者7-Zip(跨平台),当然也可以使用Android开发中常用的解压软件或命令行工具。

  2. 更改文件扩展名(可选):APK文件本质上是一个zip格式的压缩包,如果您使用的解压工具不直接识别APK文件,您可以将APK文件的扩展名改为.zip。例如,如果文件名为app.apk,可以将其改名为app.zip

解压APK文件

  • 使用WinRAR或7-Zip:右键点击APK文件,选择“解压到当前文件夹”或“解压到指定文件夹”,然后选择一个位置存放解压出的内容。
  • 命令行:如果您在Linux或Mac系统中,可以直接在终端使用unzip命令,如unzip app.apk -d app_folder,这会将APK内容解压到名为app_folder的目录中。
2.1.1 window中获取so库

直接改后缀为压缩包后缀然后用解压工具即可
在这里插入图片描述
打开看看
在这里插入图片描述
在这里插入图片描述

2.1.2 在linux环境中

改个后缀名zip然后解压即可
在这里插入图片描述
然后把.so库文件放到lib文件夹中单独编译到系统中,需要在白名单中加上这个so库。
在这里插入图片描述
编译运行在,这就是我们预制带So库的app
在这里插入图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值