文章目录
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库文件,按照以下步骤操作:
-
准备工具:首先,您需要一个能够解压APK文件的工具。最常用的工具有WinRAR(在Windows上)或者7-Zip(跨平台),当然也可以使用Android开发中常用的解压软件或命令行工具。
-
更改文件扩展名(可选):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