1.apk源码目录结构:
在android源码下编译apk,apk的目录结构有差异,代码示例可参考:
development/samples/HelloActivity
2.apk在android源码下的编译目录:
apk源码可放在packages/app或vendor下使用mm编译,编译产物位于/out/target/product/system/app下
3.若apk中需要引入androidx:
如果代码依赖appcompat等androidx下的包,无需额外导入对应的jar包,直接通过在Android.mk中添加对应的androidx模块名即可,这些模块在系统源码中都有
如何查找对应androidx模块?【以appcompat为例】
1.在android源码目录下执行
find prebuilts/sdk/ -name Android.bp | xargs grep "name.*appcompat"
2.选择查找结果中的androidx.appcompat_appcompat
3.将其加入到Android.mk:
LOCAL_STATIC_ANDROID_LIBRARIES +=\
androidx.appcompat_appcompat
注:系统中存在的其他预编译包,也可以用这个方法,若找不到对应的包则可以导入jar包
4.系统源码编译apk的示例Android.bp
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
android_app {
name: "HelloActivity",
// Only compile source java files in this apk.
srcs: ["src/**/*.java"],
static_libs: [
"androidx.core_core",//依赖的androidx库
"androidx.annotation_annotation",
],
sdk_version: "current",
dex_preopt: {
enabled: false,
},
certificate: "platform",//系统platform访问权限。如果app需要有这个权限则需添加
}
其中,对于certificate: "platform",对应的所有值及其区别为:
testkey:
普通apk
platform:
该apk完成一些系统核心功能。这种方式编译出来的apk所在进程的uid为system
shared:
该apk需要和home/contacts进程共享数据
media:
该apk是media/download系统中的一环
【同时!!!!】:
如果要让apk有system系统权限!!!在设置了certificate的值之外,还需要在apk对应manifest.xml中添加sharedid属性,示例如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.helloworld"
android:sharedUserId="android.uid.system">