一、如何将带源码的APK预置进系统
在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例
将 Test APK的Source code 拷贝到 Test 文件夹下,删除 /bin 和 /gen 目录
在 Test 目录下创建一个名为 Android.mk的文件,内容如下:
LOCAL_PATH:=
(callmy−dir)include
(
c
a
l
l
m
y
−
d
i
r
)
i
n
c
l
u
d
e
(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES :=
(callall−subdir−java−files)LOCALPACKAGENAME:=Testinclude
(
c
a
l
l
a
l
l
−
s
u
b
d
i
r
−
j
a
v
a
−
f
i
l
e
s
)
L
O
C
A
L
P
A
C
K
A
G
E
N
A
M
E
:=
T
e
s
t
i
n
c
l
u
d
e
(BUILD_PACKAGE)
打开文件 build/target/product/
Project.mk(其中
P
r
o
j
e
c
t
.
m
k
(
其
中
{Project} 表示工程名)
将 Test 添加到 PRODUCT_PACKAGES 里面。
重新 build 整个工程
二、如何将无源码的 APK 预置进系统
在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
将 Test.apk 放到 packages/apps/Test 下面
在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:
LOCAL_PATH :=
(callmy−dir)include
(
c
a
l
l
m
y
−
d
i
r
)
i
n
c
l
u
d
e
(CLEAR_VARS)
Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES :=
(LOCALMODULE).apkLOCALMODULECLASS:=APPSLOCALMODULESUFFIX:=
(
L
O
C
A
L
M
O
D
U
L
E
)
.
a
p
k
L
O
C
A
L
M
O
D
U
L
E
C
L
A
S
S
:=
A
P
P
S
L
O
C
A
L
M
O
D
U
L
E
S
U
F
F
I
X
:=
(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
打开文件 build/target/product/
Project.mk(其中
P
r
o
j
e
c
t
.
m
k
(
其
中
{Project} 表示工程名)
将 Test 添加到 PRODUCT_PACKAGES 里面。
将从Test.apk解压出来的 so库拷贝到alps/vendor/mediatek/ Project/artifacts/out/target/product/ P r o j e c t / a r t i f a c t s / o u t / t a r g e t / p r o d u c t / {Project}/system/lib/目录下,若无 so 库,则去掉此步;
重新 build 整个工程
注:
Android对这些权限进行了四类分级,不同级别的权限对应不同的认证方式。
normal:低风险权限,只要申请了就可以使用(在AndroidManifest.xml中添加标签),安装时不需要用户确认;
dangerous:高风险权限,安装时需要用户的确认才可使用;
signature:只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时(如果是申请系统权限,则需要与系统签名相同),才能将权限授给它;
signatureOrSystem:签名相同,或者申请权限的应用为系统应用(在system image中)。
上述四类权限级别同样可用于自定义权限中。如果开发者需要对自己的应用程序(或部分应用)进行访问控制,则可以通过在AndroidManifest.xml中添加标签,将其属性中的protectionLevel设置为上述四类级别中的某一种来实现。
按照应用需要的权限等级,我们选择将apk安装在系统不同位置.举个例子,如果一个在/system/app下的应用声明获取权限定义中protectionLevel是signatureOrSystem的权限,最后是获取不到这个权限的,但是在/system/priv-app下的应用就可以.我们必须修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。
三、如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复
在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
将 Test.apk 放到 packages/apps/Test 下面;
在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下
LOCAL_PATH :=
(callmy−dir)include
(
c
a
l
l
m
y
−
d
i
r
)
i
n
c
l
u
d
e
(CLEAR_VARS)
Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES :=
(LOCALMODULE).apkLOCALMODULECLASS:=APPSLOCALMODULESUFFIX:=
(
L
O
C
A
L
M
O
D
U
L
E
)
.
a
p
k
L
O
C
A
L
M
O
D
U
L
E
C
L
A
S
S
:=
A
P
P
S
L
O
C
A
L
M
O
D
U
L
E
S
U
F
F
I
X
:=
(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH :=
(TARGETOUTDATAAPPS)include
(
T
A
R
G
E
T
O
U
T
D
A
T
A
A
P
P
S
)
i
n
c
l
u
d
e
(BUILD_PREBUILT)
打开文件 build/target/product/
Project.mk(其中
P
r
o
j
e
c
t
.
m
k
(
其
中
{Project} 表示工程名)
将 Test 添加到 PRODUCT_PACKAGES 里面。
重新 build 整个工程
注意:这个比不能卸载的多了一句
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
四、如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复
方法一:预置apk到system/vendor/operator下面
具体做法如下:
在packages/apps下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例:
将Test.apk 放到 packages/apps/Test 下面;
在packages/apps/Test下面创建文件 Android.mk,文件内容如下:
LOCAL_PATH :=
(callmy−dir)include
(
c
a
l
l
m
y
−
d
i
r
)
i
n
c
l
u
d
e
(CLEAR_VARS)
Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES :=
(LOCALMODULE).apkLOCALMODULECLASS:=APPSLOCALMODULESUFFIX:=
(
L
O
C
A
L
M
O
D
U
L
E
)
.
a
p
k
L
O
C
A
L
M
O
D
U
L
E
C
L
A
S
S
:=
A
P
P
S
L
O
C
A
L
M
O
D
U
L
E
S
U
F
F
I
X
:=
(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH :=
(TARGETOUT)/vendor/operator/appinclude
(
T
A
R
G
E
T
O
U
T
)
/
v
e
n
d
o
r
/
o
p
e
r
a
t
o
r
/
a
p
p
i
n
c
l
u
d
e
(BUILD_PREBUILT)
打开文件 build/target/product/
Project.mk(其中
P
r
o
j
e
c
t
.
m
k
(
其
中
{Project} 表示工程名), 将 Test 添加到 PRODUCT_PACKAGES 里面
重新 build 整个工程
五、对于apk自带so库安装说明如下
apk安装在system/app和system/priv-app目录下,如果apk本身带有一些so库文件,那么我们也必须将这些so库文件预装到系统中,可以选择使用 mk 文件预装,不同平台可能安装方式存在差异.所以我们只讨论最终在机器中呈现的路径
Android 4.4之前对于预装的APK,所有的库文件(so)都集中在存放在/system/lib目录下
system/lib/
├── crtbegin_so.o
├── crtend_so.o
├── drm
│ └── libfwdlockengine.so
├── egl
│ ├── egl.cfg
│ ├── libEGL_mali.so
│ ├── libGLES_android.so
│ ├── libGLESv1_CM_mali.so
│ └── libGLESv2_mali.so
├── hw
│ ├── audio.a2dp.default.so
│ ├── audio_policy.default.so
│ ├── audio.primary.default.so
│ ├── audio.primary.polaris.so
│ ├── audio.r_submix.default.so
│ ├── audio.usb.default.so
│ ├── bluetooth.default.so
Android5.1开始,apk自带的so库文件开始单独管理,和apk文件所在目录同级:
Gallery2/
├── Gallery2.apk
├── lib
│ └── arm64
│ ├── libjni_eglfence.so -> /system/lib64/libjni_eglfence.so
│ ├── libjni_filtershow_filters.so -> /system/lib64/libjni_filtershow_filters.so
│ ├── libjni_jpegstream.so -> /system/lib64/libjni_jpegstream.so
│ └── librsjni.so -> /system/lib64/librsjni.so
└── oat
└── arm64
└── Gallery2.odex
在安装apk时如果打开报错,可以查看一下版本之间的差异