droid_wrap/dalvik/system.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
/*
* Copyright (c) 2024. The RigelA open source project team and
* its contributors reserve all rights.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and limitations under the License.
*/
use droid_wrap_derive::{java_class, java_constructor};
use crate::{
java::{lang::ClassLoader, nio::ByteBuffer},
JObjNew, JObjRef, JType,
};
/**
类加载器,用于从包含 classes.dex 条目的 .jar 和 .apk 文件中加载类。这可用于执行未作为应用程序的一部分安装的代码。
在 API 级别 26 之前,此类加载器需要一个应用程序私有的可写目录来缓存优化的类。使用 Context.getCodeCacheDir() 创建这样的目录:
File dexOutputDir = context.getCodeCacheDir();
不要在外部存储上缓存优化的类。外部存储不提供保护应用程序免受代码注入攻击所需的访问控制。
*/
#[java_class(name = "dalvik/system/DexClassLoader")]
pub struct DexClassLoader;
impl DexClassLoader {
/**
创建 DexClassLoader,用于查找解释代码和本机代码。解释类位于 Jar 或 APK 文件中包含的一组 DEX 文件中。路径列表使用 path.separator 系统属性指定的字符分隔,默认为 :。
`dex_path` 包含类和资源的 jar/apk 文件列表,由 File.pathSeparator 分隔,在 Android 上默认为“:”
`optimized_directory` 此参数已弃用,自 API 级别 26 起无效。
`library_search_path` 包含本机库的目录列表,由 File.pathSeparator 分隔;可能为 null
`parent` 父类加载器
*/
#[java_constructor]
pub fn new(
dex_path: String,
optimized_directory: String,
library_search_path: String,
parent: &ClassLoader,
) -> Self {
}
}
/**
从包含 DEX 文件的缓冲区加载类的 ClassLoader 实现。这可用于执行尚未写入本地文件系统的代码。
*/
#[java_class(name = "dalvik/system/InMemoryDexClassLoader")]
pub struct InMemoryDexClassLoader;
impl InMemoryDexClassLoader {
/**
创建一个新的内存中 DEX 类加载器。
`dex_buffer` 包含 buffer.position() 和 buffer.limit() 之间的 DEX 文件内容的缓冲区。
`parent` 用于委托的父类加载器。
*/
#[java_constructor]
pub fn new(dex_buffer: &ByteBuffer, parent: &ClassLoader) -> Self {}
}
/// 测试dalvik.system
#[cfg(feature = "test_dalvik_system")]
pub fn test() {
use crate::android::{app::Activity, content::Context};
let context: Context = (&Activity::fetch()).into();
let loader = DexClassLoader::new(
"c.dex".to_string(),
"".to_string(),
"".to_string(),
&context.get_class_loader(),
);
assert!(loader
.to_string()
.starts_with("dalvik.system.DexClassLoader"));
}