文章目录
- 前言
- 一、导入源码
- 二、添加依赖
- 1.引入framework.jar
- 2.引入其他依赖
- 3.引入so库
- Apk签名
- 总结
前言
要对短信应用进行二次开发,之前也没有怎么搞过系统app这块,网上提供开发方式主要有两种,一种是在系统源码下修改然后通过mm命令进行编译,编译生成的apk再安装到手机上,这种方式配置没有那么麻烦,但是每一次开发和安装比较繁琐。另外一种就是导入到AndroidStudio进行开发,这种方式后面开发过程体验较好,只是前期环境配置比较麻烦。
一、导入源码
我下载的是Android11的源码,Messaging源码位置位于./packages/apps/Messaging下,按照平常开发流程增加App目录和gradle文件,分别将src和res等文件移植到到相应目录下。
二、添加依赖
1.引入framework.jar
下载/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar,新建目录ext_lib,在app目录下的build.gradle文件中引入
compileOnly files('ext_libs\\framework.jar')
在根目录build.gradle加入
allprojects {
repositories {
google()
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\ext_libs\\framework.jar')
}
}
}
2.引入其他依赖
查看源码的Android.mk文件,发现还需要关联动态库androidx.appcompat:appcompat:1.1.0(直接引用),libchips 、 libphotoviewer(引入过程中发现最终只需要这几个), 静态库android-common、com.android.vcard、guava,android-common-framesequence,libphonenumber
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.core_core \
androidx.media_media \
androidx.legacy_legacy-support-core-utils \
androidx.legacy_legacy-support-core-ui \
androidx.fragment_fragment \
androidx.appcompat_appcompat \
androidx.palette_palette \
androidx.recyclerview_recyclerview \
androidx.legacy_legacy-support-v13 \
colorpicker \
libchips \
libphotoviewer
LOCAL_STATIC_JAVA_LIBRARIES := \
androidx.annotation_annotation \
android-common \
android-common-framesequence \
com.android.vcard \
guava \
libphonenumber
libchips 、 libphotoviewer中含有资源文件,直接引入相应的.jar文件还会报错,所以我直接去系统里面下载源码当作module进行引入。photoviewer源码位于./frameworks/opt/photoviewer/下,chips目录位于./frameworks/opt/chips/下
其他静态依赖可以在out/target/common/obj/JAVA_LIBRARIES/目录下查找如上需要的库
将引入的包都放进libs目录下,然后直接引用就可以了
implementation fileTree(dir: "libs", include: ["*.jar"])
3.引入so库
在使用过程中发现加载gif动态图会崩溃,提示找不到so库,后面发现android-common-framesequence中有个FrameSequence类里面需要加载libframesequence.so这个库
static {
System.loadLibrary("framesequence");
}
native代码在./frameworks/ex/framesequence/jni下,查看Android.mk文件需要依赖libgiflib.so和libwebp-decode.a文件
### include giflib as a prebuilt lib 使用动态链接库的方式 ###
include $(CLEAR_VARS)
LOCAL_MODULE := giflib-prebuilt
LOCAL_SRC_FILES := external/giflib/libgiflib.so
include $(PREBUILT_SHARED_LIBRARY)
### include libwebp-decode as a prebuilt lib 使用静态链接库的方式 ###
include $(CLEAR_VARS)
LOCAL_MODULE := libwebp-decode-prebuilt
LOCAL_SRC_FILES := external/webp/libwebp-decode.a
include $(PREBUILT_STATIC_LIBRARY)
具体怎么编译可以查看编译使用Android源码中的GIF图片工具包,短信在发送gif图片时也出现了崩溃会提示GifTranscoder中giftranscode.so找不到,而libgiftranscode.so也是需要自己去编译,native代码就在Messaging目录下的jni目录下,这个编译过程跟framesequence编译过程一样,但是还要把引入giflib中的头文件,
再将头文件引入进来
LOCAL_C_INCLUDES := \
external/giflib'
Apk签名
四组默认签名供Android.mk在编译APK使用:
1、testkey:普通APK,默认情况下使用。
2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
3、shared:该APK需要和home/contacts进程共享数据。
4、media:该APK是media/download系统中的一环。
Messaging中LOCAL_CERTIFICATE := platform,签名使用platform.pk8 和 platform.x509.pem,下载keytool-importkeypair,将platform.pk8 和 platform.x509.pem 放在 keytool-importkeypair目录下执行
./keytool-importkeypair -k ./platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
然后在app里面引用签名就可以,但我目前在Android11可以直接运行,Android11默认短信应用为Messenger没有预装Messaging,在开发过程中可以直接运行。
总结
之前一直都是做互联网应用这块的,对系统app这快了解不多,但阅读整个源码下来发现还是有很多东西值得去学习的。