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

Android Framework实战:将Android Studio工程编译为系统应用

hi,粉丝朋友们大家好!
近来有朋友反馈在看我的android framework实战开发合集课程时候 (https://download.youkuaiyun.com/combo/detail/2202)
需要购买可以参考直接找千里马最优惠:https://blog.youkuaiyun.com/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.youkuaiyun.com/combo/detail/2202)

d 1 other context) [ 99% 8464/8503] //packages/apps/Settings:Settings-core javac [common] FAILED: out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/Settings-core.jar rm -rf "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/classes" "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/anno" "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/srcjars" "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/Settings-core.jar" && mkdir -p "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/classes" "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/anno" "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/srcjars" && out/host/linux-x86/bin/zipsync -d out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/srcjars -l out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/srcjars/list -f "*.java" out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/gen/android/R.srcjar out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/kapt/kapt-sources.jar && (if [ -s out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/srcjars/list ] || [ -s out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/Settings-core.jar.rsp ] ; then out/host/linux-x86/bin/soong_javac_wrapper prebuilts/jdk/jdk11/linux-x86/bin/javac -J-Xmx2048M -J-XX:OnError="cat hs_err_pid%p.log" -J-XX:CICompilerCount=6 -J-XX:+UseDynamicNumberOfGCThreads -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1 -Xmaxerrs 9999999 -encoding UTF-8 -sourcepath "" -g -XDskipDuplicateBridges=true -XDstringConcat=inline -proc:none -Xlint:-dep-ann --system=out/soong/.intermediates/build/soong/java/core-libraries/legacy-core-platform-api-stubs-system-modules/android_common/system -classpath out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/kotlin_headers/Settings-core.jar:out/soong/.intermediates/frameworks/base/ext/android_common/turbine-combined/ext.jar:out/soong/.intermediates/frameworks/base/framework/android_common/turbine-combined/framework.jar:out/soong/.intermediates/frameworks/opt/telephony/telephony-common/android_common/turbine-jarjar/telephony-common.jar:out/soong/.intermediates/frameworks/opt/net/ims/ims-common/android_common/turbine-jarjar/ims-common.jar:out/soong/.intermediates/frameworks/base/packages/SettingsLib/search/SettingsLib-search/android_common/turbine-combined/SettingsLib-search.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.annotation_annotation/android_common/turbine-combined/androidx.annotation_annotation.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.lifecycle_lifecycle-common/android_common/turbine-combined/androidx.lifecycle_lifecycle-common.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx-legacy/androidx.legacy_legacy-support-v4/android_common/turbine-combined/androidx.legacy_legacy-support-v4.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.lifecycle_lifecycle-runtime/android_common/turbine-combined/androidx.lifecycle_lifecycle-runtime.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.recyclerview_recyclerview/android_common/turbine-combined/androidx.recyclerview_recyclerview.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.preference_preference/android_common/turbine-combined/androidx.preference_preference.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.appcompat_appcompat/android_common/turbine-combined/androidx.appcompat_appcompat.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx-legacy/androidx.legacy_legacy-preference-v14/android_common/turbine-combined/androidx.legacy_legacy-preference-v14.jar:out/soong/.intermediates/frameworks/base/packages/SettingsLib/SettingsLib/android_common/turbine-combined/SettingsLib.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx-constraintlayout_constraintlayout/android_common/turbine-combined/androidx-constraintlayout_constraintlayout.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.slice_slice-builders/android_common/turbine-combined/androidx.slice_slice-builders.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.slice_slice-core/android_common/turbine-combined/androidx.slice_slice-core.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.slice_slice-view/android_common/turbine-combined/androidx.slice_slice-view.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.core_core/android_common/turbine-combined/androidx.core_core.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.appcompat_appcompat/android_common/turbine-combined/androidx.appcompat_appcompat.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.cardview_cardview/android_common/turbine-combined/androidx.cardview_cardview.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.preference_preference/android_common/turbine-combined/androidx.preference_preference.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.recyclerview_recyclerview/android_common/turbine-combined/androidx.recyclerview_recyclerview.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.window_window/android_common/turbine-combined/androidx.window_window.jar:out/soong/.intermediates/prebuilts/sdk/current/extras/material-design-x/com.google.android.material_material/android_common/turbine-combined/com.google.android.material_material.jar:out/soong/.intermediates/external/setupcompat/setupcompat/android_common/turbine-combined/setupcompat.jar:out/soong/.intermediates/external/setupdesign/setupdesign/android_common/turbine-combined/setupdesign.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.lifecycle_lifecycle-runtime/android_common/turbine-combined/androidx.lifecycle_lifecycle-runtime.jar:out/soong/.intermediates/prebuilts/sdk/current/androidx-legacy/androidx.lifecycle_lifecycle-extensions/android_common/turbine-combined/androidx.lifecycle_lifecycle-extensions.jar:out/soong/.intermediates/external/guava/guava/android_common/turbine-combined/guava.jar:out/soong/.intermediates/external/jsr305/jsr305/android_common/turbine-combined/jsr305.jar:out/soong/.intermediates/frameworks/libs/net/common/net-utils-framework-common/android_common/turbine-jarjar/net-utils-framework-common.jar:out/soong/.intermediates/packages/apps/Settings/protos/settings-contextual-card-protos-lite/android_common/turbine-combined/settings-contextual-card-protos-lite.jar:out/soong/.intermediates/packages/apps/Settings/protos/settings-log-bridge-protos-lite/android_common/turbine-combined/settings-log-bridge-protos-lite.jar:out/soong/.intermediates/packages/apps/Settings/protos/settings-telephony-protos-lite/android_common/turbine-combined/settings-telephony-protos-lite.jar:out/soong/.intermediates/packages/apps/Settings/contextualcards/android_common/aar/classes-combined.jar:out/soong/.intermediates/packages/apps/Settings/settings-logtags/android_common/turbine-combined/settings-logtags.jar:out/soong/.intermediates/packages/apps/Settings/statslog-settings/android_common/turbine-combined/statslog-settings.jar:out/soong/.intermediates/external/zxing/core/zxing-core-1.7/android_common/combined/zxing-core-1.7.jar:out/soong/.intermediates/hardware/interfaces/dumpstate/1.0/android.hardware.dumpstate-V1.0-java/android_common/turbine-combined/android.hardware.dumpstate-V1.0-java.jar:out/soong/.intermediates/hardware/interfaces/dumpstate/1.1/android.hardware.dumpstate-V1.1-java/android_common/turbine-combined/android.hardware.dumpstate-V1.1-java.jar:out/soong/.intermediates/hardware/interfaces/dumpstate/aidl/android.hardware.dumpstate-V1-java/android_common/turbine-combined/android.hardware.dumpstate-V1-java.jar:out/soong/.intermediates/external/lottie/lottie/android_common/turbine-combined/lottie.jar:out/soong/.intermediates/frameworks/opt/net/wifi/libs/WifiTrackerLib/WifiTrackerLib/android_common/turbine-combined/WifiTrackerLib.jar:out/soong/.intermediates/frameworks/base/packages/SettingsLib/ActivityEmbedding/SettingsLibActivityEmbedding/android_common/turbine-combined/SettingsLibActivityEmbedding.jar:out/soong/.intermediates/packages/apps/Settings/Settings-change-ids/android_common/turbine-combined/Settings-change-ids.jar:out/soong/.intermediates/frameworks/base/packages/SystemUI/unfold/SystemUIUnfoldLib/android_common/turbine-combined/SystemUIUnfoldLib.jar:out/soong/.intermediates/external/kotlinc/kotlin-stdlib/android_common/combined/kotlin-stdlib.jar:out/soong/.intermediates/external/kotlinc/kotlin-stdlib-jdk7/android_common/combined/kotlin-stdlib-jdk7.jar:out/soong/.intermediates/external/kotlinc/kotlin-stdlib-jdk8/android_common/combined/kotlin-stdlib-jdk8.jar:out/soong/.intermediates/external/kotlinc/kotlin-annotations/android_common/combined/kotlin-annotations.jar -source 11 -target 11 -d out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/classes -s out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/anno @out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/Settings-core.jar.rsp @out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/srcjars/list ; fi ) && out/host/linux-x86/bin/soong_zip -jar -o out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/Settings-core.jar -C out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/classes -D out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/classes && rm -rf "out/soong/.intermediates/packages/apps/Settings/Settings-core/android_common/javac/srcjars" packages/apps/Settings/src/com/android/settings/applications/appinfo/AppLocalePreferenceController.java:55: error: cannot find symbol .isEnabled(mContext, FeatureFlagUtils.SETTINGS_APP_LANGUAGE_SELECTION); ^ symbol: variable SETTINGS_APP_LANGUAGE_SELECTION location: class FeatureFlagUtils 1 error [ 99% 8466/8503] //frameworks/base/packages/SystemUI:SystemUI r8 [common] Warning: Missing class android.compat.annotation.UnsupportedAppUsage (referenced from: void com.android.systemui.people.widget.PeopleBackupHelper.writeNewStateDescription(android.os.ParcelFileDescriptor)) 03:15:40 ninja failed with: exit status 1 #### failed to build some targets (05:10 (mm:ss)) #### Build android failed! 看下什么错误?
最新发布
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值