#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
(
C
L
E
A
R
V
A
R
S
)
L
O
C
A
L
M
O
D
U
L
E
T
A
G
S
:
=
o
p
t
i
o
n
a
l
L
O
C
A
L
M
O
D
U
L
E
S
U
F
F
I
X
:
=
.
s
o
L
O
C
A
L
M
O
D
U
L
E
:
=
l
i
b
B
a
i
d
u
M
a
p
S
D
K
1
L
O
C
A
L
M
O
D
U
L
E
C
L
A
S
S
:
=
S
H
A
R
E
D
L
I
B
R
A
R
I
E
S
L
O
C
A
L
S
R
C
F
I
L
E
S
:
=
l
i
b
s
/
a
r
m
e
a
b
i
/
(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE := libBaiduMapSDK1 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_SRC_FILES :=libs/armeabi/
(CLEARVARS)LOCALMODULETAGS:=optionalLOCALMODULESUFFIX:=.soLOCALMODULE:=libBaiduMapSDK1LOCALMODULECLASS:=SHAREDLIBRARIESLOCALSRCFILES:=libs/armeabi/(LOCAL_MODULE).so
LOCAL_MULTILIB := both
include $(BUILD_PREBUILT)
#====================================================
#====================================================
include
(
C
L
E
A
R
V
A
R
S
)
L
O
C
A
L
M
O
D
U
L
E
T
A
G
S
:
=
o
p
t
i
o
n
a
l
L
O
C
A
L
M
O
D
U
L
E
S
U
F
F
I
X
:
=
.
s
o
L
O
C
A
L
M
O
D
U
L
E
:
=
l
i
b
B
a
i
d
u
M
a
p
S
D
K
2
L
O
C
A
L
M
O
D
U
L
E
C
L
A
S
S
:
=
S
H
A
R
E
D
L
I
B
R
A
R
I
E
S
L
O
C
A
L
S
R
C
F
I
L
E
S
:
=
l
i
b
s
/
a
r
m
e
a
b
i
/
(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE := libBaiduMapSDK2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_SRC_FILES :=libs/armeabi/
(CLEARVARS)LOCALMODULETAGS:=optionalLOCALMODULESUFFIX:=.soLOCALMODULE:=libBaiduMapSDK2LOCALMODULECLASS:=SHAREDLIBRARIESLOCALSRCFILES:=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学习笔记参考(敲黑板!!)
- “寒冬未过”,阿里P9架构分享Android必备技术点,让你offer拿到手软!
- 毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者!
- 腾讯T3大牛带你了解 2019 Android开发趋势及必备技术点!
- 八年Android开发,从码农到架构师分享我的技术成长之路,共勉!
如果你觉得还算有用的话,不妨把它们推荐给你的朋友~
面试宝典
面试必问知识点、BATJ历年历年面试真题+解析
学习经验总结
(一)调整好心态
心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。
(二)时间挤一挤,制定好计划
一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。另外,制定好学习计划也是很有必要的,有逻辑有条理的复习,先查漏补缺,然后再系统复习,这样才能够做到事半功倍,效果才会立竿见影。
(三)不断学习技术知识,更新自己的知识储备
对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
竿见影。**
(三)不断学习技术知识,更新自己的知识储备
对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!