Android Framework开发之新加一个app源码到packages/apps编译Android.mk配置

Posted Android高级知识分享官

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Framework开发之新加一个app源码到packages/apps编译Android.mk配置相关的知识,希望对你有一定的参考价值。

hi,粉丝朋友们大家好!
近来有朋友反馈在看我的android framework实战开发合集课程时候 (https://download.csdn.net/combo/detail/2202)
需要购买可以参考直接找千里马最优惠:https://blog.csdn.net/learnframework/article/details/124086882
反馈一个问题,那就是课程确实讲解了怎么预制apk的,但是否可以考虑补充讲解一下如果想增加一个app但是不是apk预制,而是源码增加的方式,即相当于我想把工程现在android studio的源码工程搬运到源码的packages/apps路径下和Launcher3等一样进行编译。

根据粉丝们反馈觉得有必要讲解,其实这个在预制apk讲解时候我就讲过大家其实可以依葫芦画瓢,参考packages/apps下面那么多应用自己写一个既可以,但既然是粉丝们又有这个要求,那千里马当然要满足。那下面就开干。。

1、准备好源码的Android Studio的工程

(主要现在大家其实都是基于Android Studio进行编译的 ,但是packages/apps下面的一般都是以前eclipse的工程,所以我相信这个应该是同学们都非常喜欢的,相当于一箭双雕)

这里就是大家常见的Android Studio的源码工程

2、改造Android Studio工程及编译Android.mk
其实改造也很简单主要就是需要把工程拷贝到系统源码目录/packages/apps下面:

大家看截图目录已经到了packages/apps,同时我们LegacyEmptyApps目录下增加了两个文件:
AndroidManifest.xml
— 这个是因为源码编译apk必须要指的,这里可以和我们真正LegacyEmptyApps/app/src/main下面的AndroidManifest.xml 一样,也可以是个空壳,因为我们还是想要和Android Studio的工程一样,不想要每次修改根目录LegacyEmptyApps/AndroidManifest.xml 所以这里就把它搞成空壳只要有个application标签就可以:

//LegacyEmptyApps/AndroidManifest.xml 存在意义只是为了编译通过,不具有真正业务

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.legacyemptyapps">

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true">
    </application>

</manifest>

//LegacyEmptyApps/app/src/main/AndroidManifest.xml 这里才是真正的Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.legacyemptyapps">

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Android.mk
这里Android.mk它才是真正参加系统编译关键,这里我们编写如下,其实主要是参考:packages/apps/Launcher3下面的Android.mk

下面来看看LegacyEmptyApps/Android.mk源码:

LOCAL_PATH:= $(call my-dir)#指的当前目录变量LOCAL_PATH
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
#解释如下:
#LOCAL_MODULE_TAGS :=user eng tests optional android
#user: 指该模块只在user版本下才编译 ui
#eng: 指该模块只在eng版本下才编译 spa
#tests: 指该模块只在tests版本下才编译debug
#optional:指该模块在全部版本下都编译 cod
LOCAL_SRC_FILES := $(call all-java-files-under, app/src/main/java)#指定apk的src目录
LOCAL_RESOURCE_DIR := \\
    $(LOCAL_PATH)/app/src/main/res \\  #指定apk的res目录
LOCAL_FULL_LIBS_MANIFEST_FILES:=$(LOCAL_PATH)/app/src/main/AndroidManifest.xml
#指定额外的Manifest,这里的Manifest和根目录Manifest其实是合并关系,不是覆盖
LOCAL_JAVA_LIBRARIES := framework #指定依赖的jar包,这里我们其实应用简单没有依赖其他jar只有framework

LOCAL_PACKAGE_NAME := LegacyEmptyApps #要编译成apk的名字,非常非常关键
LOCAL_DEX_PREOPT := false #去除dex相关优化,这样好处就是我们编译出来apk是可以正常adb install的不然经过dex优化后,其实apk是个空壳
#LOCAL_PRIVILEGED_MODULE := true #是否放入priv-app,我们只作为普通system/app就可以

include $(BUILD_PACKAGE)

到此就已经配置完毕,下一步就到了编译时刻:
如果只是编译apk来测试:make LegacyEmptyApps 就可以,成功会输出如下:

[100% 7/7] Install: out/target/product/generic_x86_64/system/app/LegacyEmptyApps1/LegacyEmptyApps.apk

#### build completed successfully (14 seconds) ####

但是如果想要让系统集成这个apk,那么就还需要想原来预制第三方apk一样,把LegacyEmptyApps目标加入到build路径下相关mk里面才可以,这个就看马哥之前的课程把:
android framework实战开发合集课程时候 (https://download.csdn.net/combo/detail/2202)

以上是关于Android Framework开发之新加一个app源码到packages/apps编译Android.mk配置的主要内容,如果未能解决你的问题,请参考以下文章

Android Framework开发之新加一个app源码到packages/apps编译Android.mk配置

Android Framework开发之新加一个app源码到packages/apps编译Android.mk配置

Android API Guides---Storage Access Framework

ECMAScript 6 入门之新的数据类型Symbol

android framework开发之广播broadcast源码分析-千里马

千里马Android Framework实战开发-跨进程通信专题博客总结