Android系统编译问题

一、同时编译多个需要编译的程序

1)、实际情况:
在实际系统编译中,我们往往可能存在需要编译多个程序的情况,如果我们一个一个定位到每个程序的目录,然后再使用mm -B命令编译,这对程序非常多的情况下,是非常浪费时间的

2)、如何解决:
这时候我们可以通过将所有需要编译的程序文件夹目录放在同一级目录,只需要编译最外层的Android.mk,最外层目录的Android.mk包含所有子目录Anroid.mk,以达到编译所有子目录程序的Android.mk,达到统一编译的效果。
具体实现:

LOCAL_PATH := $(call my-dir)
# if some modules are built directly from this directory (not subdirectories),
# their rules should be written here.

include $(call all-makefiles-under,$(LOCAL_PATH))

二、编译没有源代码的第三方程序

1)、实际情况:
在实际系统编译中,当我们有程序的源代码的时候,

  • 我们需要将共享库编译到/systme/lib时,可能Anroid.mk大概是这样写:
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \......

LOCAL_C_INCLUDES+= \.....

LOCAL_MODULE:= lib***
include $(BUILD_SHARED_LIBRARY)
  • 当我们需要将共享库编译到/systme/lib/hw时,可能Anroid.mk大概是这样写:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ***
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \.....
LOCAL_C_INCLUDES += \.....
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

  • 当我们需要编译apk时,可能Anroid.mk大概这样写:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
src_dirs := src
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under,$(src_dirs))
LOCAL_PACKAGE_NAME := ***
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)

但是更多的,我们往往可能需要编译没有源代码的第三方厂家的程序,那么这个时候我们该如何编写Android.mk呢?

  • 假如是第三方共享库:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ***.so
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_OWNER := WT
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib64/hw
include $(BUILD_PREBUILT)

其中LOCAL_MODULE表示需要编译的第三方共享库
LOCAL_MODULE_CLASS 表示需要编译的程序的类型,这个类型由/out/target/product/**/obj下面的文件名决定:
Android系统编译问题_第1张图片

LOCAL_MODULE_PATH 表示需要将该程序编译到系统哪个目录
include $(BUILD_PREBUILT)表示编译的程序为预先存在的,因为我们这里就是需要编译已经编译好的第三方so库,集成到系统。

  • 假如是第三方apk:
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := **
LOCAL_MODULE_TAGS := optional
LOCAL_PRIVILEGED_MODULE := true
LOCAL_DEX_PREOPT := false
#第三方apk
LOCAL_SRC_FILES := ./**.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform

include $(BUILD_PREBUILT)

其中LOCAL_PRIVILEGED_MODULE 表示是否生成在priv_app目录下,LOCAL_DEX_PREOPT 表示是否预编译优化

三、Instruction set mismatch, PackageSetting{****/1000} requires arm whereas PackageSetting{95844f4 android/1000} requires arm64

1)、问题发生的情况:
当我集成一个第三方并且携带位数为32的lib库,需要系统权限的apk到我们的64位系统时,重新烧录固件,概率性出现一系列系统应用已停止运行。标识性logcat如下:

	Line 742: 11-16 06:22:46.574 W/PackageManager( 4440): Instruction set mismatch, PackageSetting{61919de *****/1000} requires arm whereas PackageSetting{95844f4 android/1000} requires arm64
	Line 743: 11-16 06:22:46.575 I/PackageManager( 4440): Adjusting ABI for com.droidlogic.SubTitleService to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 744: 11-16 06:22:46.576 I/PackageManager( 4440): Adjusting ABI for com.android.wallpaperbackup to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 745: 11-16 06:22:46.577 I/PackageManager( 4440): Adjusting ABI for com.android.tv.settings to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 746: 11-16 06:22:46.577 I/PackageManager( 4440): Adjusting ABI for com.droidlogic.otaupgrade to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 747: 11-16 06:22:46.578 I/PackageManager( 4440): Adjusting ABI for com.android.keychain to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 748: 11-16 06:22:46.578 I/PackageManager( 4440): Adjusting ABI for com.droidlogic.dig to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 749: 11-16 06:22:46.579 I/PackageManager( 4440): Adjusting ABI for com.droidlogic.PPPoE to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 750: 11-16 06:22:46.579 I/PackageManager( 4440): Adjusting ABI for com.android.settings to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 751: 11-16 06:22:46.580 I/PackageManager( 4440): Adjusting ABI for com.android.providers.settings to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 752: 11-16 06:22:46.580 I/PackageManager( 4440): Adjusting ABI for com.droidlogic.appinstall to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 753: 11-16 06:22:46.581 I/PackageManager( 4440): Adjusting ABI for com.android.inputdevices to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 754: 11-16 06:22:46.582 I/PackageManager( 4440): Adjusting ABI for com.android.location.fused to armeabi-v7a (requirer=*****, scannedPackage=null)
	Line 755: 11-16 06:22:46.582 I/PackageManager( 4440): Adjusting ABI for com.droidlogic.miracast to armeabi-v7a (requirer=com.jiajia.v6.shinestar, scannedPackage=null)
	Line 756: 11-16 06:22:46.583 I/PackageManager( 4440): Adjusting ABI for com.droidlogic to armeabi-v7a (requirer=com.jiajia.v6.shinestar, scannedPackage=null)

2)、问题发生的原因:
具体原因其实我还不清楚
参阅了许多资料收集如下:
AndroidL版本开始,Android系统实行了ART,对dex文件进行了优化,会将classes.dex删除,具体可以参考如下两篇文章:
https://blog.csdn.net/u010164190/article/details/51463492
https://blog.csdn.net/shichaog/article/details/62037242
因为我们集成的第三方apk和绝对多数系统应用一样具有系统权限,因此他们共享同一个UID
又因为第三方apk的jni库为32位,而我的系统为64位,因此绝大多数系统apk只拥有64位的jni库,因为ART的原因好像第一次开机时由于classes.dex删除的原因,32位的apk导致了系统a64位pk的类找不到了。

解决办法可以让第三方厂家重新给我们编译支持64位的jni库给我们,但是一般这是比较耗时的,所以我的解决办法是找到 BoardConfig.mk

-WITH_DEXPREOPT := true
-WITH_DEXPREOPT_PIC := true
+WITH_DEXPREOPT := false
+WITH_DEXPREOPT_PIC := false

四、定义宏

只需要简单的在Android.mk里面添加如下:

#相当于在所有源文件中增加一个#define USE_TEST1
LOCAL_CFLAGS := -DUSE_TEST1

#相当于在所有源文件中增加一个#define USE_TEST2 1
LOCAL_CFLAGS := -DUSE_TEST2=1  

你可能感兴趣的:(Android系统)