- 博客(74)
- 资源 (3)
- 收藏
- 关注
原创 OpenWrt -- OpenVPN配置Server&Client(TUN模式)
目标是两台设备能通过OpenVPN TUN模式建立连接。
2023-08-16 17:27:49
39735
2
原创 OpenWrt搭建PPPOE Server
本文选择的路由器为小米R1C(官网型号:xiaomi_miwifi-mini),以OpenWrt为基础平台,使用搭建双栈环境。将R1C刷入Breed方法自行百度。下载R1C OpenWrt固件本文以版本为例,下载地址链接:openwrt-21.02.1-ramips-mt7620-xiaomi_miwifi-mini-squashfs-sysupgrade.bin固件刷入将下载好的固件通过刷入路由器,刷写完成后,确保路由器能够连接外网。SSH登录通过SSH软件(比如MobaXterm或者SecureCRT)
2023-07-06 09:39:25
37297
4
原创 Android4.4实现简单的录像功能
在Android中实现录像功能,高版本Android和低版本Android的API使用方式不同。本文以Android4.4系统为基础,简单的列举一下实现过程。
2023-06-20 13:54:45
34894
原创 Android4.4 preinstall方式安装apk
最近遇到一个需求,需要预置第三方apk至Android 4.4系统里面。预置的apk可以被用户卸载,并且Android系统恢复出厂后,预置的apk又可以自动安装恢复。可以被用户卸载,即需要安装到/data/app目录下。恢复出厂后apk又可以自动安装,则需要将apk存放至系统的某一个目录下,设置一个标志位,刷机或者恢复出厂第一次开机安装这些apk。即采用预安装方式(preinstall)来处理。
2023-01-12 09:27:16
37574
原创 Ubuntu18.04添加rc.local启动项
版本不再使用inited管理系统,改用systemd。个人认为rc.local作为系统启动脚本比较方便。
2022-11-21 10:06:29
47332
原创 Google Android8.1镜像WIFI提示“已连接但无法访问互联网“的解决办法
Nexus 6P刷入Google Android8.1镜像后,WIFI提示"已连接,但无法访问互联网"。
2022-11-16 09:18:36
57505
1
原创 Ubuntu22.04编译Android切换Python2.7版本
最近用版本编译时,报错误。经查是系统缺少导致。下面来列举一下安装并切换版本的步骤。切换超级用户安装Python2.7列出所有可用的Python替代版本信息这一步可能会报错。此错误表示 Python 的替代版本尚未被update-alternatives 命令识别。需要更新一下替代列表,将python2.7 和 python3.10 放入其中:再次列出可用的 Python 替代版本:切换Python版本如下图,选择对应的python版本即可。...
2022-07-12 18:47:55
101237
原创 Android10 HAL模块的实现
本文的目的研究HAL模块的实现过程。前期准备已编译完成Android 10版本源码。 源码下载参照:AOSP 源码下载开发板或者可运行Android 10版本镜像的设备,本文以开发板为例,例子通用。理论上Android 10编译出的库文件及bin文件,在同版本系统的开发板或者设备上都可运行。什么是HAL在Android系统中,硬件抽象层(),向下屏蔽硬件驱动模块的实现细节,向上提供对硬件访问的抽象接口服务。HAL是底层硬件和上层框架直接的接口,框架层通过HAL可以操作硬件设备,HAL的实现在用
2022-07-12 09:29:08
101480
原创 Ubuntu18.04搭建OpenGrok代码搜索工具
apache-tomcat-9.0.64.tar.gz下载地址:将其存放至/opt目录下opengrok-1.3.16.tar.gz下载地址:将其存放至/opt目录下ctags下载地址:openjdk8安装ctag三、apache-tomcat安装解压并重命名启动服务器关闭服务器四、安装OpenGrok切换超级用户解压安装五、tomcat与opengrok关联配置查看webapps目录可以看到目录下并没有source目录。文件复制将opengrok的l
2022-07-01 10:39:40
105863
2
原创 Ubuntu18.04 编译Android8.0报错解决
根据《Android编译环境搭建步骤》搭建起来的Android编译环境,在编译Android8.0/Android8.1时报错。主要报错打印为网上的一些修改端口号的方法并不可用,修改后依然编译不过。下面来看一下处理方法。
2022-06-21 16:43:27
107943
原创 Android4.4添加系统服务(aidl接口服务)
一、 准备编译好的Android4.4源码用于添加系统服务,用于获取CPU的Core数量。AndroidStudio工具用于编写apk调用系统接口二、 添加系统服务添加aidl接口frameworks/base/core/java/android/app/ICpuInfoManager.aidlpackage android.app;interface ICpuInfoManager{ int getCpuCore();}添加系统服务,实现aidl文件的接口f
2022-05-18 15:34:21
114740
原创 Android中JNI在C/C++中的区别
一、 一个疑问在进行JNI编程中,同样一个函数FindClass,C和C++中有不同的用法:如果是C++要用 env->FindClass(str)如果是C要用 (*env)->FindClass(env, str);类似的区别几乎设计到每一个结构体函数的使用,这是为什么呢?二、问题分析分析JNI的头文件jni.h1. 头文件位置libnativehelper/include_jni/jni.h (Android9.0)libnativehelper/include/na
2022-05-18 09:55:51
114262
原创 Android编译报错error: unmappable character for encoding ASCII问题
最近编译Android 9.0时,突然报错。
2022-05-10 09:12:19
115089
原创 Android获取SystemProperties方法
一、前言Android API从21后开始,不再直接支持通过SystemProperties.get/set方式来获取/设置系统属性。目前有两种方式可以获取/设置系统属性,分别为通过反射方法及AndroidStudio中通过引入jar包来解决。二、方法一通过反射方式来进行系统属性操作,代码如下:package com.example.SystemPropertiesUtils;import java.lang.reflect.Method;public final class System
2022-04-25 15:08:09
120802
1
原创 Ubuntu18.04编译低版本Android注意事项
一、前言Ubuntu18.04或者Ubuntu16.04编译AOSP源码时(Android5.0、Android6.0等版本),会报unsupported reloc 42、unsupported reloc 43等错误。在Ubuntu14.04上能够编译过。二、修改方法1. LC_ALL设置在/etc/profile或者~/.bashrc中添加:export LC_ALL=C2....
2021-12-28 14:00:52
115439
原创 Android源码导入AndroidStudio或IntelliJ IDEA
一、前言经常和Android系统源代码(AOSP)打交道的人,如果要去修改系统源码,显然用SourceInsight、Notepad++、vim这些工具有些麻烦,并且想快速补全代码也做不到。我们可以用idegen来生成针对AndroidStudio或IntelliJ IDEA的Android系统源代码工程配置文件,它位于Android系统源代码工程目录的下列位置:development/tools/idegen├── Android.bp├── excluded-paths├── idegen.
2021-12-28 09:54:49
115920
原创 Linux shell下date格式化输入日期
Linux date命令可以用来显示或设定系统的日期与时间,在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记。
2021-12-24 16:29:39
122272
原创 Android10.0编译 make api-stubs-docs-update-current-api问题
编译源码遇到错误,可以先降低编译线程或者添加swap分区试试。
2021-12-22 09:26:13
120367
1
原创 Ubuntu提示W: Possible missing firmware xxx解决方法
一、问题现象当执行 sudo apt-get update或者sudo apt-get dist-upgrade时,有如下警告:W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125a-3.fw for module r8169W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168fp-3.fw for module r8169实际上是缺少固件文件导致的。二、解决方法去
2021-12-03 09:14:51
118367
1
原创 排序 - 选择排序
一、前言 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。二、算法步骤首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。三、代码示例#include <stdio.h>void bubble_sort(int arry[], int len){ int i, j, tmp;
2021-10-15 15:48:50
140846
原创 排序 - 冒泡排序
一、前言 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。二、算法步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后
2021-10-15 15:16:35
140789
原创 Java关键字 -- synchronized
一、介绍synchronized是Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。二、用法synchronized修饰的对象有以下几种:修饰代码块
2021-09-07 16:55:04
170970
3
原创 Android init.rc中vold socket语法简介
一、 前言本篇文章以Android4.4代码为例,简单说明init.rc中vold里面socket语法的使用。二、语法简介2.1 init.rc位置init.rc文件位置:/system/core/rootdir/init.rc2.2 vold代码块位置service vold /system/bin/vold class core socket vold stream 0660 root mount ioprio be 22.3 socket语法socket &l
2021-09-01 17:24:50
173105
原创 Android.mk文件
一、前言Android.mk是Android在编译模块是用到的编译文件。我们用/package/app/Settings/Android.mk文件距离说明其中的参数定义。二、定义解释# 设置LOCAL_PATH为当前目录LOCAL_PATH:= $(call my-dir)# 清除LOCAL_PATH外所有"LOCAL_"变量include $(CLEAR_VARS)# 指定依赖的共享Java类库LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt
2021-07-09 11:12:42
183285
1
原创 Android编译选择 - eng、user、userdebug的区别
一、前言Android系统在编译时,在执行lunch操作时,会让用户选择编译类型:eng、user、userdebug。二、编译类型的区别区别见下图:三、其它上图摘自《深入解析Android5.0系统》,page 31。
2021-07-09 10:48:11
183761
原创 Android用readdir()函数读取exfat格式U盘文件返回的d_type为空的问题
一、前言Android4.4上面,用readdir()函数读取exfat格式的U盘文件后,在返回的dirent结构体中,有关读取文件的类型d_type值为空。二、问题分析这个有个可能是exfat文件在挂载时,相应的结构体没有填充导致。三、解决方法有两种解决方法,一种是用stat()函数,具体方式参照/frameworks/av/media/libmedia/MediaScanner.cpp中对位置文件类型处理方式进行处理。代码如下:MediaScanResult MediaScanner::do
2021-07-06 14:06:01
183047
原创 Android 4.4 -- blkid命令支持exfat格式U盘显示信息(UUID、LABEL等)
一、前言最近客户反馈一个问题,就是Android系统的机顶盒插上exfat格式的U盘后,获取不到UUID这个信息。/system/vold/中已经添加对exfat格式U盘的支持,并且通过df命令能够看到U盘已经挂载上,但是执行blkid时,并未显示exfat格式U盘信息。二、问题分析执行blkid /dev/block/sda1命令(sda1为U盘挂载点),若U盘格式为vfat的,则能够正常显示,若U盘格式为exfat的,则不能显示。问题应该出在blkid命令不健全导致的,可以补充一部分代码,让
2021-06-28 17:27:25
187315
2
原创 Linux下对硬盘或U盘进行分区及格式化 -- fdisk及mkfs命令的使用
一、前言对硬盘或者U盘设备进行分区及格式化,适用于以下情况:用UltraISO软碟通对U盘进行过烧录windows及其他系统,U盘的分区表会变为sda4,想改为sda1的。有时候因为某些操作,会导致硬盘或U盘的分区表损坏,导致设备挂载异常。想修改分区表的编号。其它情况。二、查看分区的命令df -hfdisk -llsblk三、fdisk命令简介输入 fdisk /dev/sde (设备节点)后,接着输入mroot@dell:~# fdisk /dev/sd
2021-06-25 21:48:16
187519
1
原创 Android View中OnKeyListener的onKey返回值
1. 前言在调试Android原生Setting开始中,遇到DialogPreference中用遥控器操作SeekBar到100%时,再按一次右键SeekBar焦点会跳至确定按钮中去。正常现象应该是停留至SeekBar尾部。2. 问题分析根本原因就是焦点变化了,当SeekBar为100%时,再按一次右键让焦点停留再当前位置即可。进一步分析就是对按键进行处理,当满足条件时,使系统不再处理这个按键。3. 原生代码片段在View.java中 /** * Interface defin
2021-06-01 16:38:56
187252
3
原创 Android SDK常用命令
1. 注意事项执行source build/envsetup.sh后可以使用很多android集成的shell命令。2. 代码中定义打开build/envsetup.sh文件,可以看到:function hmm() {cat <<EOFInvoke ". build/envsetup.sh" from your shell to add the following functions to your environment:- lunch: lunch <product_
2021-05-12 09:38:39
186629
1
原创 C语言实现有锁队列
一、前言有锁队列不同于无锁队列,有锁队列是在入列或者出列时,为队列上锁,这样保证代码在运行时同一时间只能有一种操作,因此避免了资源的抢占。使用场景生产消费者模型之类的场景可以使用。二、代码头文件定义我们定义一个USER_INFO结构体数据类型,里面存储了一些信息,用单向链表的形式在队列中进行存储。quque.h代码如下://// Created by jerry on 2021/4/6.//#ifndef C_QUEUE_DEMO_QUEUE_H#define C_QUE
2021-04-06 18:34:13
209123
原创 Android -- 序列化(Parcelable)
一、前言前文已经讲过Java序列化Serializable,那么它和Android的序列化Parcelable有什么区别呢?在Android分别有Serializable和Parcelable两种序列化方式,其中Serializable是Java中的序列化方式,Parcelable是Android中独有的序列化方式。Serializable会有大量的I/O操作,因为要在硬盘上读写。Parcelable是基于内存的封装和封解,因此速度要快的多。但是如果Android要将对象序列化到设备或者对象序列化后
2021-04-02 20:40:43
210129
原创 Java -- 序列化(Serializable)
一、前言什么是序列化(a) 序列化是Java提供的一种机制。通过该机制,一个对象可以被表示为一个字节序列,并存储到磁盘文件中。(b) 将序列化的对象写入文件后,通过反序列化可以将这个对象从文件中读取出来。为什么要序列化对象、文件、数据有许多不同的格式,很难统一传输与保存。序列化后就可以将上述数据转换为字节流,统一起来,这样方便传输。使用时,再将其反序列化,这样对象是对象,文件是文件。二、序列化过程被序列化的类需要继承Serializable接口,并且设置serialVersionUID
2021-04-02 18:35:29
210264
原创 Android -- JNI开发(动态注册)
一、前言注册JNI函数有两种方式:静态注册这种方法比较常见,用的是javah -jni xxxx命令生成一组签名函数,并去实现这些函数。静态注册方式的弊端:(a)需要编译所有声明了native函数的Java类,每个所生成的class文件都得用javah命令生成一个头文件。(b)javah生成的JNI层函数名特别长,书写起来很不方便。(c)初次调用native函数时要根据函数名字搜索对应的JNI层函数来建立关联关系,这样会影响运行效率。静态注册在前面已经提到过,详情请见:Android St
2021-04-01 19:37:11
210990
原创 Android ListView -- 带图标和文字的Item
一、前言在某些场景下,单一文字的ListView Item已不适合当前需求,因此需要我们自定义Item布局来满足需求。下面我们来实现一个带图标和文字的Item。二、代码展示定义包含ListView的布局文件activity_main.xml,Activity在onCreate()时加载。<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:a
2021-03-26 21:12:14
221128
1
原创 Android ListView -- 动态添加及删除Item内容
一、前言下面代码简单的展示了动态添加、删除ListView里面的Item内容,不过是在OnItemClickListener里面的onItemClick中实现的,代码详情如下展示。二、代码简单的布局文件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schema
2021-03-26 16:31:16
223301
4
原创 Android MVP架构
一、架构概述对于MVP (Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的。而对于Android应用的开发中本身可视为一种MVC架构。通常在开发中将XML文件视为MVC中的View角色,而将Activity则视为MVC中的Controller角色。不过更多情况下在实际应用开发中Activity不能够完全充当Controller,而是Controller和View的合体。于是Activity既要负责视图的显示,又要负责对业务逻辑的处理
2021-03-24 09:32:15
220337
1
单向链表的demo - p_node_link.rar
2018-11-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人