Android系统10 RK3399 init进程启动(三十七) 属性代码编程

配套系列教学视频链接:

      安卓系列教程之ROM系统开发-百问100ask

说明

系统:Android10.0

设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

上一节介绍了属性操作的各个API, 本章节通过实战代码来演示如何应用属性。


一, C/C++代码

目标:在代码中设置tcp链接adb的的端口

1,在代码中获取当前系统的版本

2,为adbd设置tcp连接的端口,并使其生效, 此处会操作属性ctl.start和ctl.stop

代码文件: 

Android.mk 

prop_test.cpp

实例代码

vim device/rockchip/qh100_rk3399/test_se/property_test$ vim prop_test.cpp:

#include <string>

// for c
#include <cutils/properties.h>
#define LOG_TAG "prop_test"
#include <log/log.h>

#include <android-base/properties.h>

// for adb
#define ADBD_TCP_DEFAULT_PORT  15000
#define PROP_ADBD_TCP_PORT "service.adb.tcp.port"

using   namespace  std;

void print_android_version()
{
    char android_version[PROPERTY_VALUE_MAX];
    property_get("ro.build.version.release", android_version, "");

    ALOGD("android version : %s", android_version);

}

void  set_adbd_tcp_port(unsigned int port){
    if(port <= 10000)
        port = ADBD_TCP_DEFAULT_PORT;
    property_set(PROP_ADBD_TCP_PORT, std::to_string(port).c_str());


}

void CplusTestPropString()
{

    const char* test_props[] = {
        "ro.product.name",
        "ro.product.model",
        "ro.product.device",
    };

    for (const auto& prop : test_props) {
        std::string value = std::string(prop) + "=" + android::base::GetProperty(prop, "");
    ALOGD("CPlUS API--%s", value.c_str());
    }

}



int main(int argc, char *argv[])
{
    print_android_version();
    CplusTestPropString();

    property_set("vendor.new.prop.test.name", "qh100");

#if 1
    set_adbd_tcp_port(0);
    property_set("ctl.stop", "adbd");
    property_set("ctl.start", "adbd");
#else
    property_set("ctl.restart", "vendor.gnss_service");
#endif

    while(1);

    return 0;
}
                                                                                                                                                                                                                                                 1,1          顶端

device/rockchip/qh100_rk3399/test_se/property_test$ vim Android.mk

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

LOCAL_CFLAGS += \
                -Wno-error \
                -Wno-unused-parameter


LOCAL_SHARED_LIBRARIES := \
        libbase \
        libcutils \
        liblog \



LOCAL_SRC_FILES:= prop_test.cpp

LOCAL_MODULE:= prop_test

LOCAL_PROPRIETARY_MODULE := true

include $(BUILD_EXECUTABLE)

 编译: 

rk3399_Android10.0$ source FFTools/build.s

rk3399_Android10.0$ lunch qh100_rk3399-userdebug

rk3399_Android10.0$ mmma device/rockchip/qh100_rk3399/test_se/property_test

生成的目标文件: 

[100% 540/540] Install: out/target/product/qh100_rk3399/system/bin/prop_test

通过adb push将文件推送到/vendor/bin/目录下进行运行

qh100_rk3399:/ # logcat -s prop_test
--------- beginning of main
08-17 12:20:24.812  1894  1894 D prop_test: android version : 10
08-17 12:20:24.812  1894  1894 D prop_test: CPlUS API--ro.product.name=qh100_rk3399
08-17 12:20:24.812  1894  1894 D prop_test: CPlUS API--ro.product.model=qh100
08-17 12:20:24.812  1894  1894 D prop_test: CPlUS API--ro.product.device=qh100_rk3399

并且adb会断开, 此时在cmd中利用: 

adb connect   开发板ip:15000  可以和板子建立新的adb链接。

二,java代码示例

目标: 1, 通过Build类获取到相关属性

2, 通过反射机制获取到属性

PropertyTest\app\src\main\java\com\qh\propertytest\MainActivity.java

package com.qh.propertytest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_build_info;
    private Button btn_get_prop;
    private Button btn_set_prop;
    private TextView tv_show;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initUI();
    }

    private void initUI() {
        btn_build_info= (Button)findViewById(R.id.btn_build_info);
        btn_build_info.setOnClickListener(this);
        btn_get_prop= (Button)findViewById(R.id.btn_get_prop);
        btn_get_prop.setOnClickListener(this);
        btn_set_prop = (Button)findViewById(R.id.btn_set_prop);
        btn_set_prop.setOnClickListener(this);
        tv_show= (TextView) findViewById(R.id.tv_show);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_build_info:
                tv_show.setText(PropertyUitls.getBuildDeviceListing());

                break;
            case R.id.btn_get_prop:
                tv_show.setText(PropertyUitls.getPropertyListing());
                break;
            case R.id.btn_set_prop:
                PropertyUitls.setProperty("my.second.name", "lilei");
                tv_show.setText(PropertyUitls.getProperty("my.second.name", ""));
                break;
        }
    }
}

PropertyTest\app\src\main\java\com\qh\propertytest\PropertyUitls.java

package com.qh.propertytest;

import android.os.Build;

import java.lang.reflect.Method;

public class PropertyUitls {
    private static  final int PROP_VALUE_MAX = 91;

    public static String getProperty(String key, String defaultValue) {
        String value = defaultValue;
        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method get = c.getMethod("get", String.class, String.class);
            value = (String)(get.invoke(c, key, defaultValue));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return value;
        }
    }
    public static void setProperty(String key, String val) {

        if (val != null && !val.startsWith("ro.") && val.length() > PROP_VALUE_MAX) {
            throw new IllegalArgumentException("value of system property '" + key
                    + "' is longer than " + PROP_VALUE_MAX + " characters: " + val);
        }
        try {
            Class<?> c = Class.forName("android.os.SystemProperties");
            Method set = c.getMethod("set", String.class, String.class);
            set.invoke(c, key, val);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }

    public static String getBuildDeviceListing() {
        return "Build.PRODUCT: " + Build.PRODUCT + "\n" +
                "Build.MANUFACTURER: " + Build.MANUFACTURER + "\n" +
                "Build.BRAND: " + Build.BRAND + "\n" +
                "Build.DEVICE: " + Build.DEVICE + "\n" +
                "Build.MODEL: " + Build.MODEL + "\n" +
                "Build.HARDWARE: " + Build.HARDWARE + "\n" +
                "Build.FINGERPRINT: " + Build.FINGERPRINT + "\n" +
                "Build.TAGS: " + Build.TAGS + "\n";
    }

    public static String getPropertyListing() {
        return "ro.hardware: " + getProperty("ro.hardware", "") + "\n" +
                "ro.product.model: " + getProperty("ro.product.model", "") + "\n" +
                "ro.product.manufacturer: " + getProperty("ro.product.manufacturer", "") + "\n" +
                "ro.product.board: " + getProperty("ro.product.board", "") + "\n" +
                "init.svc.adbd: " + getProperty("init.svc.adbd", "") + "\n" ;
    }

}

点击BUILDSHOW按钮的结果 

点击PROP_SHOW按钮的结果

点击PROP_SET按钮的结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旗浩QH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值