Android Studio 源码移植到系统中

参考文章:https://blog.csdn.net/weixin_44008788/article/details/120990207

主要是添加 Android.mk文件,指定src、res、AndroidManifest.xml文件,比较重要的点在于引入第三方依赖库,如jar包、aar包、so库等

先贴出整个Android.mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := 名称随便命名符合规范就行

LOCAL_MODULE_TAGS := optional

LOCAL_CERTIFICATE := platform

LOCAL_PRIVILEGED_MODULE := true

LOCAL_PROGUARD_ENABLED := disabled

LOCAL_MANIFEST_FILE := \
       app/src/main/AndroidManifest.xml

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/src/main/res 

LOCAL_USE_AAPT2 := true

LOCAL_PRIVATE_PLATFORM_APIS := true

#############################################
LOCAL_STATIC_ANDROID_LIBRARIES := \
	androidx.appcompat_appcompat \
	com.google.android.material_material \
	androidx-constraintlayout_constraintlayout


# LOCAL_STATIC_JAVA_LIBRARIES := \
#         androidx.core.1.0.1 \
#         constraintlayout \
#         constraintlayout-solver \
#         appcompat \
#         appcompat-resources

#  LOCAL_STATIC_JAVA_AAR_LIBRARIES := \
#  		viewbinding

#############################################

LOCAL_DEX_PREOPT := false

include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
# LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
# 		viewbinding:app/libs/viewbinding-7.2.0.aar 
include $(BUILD_MULTI_PREBUILT)

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

这里遇到一个坑,原开发app使用了viewbinding,导入编译的时候一直遇到找不到方法的报错,折腾了半天各种导包,最后还是用回了android原生的绑定控件的方法,难受

1.移植代码

首先不管三七二十一,将代码复制到系统相应的目录下,并删除根目录下的.gradle和src目录下的androidTest和test文件夹
在这里插入图片描述

.gradle 文件为本地项目gradle的一些客制化配置,androidTest和test文件夹为android 调试测试类

2.指定src、res、AndroidManifest.xml文件

在 Android.mk 文件中配置

# 指定AndroidManifest.xml文件
LOCAL_MANIFEST_FILE := \
       app/src/main/AndroidManifest.xml

# 指定src文件夹
LOCAL_SRC_FILES := $(call all-subdir-java-files)

# 指定 res 资源文件
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/src/main/res

3.引入第三方依赖库

app的依赖需要查看build.gradle文件
在这里插入图片描述
由于都是android系统库,所以对应添加

# 系统库
LOCAL_STATIC_ANDROID_LIBRARIES := \
	androidx.appcompat_appcompat \
	com.google.android.material_material \
	androidx-constraintlayout_constraintlayout

# jar包
# LOCAL_STATIC_JAVA_LIBRARIES := \
#         androidx.core.1.0.1 \
#         constraintlayout 

# aar包
#  LOCAL_STATIC_JAVA_AAR_LIBRARIES := \
#  		viewbinding

# 复制so包,一般so包都是直接复制到系统的某个目录下
# PRODUCT_COPY_FILES += \
#   	/libs/libtest1.so:system/lib/libtest1.so \
#   	/libs/libtest2.so:system/lib/libtest2.so

include $(CLEAR_VARS)
# LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
# 		viewbinding:app/libs/viewbinding-7.2.0.aar \
#		androidx.core.1.0.1:app/libs/androidx.core.1.0.1.jar \
# 		constraintlayout:app/libs/androidx.constraintlayout.4.0.1.jar
include $(BUILD_MULTI_PREBUILT)

aar包引入要注意,aar包与jar包相比,aar包还包含了res资源文件夹,所以要单独添加这个资源文件夹,首先将aar包后缀名改为zip 解压后将res文件夹复制出来加到 LOCAL_RESOURCE_DIR 下

1.编译aar包 别名:路径
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := 别名:app/libs/aar包名
include $(BUILD_MULTI_PREBUILT)

2.
LOCAL_STATIC_JAVA_AAR_LIBRARIES := 别名

3.
LOCAL_USE_AAPT2 := true

4.添加aar包中的资源文件
LOCAL_RESOURCE_DIR := \
	$(LOCAL_PATH)/app/src/main/res \
	$(LOCAL_PATH)/app/src/main/res-myaarpackage

5.添加R资源生成别名,这样别人也可以用定义的这些包名访问本app资源
LOCAL_AAPT_FLAGS := \
  --auto-add-overlay \
  --extra-packages <aar package name>

6.引入第三方的aar包最好关闭混淆,不然可能会出现运行错误
LOCAL_PROGUARD_ENABLED := disabled

问题

做完上述步骤就可以编译了,可能会报错,像是报下面的colorPrimary标签没有定义等等,这些都是在Android studio中编译的时候,Android studio会自动帮我们定义,如果没有使用到删掉即可,或手动添加定义,基本上不会有太大的错误,报哪里错改哪里就行
在这里插入图片描述
最后编译成功了,但安装到系统中后打开报错闪退,日志如下:

06-13 15:14:09.648  3229  3284 W WindowManager: Token{87ca91b ActivityRecord{365272a u0 *******/.MainActivity t14}} failed creating starting window
06-13 15:14:09.648  3229  3284 W WindowManager: android.view.InflateException: Binary XML file line #32: Failed to resolve attribute at index 1: TypedValue{t=0x2/d=0x101005a a=-1}
06-13 15:14:09.648  3229  3284 W WindowManager: Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 1: TypedValue{t=0x2/d=0x101005a a=-1}
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:775)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:7758)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:7949)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.widget.LinearLayout$LayoutParams.<init>(LinearLayout.java:1997)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:1895)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.widget.LinearLayout.generateLayoutParams(LinearLayout.java:87)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:865)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.internal.policy.DecorView.onResourcesLoaded(DecorView.java:1992)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.internal.policy.PhoneWindow.generateLayout(PhoneWindow.java:2599)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.internal.policy.PhoneWindow.installDecor(PhoneWindow.java:2672)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.internal.policy.PhoneWindow.getDecorView(PhoneWindow.java:2071)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.server.policy.PhoneWindowManager.addSplashScreen(PhoneWindowManager.java:3272)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.server.wm.SplashScreenStartingData.createStartingSurface(SplashScreenStartingData.java:56)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.server.wm.AppWindowContainerController$1.run(AppWindowContainerController.java:151)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.os.Handler.handleCallback(Handler.java:873)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.os.Looper.loop(Looper.java:193)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at android.os.HandlerThread.run(HandlerThread.java:65)
06-13 15:14:09.648  3229  3284 W WindowManager: 	at com.android.server.ServiceThread.run(ServiceThread.java:44)
06-13 15:14:09.651  3899  3966 E mali_winsys: invalidate private_data!
06-13 15:14:09.670  3229  3246 I ActivityManager: Start proc 6976:******/u0a20 for activity ******/.MainActivity
06-13 15:14:09.670  6976  6976 I Zygote  : seccomp disabled by setenforce 0
06-13 15:14:09.674  6976  6976 I luetoothspeake: Late-enabling -Xcheck:jni
06-13 15:14:09.683  3899  3966 E mali_winsys: invalidate private_data!
06-13 15:14:10.116  3899  3966 I chatty  : uid=1000(system) DrawingThread identical 13 lines
06-13 15:14:10.149  3899  3966 E mali_winsys: invalidate private_data!
06-13 15:14:10.177  3896  4022 E bt_btif_scanner: ### ASSERT : system/bt/btif/src/btif_ble_scanner.cc bta_scan_results_cb line 201 failed to get remote device class (1) ###
06-13 15:14:10.183  3899  3966 E mali_winsys: invalidate private_data!
06-13 15:14:10.216  3899  3966 I chatty  : uid=1000(system) DrawingThread identical 1 line
06-13 15:14:10.250  3899  3966 E mali_winsys: invalidate private_data!
06-13 15:14:10.276  6976  6976 E luetoothspeake: Resource 7f0e001b is a complex map type.
06-13 15:14:10.282  6976  6976 W PackageManager: Failure retrieving text 0x7f0e001b in package ******
06-13 15:14:10.282  6976  6976 W PackageManager: android.content.res.Resources$NotFoundException: String resource ID #0x7f0e001b
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.content.res.Resources.getText(Resources.java:348)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.ApplicationPackageManager.getText(ApplicationPackageManager.java:1678)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.content.pm.ComponentInfo.loadUnsafeLabel(ComponentInfo.java:116)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.content.pm.PackageItemInfo.loadLabel(PackageItemInfo.java:194)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2859)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.os.Handler.dispatchMessage(Handler.java:106)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.os.Looper.loop(Looper.java:193)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at android.app.ActivityThread.main(ActivityThread.java:6669)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at java.lang.reflect.Method.invoke(Native Method)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
06-13 15:14:10.282  6976  6976 W PackageManager: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:866)
06-13 15:14:10.283  3899  3966 E mali_winsys: invalidate private_data!
06-13 15:14:10.316  3899  3966 I chatty  : uid=1000(system) DrawingThread identical 1 line
06-13 15:14:10.349  3899  3966 E mali_winsys: invalidate private_data!
06-13 15:14:10.352  6976  6976 D AndroidRuntime: Shutting down VM
06-13 15:14:10.360  6976  6976 E AndroidRuntime: FATAL EXCEPTION: main
06-13 15:14:10.360  6976  6976 E AndroidRuntime: Process: ******, PID: 6976
06-13 15:14:10.360  6976  6976 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{******/******.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:193)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6669)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:866)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:553)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:516)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:464)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at ******.MainActivity.onCreate(MainActivity.java:48)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7139)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7130)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
06-13 15:14:10.360  6976  6976 E AndroidRuntime: 	... 11 more
06-13 15:14:10.371  3229  6714 W ActivityManager:   Force finishing activity ******/.MainActivity

java.lang.RuntimeException: Unable to start activity ComponentInfo{包名/包名.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

原因:activity是继承的是AppCompatActivity,不是Activity,由于编译的时候哪个主题一直报错找不到,更换了一个主题
解决方案:改变类的继承父类 从AppCompatActivity 改为Activity

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值