Android 系统预设 App,有什么难的?

使用 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.solibBaiduMapSDK1.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

完整示例

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_PACKAGE_NAME := TestName

LOCAL_CERTIFICATE := platform

引入系统资源文件

LOCAL_USE_AAPT2 := true

Java文件

LOCAL_SRC_FILES := $(call all-java-files-under, src)

资源文件,可选定义,推荐不定义

#LOCAL_RESOURCE_DIR = \

$(LOCAL_PATH)/res \

frameworks/support/v7/appcompat/res \

frameworks/support/design/res

可以使用系统 hide api

LOCAL_PRIVATE_PLATFORM_APIS := true

导入系统依赖

LOCAL_STATIC_ANDROID_LIBRARIES := \

android-support-design \

android-support-v4 \

android-support-v7-appcompat \

android-support-v7-recyclerview

LOCAL_STATIC_JAVA_LIBRARIES := \

AndroidUtil

LOCAL_JNI_SHARED_LIBRARIES := \

libBaiduMapSDK1 \

libBaiduMapSDK2

R资源生成别名,–extra-packages 是为资源文件设置别名:意思是通过该应用包名+R,com.android.test1.R 和 com.android.test2.R 都可以访问到资源

LOCAL_AAPT_FLAGS := --auto-add-overlay

LOCAL_AAPT_FLAGS += --extra-packages android.support.v4

LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat

LOCAL_AAPT_FLAGS += --extra-packages android.support.design

LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview

制定编译的工程,不要使用代码混淆的工具进行代码混淆

LOCAL_PROGUARD_ENABLED := disabled

指定不需要混淆的native方法与变量的proguard.flags文件

LOCAL_PROGUARD_FLAG_FILES := proguard.flags

include $(BUILD_PACKAGE)

##########引用第三方 jar 包##########

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AndroidUtil:libs/AndroidUtil.jar

include $(BUILD_MULTI_PREBUILT)

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

include $(LOCAL_PATH)/libs/Android.mk

问题

1. LOCAL_PRIVATE_PLATFORM_APIS 和 LOCAL_SDK_VERSION 有什么区别?

LOCAL_PRIVATE_PLATFORM_APIS := true

设置后,会使用 sdk 的 hide 的 api 来编译。

LOCAL_SDK_VERSION 这个编译配置,就会使编译的应用不能访问 hide 的 api,有时一些系统的 class 被 import 后编译时说找不到这个类,就是这个原因造成的。

2. 如果直接用 mmm 编译然后 adb install -r xxx.apk 大概会出现如下错误:

Failed to install out/target/product/p212/system/app/xxx/xxx.apk: Failure [INSTALL_FAILED_INVALID_APK: Package couldn’t be installed in /data/app/com.droidlogic.mboxlauncher-1: Package /data/app/com.droidlogic.mboxlauncher-1/base.apk code is missing]

解决方法:

在对应 app 的 Android.mk 文件中加入。

LOCAL_DEX_PREOPT := false

关闭 dex 优化来提高调试过程,把编译后的 APK 直接替换安装 adb install -r XXX.apk,不然 APK 得 Push 到 system/app,重启设备。

3. 在 Android Studio Gradle 方式中通过 implementation 方式加载的三方库,并没有下载 jar 文件放到 libs 文件夹下啊,该如何集成?

其实 jar 包有被下载到项目的 External Libraries 目录下,找到引用的 jar 包,点右键 Show in Files,就能得到了 jar 包的文件地址,然后把它拷到 libs 文件夹下,就能像别的 jar 包一样处理了。

另外在 External Libraries 目录还能看到隐藏的 jar,比如 retrofit,其实它有引用 okhttp,okhttp 又引用了 okio,这些也是需要的,一并拷到 libs 文件夹下。

4. 第三方无法定位?

第三方定位如百度、高德,申请 SDK 时会需要填写包名和打包签名等信息,如何正确地预置源码 APP 可以定位,除了配置LOCAL_CERTIFICATE := platform使用系统的签名,还得在项目的AndroidMainfest.xml 根节点配置android:sharedUserId="android.uid.system"

本文对你有帮助吗?留言、关注、点赞是最大的支持,谢谢!

Android开发资料+面试架构资料 免费分享 点击链接 即可领取

《Android架构师必备学习资源免费领取(架构视频+面试专题文档+学习笔记)》

最后

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

img

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值