android高版本适配使用Tools.java

随着android版本的提升,原生Tools不公开并且不能被正常使用,为了延续项目的功能,修改如下:

复制代码
/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * 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.
 */

package android.os;


import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.util.Log;

import java.io.DataOutputStream;

/**

 * {@hide}
 */
@SystemApi
public class Tools {
    private static final String TAG = "Tools_agenew";

    /**
     * @hide
     */
    @SystemApi
    public static int system(@NonNull String cmd) {
        return executeCommand(cmd);
    }

    @UnsupportedAppUsage
    private Tools() {
    }

    /**
     * @hide
     */
    @SystemApi
    public synchronized static int executeCommand(String command) {
        int status = -1;
        java.lang.Process process = null;
        DataOutputStream os = null;
        Log.d(TAG, "exec_start:" + command);
        try {
            process = Runtime.getRuntime().exec(command);
            status = process.waitFor();
            if (status == 0) {
                Log.i(TAG, "exec succeed.");
            } else {
                Log.i(TAG, "exec failed.");
            }
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (process != null) {
                    process.destroy();
                }
            } catch (Exception e) {
                Log.e(TAG, e.toString());
                e.printStackTrace();
            }
        }
        Log.d(TAG, "exec_end:" + command);
        return status;
    }

}

vendor/sprd/platform/frameworks/base/ex-interface/core/java/android/provider/UnisocSettings.java

复制代码
+        /**
+         * add for com.sprd.runtime test
+         * putInt 1 means start testing, 0 for the end.
+         * @hide
+         */
+       @UnisocHiddenApi
+        public static final String UNISOC_RUNTIME_USER_ACTION = "com.sprd.runtime.USER_ACTION";

注意:请更新对应平台的api和sepolicy,笔者使用展锐T606 android 13平台,对应修改如下

system-current.txt

复制代码
+  public class Tools {
+    method public static int executeCommand(String);
+    method public static int system(@NonNull String);
+  }

system-lint-baseline.txt

复制代码
+VisiblySynchronized: android.os.Tools#executeCommand(String):
+   Internal locks must not be exposed: method android.os.Tools.executeCommand(String)

unisoc-hidden-current.txt

复制代码
+  public class Tools {
+   method public static int executeCommand(String);
+    method public static void system(@NonNull String);
+  }

device/sprd/mpool/sepolicy/vendor/untrusted_app.te

复制代码
+allow untrusted_app property_socket:sock_file { write };
+allow untrusted_app init:unix_stream_socket { connectto };
+allow untrusted_app default_prop:property_service { set };

system/sepolicy/private/app_neverallows.te

复制代码
# Do not allow untrusted apps to connect to the property service
# or set properties. b/10243159
#neverallow { all_untrusted_apps -mediaprovider } property_socket:sock_file write;
#neverallow { all_untrusted_apps -mediaprovider } init:unix_stream_socket connectto;
#neverallow { all_untrusted_apps -mediaprovider } property_type:property_service set;

system/sepolicy/private/property.te

复制代码
neverallow {
  domain
  -init
+  -untrusted_app
} default_prop:property_service set;
相关推荐
Xzh04235 小时前
AI Agent 学习路线(Java 后端方向)
java·人工智能·学习
艾利克斯冰6 小时前
Java 设计模式-行为型模式(更新中)
java·开发语言·设计模式
倒霉蛋小马6 小时前
Java新特性:record关键字
java·开发语言
黄林晴6 小时前
Google Play 发版链路全面重构:合规前置、审核自动化、生态全面收紧
android·google
折哥的程序人生 · 物流技术专研6 小时前
《Java 100 天进阶之路》第95篇:消息队列基础(RocketMQ/Kafka)(2026版)
java·面试·kafka·rocketmq·java-rocketmq·求职招聘
budingxiaomoli6 小时前
Spring日志
java·开发语言
IT空门:门主6 小时前
Spring 注入三剑客:@Resource、@Autowired、@RequiredArgsConstructor 到底该用哪个?
java·后端·spring
Sam_Deep_Thinking7 小时前
Spring Boot 的启动原理是什么?
java·spring boot·后端
南部余额7 小时前
Spring WebClient 从入门到精通
java·后端·spring
CodeStats7 小时前
从 CPU 指令到 JVM 进程:彻底讲透 Java 执行 main 方法时,类加载、主线程、栈帧入栈的完整底层逻辑
java·linux·开发语言