文章目录

  • 前言
  • 一、导入源码
  • 二、添加依赖
  • 1.引入framework.jar
  • 2.引入其他依赖
  • 3.引入so库
  • Apk签名
  • 总结



前言

要对短信应用进行二次开发,之前也没有怎么搞过系统app这块,网上提供开发方式主要有两种,一种是在系统源码下修改然后通过mm命令进行编译,编译生成的apk再安装到手机上,这种方式配置没有那么麻烦,但是每一次开发和安装比较繁琐。另外一种就是导入到AndroidStudio进行开发,这种方式后面开发过程体验较好,只是前期环境配置比较麻烦。


一、导入源码

我下载的是Android11的源码,Messaging源码位置位于./packages/apps/Messaging下,按照平常开发流程增加App目录和gradle文件,分别将src和res等文件移植到到相应目录下。

android开发申请短信发送权限 android studio 短信收发_android studio

二、添加依赖

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/目录下查找如上需要的库

android开发申请短信发送权限 android studio 短信收发_android开发申请短信发送权限_02


将引入的包都放进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中的头文件,

android开发申请短信发送权限 android studio 短信收发_android studio_03


再将头文件引入进来

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这快了解不多,但阅读整个源码下来发现还是有很多东西值得去学习的。