赞
踩
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下面那么多应用自己写一个既可以,但既然是粉丝们又有这个要求,那千里马当然要满足。那下面就开干。。
(主要现在大家其实都是基于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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。