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

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 存在意义只是为了编译通过,不具有真正业务

<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

<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_PATHinclude $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional#解释如下:#LOCAL_MODULE_TAGS :=user eng tests optional android#user: 指该模块只在user版本下才编译 ui#eng: 指该模块只在eng版本下才编译 spa#tests: 指该模块只在tests版本下才编译debug#optional:指该模块在全部版本下都编译 codLOCAL_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只有frameworkLOCAL_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)