Android
文章平均质量分 51
Amosstan
一枚快乐的CODER~~
展开
-
Android4.4 preinstall方式安装apk
最近遇到一个需求,需要预置第三方apk至Android 4.4系统里面。预置的apk可以被用户卸载,并且Android系统恢复出厂后,预置的apk又可以自动安装恢复。可以被用户卸载,即需要安装到/data/app目录下。恢复出厂后apk又可以自动安装,则需要将apk存放至系统的某一个目录下,设置一个标志位,刷机或者恢复出厂第一次开机安装这些apk。即采用预安装方式(preinstall)来处理。原创 2023-01-12 09:27:16 · 37633 阅读 · 0 评论 -
Ubuntu22.04编译Android切换Python2.7版本
最近用版本编译时,报错误。经查是系统缺少导致。下面来列举一下安装并切换版本的步骤。切换超级用户安装Python2.7列出所有可用的Python替代版本信息这一步可能会报错。此错误表示 Python 的替代版本尚未被update-alternatives 命令识别。需要更新一下替代列表,将python2.7 和 python3.10 放入其中:再次列出可用的 Python 替代版本:切换Python版本如下图,选择对应的python版本即可。...原创 2022-07-12 18:47:55 · 101257 阅读 · 0 评论 -
Android10 HAL模块的实现
本文的目的研究HAL模块的实现过程。前期准备已编译完成Android 10版本源码。 源码下载参照:AOSP 源码下载开发板或者可运行Android 10版本镜像的设备,本文以开发板为例,例子通用。理论上Android 10编译出的库文件及bin文件,在同版本系统的开发板或者设备上都可运行。什么是HAL在Android系统中,硬件抽象层(),向下屏蔽硬件驱动模块的实现细节,向上提供对硬件访问的抽象接口服务。HAL是底层硬件和上层框架直接的接口,框架层通过HAL可以操作硬件设备,HAL的实现在用原创 2022-07-12 09:29:08 · 101531 阅读 · 0 评论 -
Ubuntu18.04 编译Android8.0报错解决
根据《Android编译环境搭建步骤》搭建起来的Android编译环境,在编译Android8.0/Android8.1时报错。主要报错打印为网上的一些修改端口号的方法并不可用,修改后依然编译不过。下面来看一下处理方法。原创 2022-06-21 16:43:27 · 107968 阅读 · 0 评论 -
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 · 114763 阅读 · 0 评论 -
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 · 114270 阅读 · 0 评论 -
Android编译报错error: unmappable character for encoding ASCII问题
最近编译Android 9.0时,突然报错。原创 2022-05-10 09:12:19 · 115134 阅读 · 0 评论 -
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 · 121053 阅读 · 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 · 115453 阅读 · 0 评论 -
Android10.0编译 make api-stubs-docs-update-current-api问题
编译源码遇到错误,可以先降低编译线程或者添加swap分区试试。原创 2021-12-22 09:26:13 · 120477 阅读 · 1 评论 -
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 · 183294 阅读 · 1 评论 -
Android编译选择 - eng、user、userdebug的区别
一、前言Android系统在编译时,在执行lunch操作时,会让用户选择编译类型:eng、user、userdebug。二、编译类型的区别区别见下图:三、其它上图摘自《深入解析Android5.0系统》,page 31。原创 2021-07-09 10:48:11 · 183792 阅读 · 0 评论 -
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 · 183074 阅读 · 0 评论 -
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 · 187358 阅读 · 2 评论 -
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 · 187262 阅读 · 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 · 186633 阅读 · 1 评论 -
Android -- 序列化(Parcelable)
一、前言前文已经讲过Java序列化Serializable,那么它和Android的序列化Parcelable有什么区别呢?在Android分别有Serializable和Parcelable两种序列化方式,其中Serializable是Java中的序列化方式,Parcelable是Android中独有的序列化方式。Serializable会有大量的I/O操作,因为要在硬盘上读写。Parcelable是基于内存的封装和封解,因此速度要快的多。但是如果Android要将对象序列化到设备或者对象序列化后原创 2021-04-02 20:40:43 · 210140 阅读 · 0 评论 -
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 · 211002 阅读 · 0 评论 -
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 · 221138 阅读 · 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 · 223362 阅读 · 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 · 220343 阅读 · 1 评论 -
Android 判断IP地址及端口是否正确
一、前言在进行网络编程时,端口或者IP的不正确会导致应用挂掉,通过以下方法可以对端口或者IP进行判断是否合法。二、解决思路1.端口判断端口的有效范围在 0 ~ 65535之间,写一个判断方法即可。2. IP判断这儿的IP指IPv4地址。a) IP地址长度判断b) 切割字符串,是否能够被分为四段c) 每段是否为数字d) 每个数字是否在0 ~ 255之间三、参考代码 private boolean isNetPort(int port) { boolean flag原创 2021-03-17 18:24:10 · 220748 阅读 · 0 评论 -
获取Android 设备的WIFI IPv4地址
一、前言有时候需要获取Android设备的IPv4地址,可以通过下面列出的一种方法获取。二、获取方法 // 获取IPv4地址 private String getDeviceIPv4() { //获取WifiManager WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); // 若WI原创 2021-03-17 12:52:10 · 219677 阅读 · 0 评论 -
Android TextView失去焦点后仍然实现文字滚动效果
一、前言有些时候TextView显示的长度不够需要实现滚动效果,有时候layout布局文件设置了一些属性后,能够实现滚动效果。但是TextView一旦失去焦点,滚动效果就停止了。二、思路重写TextView的回调函数,当失去焦点时仍然使其滚动。三、参考代码1. Java代码实现package com.example.getsystempropclient;import android.annotation.SuppressLint;import android.content.Contex原创 2021-03-14 20:43:11 · 218858 阅读 · 0 评论 -
Android Studio 在导入SystemProperties报错的问题
一、前言最近遇到Android Studio开发应用时导入SystemProperties报错问题:SystemProperties cannot be resolved.,反而在AOSP源码下修改Setting时可以导入使用。二、问题分析Android的系统属性相当于Windows的注册表,由key和value组成,读取系统属性,需要通过SystemProperties类来实现。SystemProperties在android.os下,但这个类是隐藏的,上层程序开发无法直接使用。可以通过修改app目原创 2021-03-11 22:50:16 · 219926 阅读 · 1 评论 -
Android 源码添加长按电源键重启功能
1. 前言Android 6.0源码编译出来的系统中,没有长按电源键后显示重启按钮的功能,因此需要我们修改添加一下。2. 分析可参照关机的流程顺藤摸瓜,比葫芦画瓢添加重启功能。下面列一下需要修改的文件:# 需要修改的文件frameworks/base/core/res/res/values/strings.xmlframeworks/base/core/res/res/values/config.xmlframeworks/base/core/res/res/values-zh-rCN/st原创 2021-02-09 17:32:37 · 220663 阅读 · 0 评论 -
adb push多个文件至系统中
1. 前言在adb push chromium编译出来的库时,总共有200多个文件需要push到/system/lib下,挨个push太麻烦,于是写一个脚本放到需要push文件的目录下,可以批量push文件至系统中。2. 方法原理就是遍历目录下的文件并挨个push,如下脚本所示:#! /bin/bashadb remountSO_LIST=($(ls *.so))for i in "${!SO_LIST[@]}";do so_name=${SO_LIST[$i]} ec原创 2021-02-09 16:01:53 · 224475 阅读 · 0 评论 -
Android源码修改默认开机为24小时制时间格式
1. 前言Android源码编译时,默认的时间制式是12小时,通过修改代码可以将其改为24小时制。2. 分析进入Settings源码找到设置时间制式的地方,路径为:packages/apps/Settings/src/com/android/settings/DateTimeSettings.java最后调用set24Hour(boolean is24Hour)来设置时间制式,代码如下: private void set24Hour(boolean is24Hour) { Setti原创 2021-02-05 19:34:12 · 219143 阅读 · 0 评论 -
Android源码编译速度优化 -- ccache设置
1. 前言Android源码编译时,设置ccache可有效的降低编译时间。谷歌给出的指导方法(优化编译环境章节):点击进入2. 方法要想长久方便使用,需要将以下环境 变量写入/etc/profile或者~/.bashrc中export USE_CCACHE=1export CCACHE_DIR=/<path_of_your_choice>/.ccache其中<path_of_your_choice>是要设置ccache缓存的目录,如果不设置,则默认缓存到~/.ccac原创 2021-02-04 16:38:36 · 221119 阅读 · 0 评论 -
Android6.0源码修改系统默认语言为中文
1. 前言Android源码编译的版本刷入系统后,默认系统语言为英文。通过以下修改可以将系统语言设置为中文。2. 修改方法###分别打开一下两个文件: build/target/product/full_base.mk将其中的:PRODUCT_LOCALES := en_US改为: PRODUCT_LOCALES := zh_CN重新编译系统即可,这样默认开机语言就为中文。3. 备注可根据项目需要设置默认的系统语言。...原创 2021-02-03 20:56:43 · 219357 阅读 · 4 评论 -
Android源码精简系统语言
1. 前言裁剪掉不用的系统语言可以节省空间。2. 裁剪方法分别打开一下两个文件:build/target/product/languages_full.mkbuild/target/product/locales_full.mk将其中的:PRODUCT_LOCALES := en_US en_AU en_IN fr_FR it_IT es_ES et_EE de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN zh_HK ru_RU ko_KR nb_NO es_原创 2021-02-03 20:49:46 · 218385 阅读 · 0 评论 -
Eclipse DDMS报错:Failed to initialize Monitor Thread
之前用Eclipse做Android开发时遇到过这个错误:DDMS报错:Failed to initialize Monitor Thread: ......在Eclipse文件夹下的eclipse.ini中,看到有类似下面的字符串:openFile-vmargs-Dosgi.requiredJavaVersion=1.6在其后面加入下面这句(如果eclipse.ini中没有,则这几句一起加入到这个文件的最后):-Djava.net.preferIPv4Stack=true就这样,重启E原创 2021-01-28 14:38:03 · 218263 阅读 · 0 评论 -
AOSP源码下载
1.说明由于一些原因,利用谷歌的资源下载Android源码速度很慢,我们可以用清华源里面的资源进行下载。清华源AOSP配置下载地址详解:Android 镜像使用帮助2.源码下载示例由于清华源中给出很清晰的配置下载方法,这儿只做几条总结:A.谷歌镜象不可用,采用清华源镜象https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/B.配置repomkdir ~/binPATH=~/bin:$PATHcurl https://mirrors.tuna.ts原创 2021-01-28 14:16:35 · 218698 阅读 · 1 评论 -
Ubuntu下adb devices连接异常问题
1.现象描述描述输入adb devices时,出现以下等情况:a. adb: insufficient permissions for device: user in plugdev group; are your udev rules wrong?See [http://developer.android.com/tools/device.html] for more informationb. List of devices attached ???????????? no permi原创 2021-01-28 13:50:24 · 217647 阅读 · 0 评论 -
解决刷完AOSP后SIM卡不识别问题 -- vendor.img镜像生成方法
1.下载android-prepare-vendor工程git clone git@github.com:anestisb/android-prepare-vendor.git2.切换java环境sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_40/bin/javac 300sudo update-alternatives --config java选择4 (主要选择java-8变量),原创 2021-01-27 22:23:43 · 220411 阅读 · 0 评论 -
Android源码编译环境搭建
Google自 2021 年 6 月 22 日起,不再支持在 MacOS 上进行Android平台开发。某些芯片厂家提供的Android SDK不支持低版本的Ubuntu(16.04 LTS及以下),故本篇文章以为例来描述Android编译环境的搭建过程。经测试,等系列分支版本以及等芯片厂家提供的包,OpenWRTChromium都可以编译通过。原创 2020-02-28 00:41:37 · 221972 阅读 · 0 评论 -
Android Studio导入指定的jar包
Android Studio导入指定jar包一、导语有时侯AS项目会引用第三方jar包,它们之间可能有debug版本,有release版本或jdk版本不同等情况,全部引用可能会导致编译错误,这个时候我们要选择引用其中的一个jar包做开发。二、导入步骤1.将AS切换至Project展示状态,在app目录下建立libs文件夹,将第三方jar包copy至libs目录下,如下图。2.点击Fil...原创 2019-11-06 10:53:26 · 218029 阅读 · 0 评论 -
Android 通过Java方法获取所有IPv6地址
IPv6技术正在蓬勃发展。 最近做项目的时候,客户要求Setting中将所有的IPv6地址都能够显示出来,目前通过Android标准接口只能获取一个IPv6地址,但是安卓设备可能有多个IPv6地址。为此我们首先想到利用ifconfig去获取,但是用java代码执行Runtime.getRuntime().exec(“ifconfig eth0”)时,发现没有权限。网上有几种方法写到:先执行Run...原创 2018-08-13 11:24:38 · 220230 阅读 · 0 评论 -
Android -- JNI开发(静态注册)
近来研究了一下Android Studio JNI开发,写过几个JAVA调用C层的例子,网上百度了很多,发现好多例子现在都不适用,因此在这儿做一个简单的总结,分享给大家。特别说明:由于AS 和 Gradle更新过快,导致网上以前一些JNI开发的教程不适用。在这儿,此教程采用的是AS3.1,Gradle4.4。理论上,Gradle3.0以上的版本采用此教程即可。下面的步骤仅供参考,详细代码请...原创 2018-05-18 19:03:26 · 214659 阅读 · 0 评论