Android Framewrok 添加系统默认依赖库

目录

前言

1.定制库的创建

2.修改编译工具代码并解决报错。

 3.其他模块引用库内变量进行测试


前言

在android framework开发中,OEM 一般会封装一些定制库文件,几乎在系统中所有定制的模块和应用中都会依赖这些库文件,所以在每个Android.mk或Android.bp等编译文件中都需要添加库依赖。这样就比较麻烦,而系统原生framework.jar却是不需要在每个编译文件中进行添加就可以默认依赖。所以可以参照系统framework的处理方式,在编译系统中进行修改来实现此功能。

此功能基于Android12实现。

1.定制库的创建

1.先创建一个自定义的库(我是自己随便创建了一个库,一般oem都是有自己定制库的)

2.然后随便写了一行代码

package com.hoowi.example;
public class MyExample {

    public static final int INT = 1;

}

3.编写Android.bp文件

java_library {
    name: "hoowi.example",
    installable: true,
    srcs: [
        "com/hoowi/example/MyExample.java",
    ],
}

2.修改编译工具代码并解决报错。

1.修改build/soong/java/config/config.go文件,

var (
	pctx = android.NewPackageContext("android/soong/java/config")

	LegacyCorePlatformBootclasspathLibraries = []string{"legacy.core.platform.api.stubs", "core-lambda-stubs"}
	LegacyCorePlatformSystemModules          = "legacy-core-platform-api-stubs-system-modules"
	StableCorePlatformBootclasspathLibraries = []string{"stable.core.platform.api.stubs", "core-lambda-stubs"}
	StableCorePlatformSystemModules          = "stable-core-platform-api-stubs-system-modules"
    //在这里添加自定义库文件 hoowi.example
	FrameworkLibraries                       = []string{"ext", "framework", "hoowi.example"}
	DefaultLambdaStubsLibrary                = "core-lambda-stubs"
	SdkLambdaStubsPath                       = "prebuilts/sdk/tools/core-lambda-stubs.jar"

	DefaultMakeJacocoExcludeFilter = []string{"org.junit.*", "org.jacoco.*", "org.mockito.*"}
	DefaultJacocoExcludeFilter     = []string{"org.junit.**", "org.jacoco.**", "org.mockito.**"}

	InstrumentFrameworkModules = []string{
		"framework",
		"framework-minus-apex",
		"telephony-common",
		"services",
		"android.car",
		"android.car7",
		"conscrypt",
		"core-icu4j",
		"core-oj",
		"core-libart",
		// TODO: Could this be all updatable bootclasspath jars?
		"updatable-media",
		"framework-mediaprovider",
		"framework-sdkextensions",
		"android.net.ipsec.ike",
        //在这里添加自定义库文件 hoowi.example
		"hoowi.example",
	}
)

2.编译会报depends on undefined module的错误

3.这个是因为在go编译系统中的测试代码中没有添加模块定义,

修改build/soong/java/testing.go

func gatherRequiredDepsForTest() string {
	var bp string

	extraModules := []string{
		"core-lambda-stubs",
		"ext",
		"android_stubs_current",
		"android_system_stubs_current",
		"android_test_stubs_current",
		"android_module_lib_stubs_current",
		"android_system_server_stubs_current",
		"core.current.stubs",
		"legacy.core.platform.api.stubs",
		"stable.core.platform.api.stubs",
		"kotlin-stdlib",
		"kotlin-stdlib-jdk7",
		"kotlin-stdlib-jdk8",
		"kotlin-annotations",
        //这里添加测试模块定义
		"hoowi.example",
	}

	for _, extra := range extraModules {
		bp += fmt.Sprintf(`
			java_library {
				name: "%s",
				srcs: ["a.java"],
				sdk_version: "none",
				system_modules: "stable-core-platform-api-stubs-system-modules",
				compile_dex: true,
			}
		`, extra)
	}

	//........省略若干行

	return bp
}

 4.再次编译又会报depends on itself的错。

5.这个时候要重新修改自定义模块的Android.bp文件加入一行 sdk_version: "core_platform",

java_library {
    name: "hoowi.example",
    installable: true,
    sdk_version: "core_platform",//就是这一行代码
    srcs: [
        "com/hoowi/example/MyExample.java",
    ],
}

 6.再次编译又报错

7.这个时候修改build/soong/java/java_test.go

func TestPatchModule(t *testing.T) {
	//......省略若干行

	t.Run("Java language level 9", func(t *testing.T) {
		// Test with default javac -source 9 -target 9
		bp := `
			java_library {
				name: "foo",
				srcs: ["a.java"],
			}

			java_library {
				name: "bar",
				srcs: ["b.java"],
				sdk_version: "none",
				system_modules: "none",
				patch_module: "java.base",
			}

			java_library {
				name: "baz",
				srcs: [
					"c.java",
					// Tests for b/150878007
					"dir/d.java",
					"dir2/e.java",
					"dir2/f.java",
					"nested/dir/g.java"
				],
				patch_module: "java.base",
			}
		`
		ctx, _ := testJava(t, bp)

		checkPatchModuleFlag(t, ctx, "foo", "")
		expected := "java.base=.:out/soong"
		checkPatchModuleFlag(t, ctx, "bar", expected)
        //在这里添加自定义库(需要注意的是这里的库的顺序要与config.go中添加自定义库的顺序一致,不然也会报错)
		expected = "java.base=" + strings.Join([]string{
			".", "out/soong", "dir", "dir2", "nested", defaultModuleToPath("ext"), defaultModuleToPath("framework"),
			 defaultModuleToPath("hoowi.example")}, ":")
		checkPatchModuleFlag(t, ctx, "baz", expected)
	})
}

8.nice,终于编译通过了。

 3.其他模块引用库内变量进行测试

随便找一个库或者app引用下,可以引用到,编译可以通过。

nice,到此功能就实现了。

Android Framework 中添加自定义,可以通过以下步骤实现: 1. 将自定义的源代码添加Android Framework 中,通常情况下位于 `frameworks/base/core/java` 或 `frameworks/base/services/core/java` 目录下。 2. 在 `frameworks/base/core/res` 或 `frameworks/base/services/core/res` 目录下添加自定义的资源文件,比如布局文件、字符串资源等。 3. 在 Android.mk 文件中添加自定义的编译配置信息,包括源代码的编译和资源文件的打包。 4. 在 AndroidManifest.xml 文件中注册自定义,以便系统可以识别和加载该。 5. 在 Java 代码中使用 `import` 语句导入自定义的类,并在代码中调用该类的方法。 需要注意的是,自定义需要在 APK 中进行引用才能被 APK 调用。可以通过以下步骤将自定义引用到 APK 中: 1. 在 APK 的 build.gradle 文件中添加依赖的引用,例如: ``` dependencies { implementation project(':mylibrary') } ``` 其中 `mylibrary` 是自定义的名称。 2. 在 APK 的 AndroidManifest.xml 文件中添加自定义的使用权限,例如: ``` <uses-library android:name="mylibrary" android:required="true" /> ``` 其中 `mylibrary` 是自定义的名称。 完成以上步骤后,自定义就可以被 APK 调用了。需要注意的是,自定义只能被具有相应权限的应用调用。如果需要让所有应用都能调用该,可以考虑将打包成系统级别的 APK,并将其放置到 `/system/app` 目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值