android13源码下编译apk

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">
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。