0
点赞
收藏
分享

微信扫一扫

Android 系统预设 App,有什么难的?,2021最新阿里Android高级面试题总结

ZMXQQ233 2022-03-11 阅读 57

6、LOCAL_MODULE_CLASS

指定模块的类型,可不用定义。

编译 apk 文件

LOCAL_MODULE_CLASS := APPS

编译 jar 包

LOCAL_MODULE_CLASS := JAVA_LIBRAYIES

定义动态库文件

LOCAL_MODULE_CLASS := SHARED_LIBRAYIES

编译可执行文件

LOCAL_MODULE_CLASS := EXECUTABLES

7、include $(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(native共享库)

  • BUILD_STATIC_LIBRARY(native静态库)

完整示例


Shadowsocks.apk 对应如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := Shadowsocks

系统签名

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

#LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

更改 device.mk 文件

AOSP/build/target/board/lunch 的版本 /device.mk 文件,我编的是 aosp_x86-eng,所以增加或者更新 AOSP/build/target/board/generic_x86/device.mk

PRODUCT_PACKAGES += \

Shadowsocks \

使用 mmm 命令来编译指定的模块:

mmm packages/apps/Shadowsocks

编译好模块后,还要重新打包一下 system.img 文件:

make snod

完成后就可以烧录了。

问题:如何将 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包,我们想引用它,需要做两个步骤:

第一步、 声明我们 jar 包所在的目录

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AndroidUtil:libs/AndroidUtil.jar

这行代码的意思大概可以理解成这样,声明一个变量 AndroidUtil,它的 value 是 libs/AndroidUtil.jar。

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AndroidUtil:libs/AndroidUtil.jar

include $(BUILD_MULTI_PREBUILT)

第二步、 引用我们声明 jar 包的变量。

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 库,然后 include,推荐第二种方式。

libs/Android.mk

#====================================================

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_SUFFIX := .so

LOCAL_MODULE := libBaiduMapSDK1

LOCAL_MODULE_CLASS := SHARED_LIBRARIES

LOCAL_SRC_FILES :=libs/armeabi/$(LOCAL_MODULE).so

LOCAL_MULTILIB := both

include $(BUILD_PREBUILT)

#====================================================

#====================================================

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_SUFFIX := .so

LOCAL_MODULE := libBaiduMapSDK2

LOCAL_MODULE_CLASS := SHARED_LIBRARIES

LOCAL_SRC_FILES :=libs/armeabi/$(LOCAL_MODULE).so

LOCAL_MULTILIB := both

include $(BUILD_PREBUILT)

引用 so 库

include $(CLEAR_VARS)

省略其他

LOCAL_JNI_SHARED_LIBRARIES := \

libBaiduMapSDK1 \

libBaiduMapSDK2

省略其他

include $(BUILD_PACKAGE)

##########引用第三方 so 库##########

include $(LOCAL_PATH)/libs/Android.mk

完整示例

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

  • Android前沿技术大纲

  • 全套体系化高级架构视频

资料领取:点赞+点击GitHub免费获取

[外链图片转存中…(img-kvfHhpJQ-1646472740029)]

资料领取:点赞+点击GitHub免费获取
举报

相关推荐

0 条评论