<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[toaksg的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zengd0</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zengd0]]></copyright><item><title><![CDATA[编译Android内核驱动Makefile文件编写]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/138384825</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/138384825</guid><author>zengd0</author><pubDate>Thu, 02 May 2024 02:41:44 +0800</pubDate><description><![CDATA[有些板子要显式指定ARCH才行，因为它们kernel目录下的Makefile文件里只实现了。的操作，不传ARCH会走到else里，从而编译error。]]></description><category></category></item><item><title><![CDATA[【Android】反编译APK及重新打包]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/136296574</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/136296574</guid><author>zengd0</author><pubDate>Mon, 26 Feb 2024 12:51:39 +0800</pubDate><description><![CDATA[其中，myapp.apk 是要反编译的 APK 文件名。执行该命令后，Apktool 会自动解包 APK 文件，并将解包后的文件保存到一个新的目录中。其中，myapp 是解包后的文件夹名，myapp_new.apk 是重新打包后的 APK 文件名。首先，需要下载一个 APK 反编译工具，例如 Apktool。）上下载最新版本的 Apktool，也可以使用包管理器来安装。1.下载 APK 反编译工具。3.重新打包 APK 文件。4.重新签名 APK 文件。2.反编译 APK 文件。]]></description><category></category></item><item><title><![CDATA[Endpoint Security VPN(CheckPoint)禁止开机自动打开(macOS)]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/131066523</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/131066523</guid><author>zengd0</author><pubDate>Tue, 06 Jun 2023 14:11:33 +0800</pubDate><description><![CDATA[Endpoint Security VPN (CheckPoint) 在Mac OS下禁止开机自启动。]]></description><category></category></item><item><title><![CDATA[OpenWrt扩容Overlay]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/124934933</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/124934933</guid><author>zengd0</author><pubDate>Mon, 23 May 2022 20:59:23 +0800</pubDate><description><![CDATA[OverlayFS是一种堆叠文件系统。如图：（图片源自网络）

如果系统的软件包空闲空间不够，则需要扩容。
本文的方案是在固件包上进行扩容。
在镜像文件后面增加空数据，比如增加5GB：
dd if=/dev/zero bs=1G count=5 &gt;&gt; 固件.img

此时查看固件文件大小，可看出文件大小增加了5G。
现在执行分区命令：
parted 固件.img

查看分区情况，以确定需要扩容的分区号：
print

以上图为例，应选择300M的分区号，比如是2：
resizepart 2 10]]></description><category></category></item><item><title><![CDATA[【Android】Apk签名及zipalign对齐]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/122986118</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/122986118</guid><author>zengd0</author><pubDate>Thu, 17 Feb 2022 16:23:42 +0800</pubDate><description><![CDATA[zipalign对齐：
zipalign -v 4 源文件 要生成的文件
检查apk有没有zipalign对齐:
zipalign -c -v 4 被检查的apk文件
使用apksigner签名：
apksigner sign --ks 密钥文件路径 --ks-key-alias 密钥别名 x x x.apk

]]></description><category></category></item><item><title><![CDATA[React Native按指定渠道（Build Variants）运行Android]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/122620613</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/122620613</guid><author>zengd0</author><pubDate>Fri, 21 Jan 2022 14:18:00 +0800</pubDate><description><![CDATA[默认是运行debug包的，如果项目中定义了多个Build Variants，那么会报此错误：
Task 'installDebug' not found in project ':app'.

解决方法：
运行命令加个参数–variant ，值是：渠道名称+Debug/Release。
如下：
react-native run-android --variant channelDebug


...]]></description><category></category></item><item><title><![CDATA[【React Native】解决报错：The development server returned response error code: 500]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/122580627</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/122580627</guid><author>zengd0</author><pubDate>Wed, 19 Jan 2022 14:38:23 +0800</pubDate><description><![CDATA[项目红屏报错：
The development server returned response error code 500
解决方法如下：
清缓存。
macOs：
rm -rf $TMPDIR/react-*; rm -rf $TMPDIR/haste-*; rm -rf $TMPDIR/metro-*; watchman watch-del-all

Windows:
react-native start --reset-cache


...]]></description><category></category></item><item><title><![CDATA[小程序压缩图片尺寸]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/122346457</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/122346457</guid><author>zengd0</author><pubDate>Thu, 06 Jan 2022 16:07:16 +0800</pubDate><description><![CDATA[有api是压缩质量的：
wx.compressImage({
    src: originPath, // 图片路径
    quality: 90, // 压缩质量
    success: function (res) {
      res.tempFilePath//结果路径
    }
  })

压缩尺寸没有api，需要自己实现。
可使用canvas绘制图片，然后保存。设置画布的大小，相当于控制了图片尺寸。
实现步骤：
1.在wxml上定义画布：（不支持动态创建canvas）
&lt;!-- ]]></description><category></category></item><item><title><![CDATA[【Android】解决aab上传Google Play后下载语言文件缺失的问题]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/122298491</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/122298491</guid><author>zengd0</author><pubDate>Tue, 04 Jan 2022 10:57:35 +0800</pubDate><description><![CDATA[官网（https://developer.android.com/guide/app-bundle?hl=zh-cn）有对aab的描述：

Google Play 会使用您的 App Bundle 针对每种设备配置生成并提供经过优化的 APK，因此只会下载特定设备所需的代码和资源来运行您的应用。

有些手机只内置了中文、英文等几种，如果从Google Play下载应用，那么Google Play会剔除掉其他（它认为是多余的）语言资源文件，从而导致应用切换语言不成功。
解决方法：
gradle那里可以配置是否]]></description><category></category></item><item><title><![CDATA[Android签名aab文件]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/122167068</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/122167068</guid><author>zengd0</author><pubDate>Mon, 27 Dec 2021 10:49:31 +0800</pubDate><description><![CDATA[jarsigner -verbose -keystore 签名文件路径 -digestalg SHA-256 -sigalg SHA256withRSA -storepass 密码 -keypass 密码 aab文件路径 别名(key alias)

ps：加上参数 -digestalg SHA-256 -sigalg SHA256withRSA，才能被Google Play识别。

]]></description><category></category></item><item><title><![CDATA[Android10及以上访问公有目录]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/113756089</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/113756089</guid><author>zengd0</author><pubDate>Mon, 08 Feb 2021 18:29:28 +0800</pubDate><description><![CDATA[公有目录指的是系统根目录下的Download、DCIM、Documents、Screenshots、Music等文件夹。
本文说的**“访问”**是指：列举出某一公有目录下的所有文件、删除某个文件、保存文件到某个公有目录等意思。
Android10以下按原来的File(path)方式，本文不表。
Android10及以上可以使用MediaStore**“访问”*公有目录。如果我们在公有目录下只操作自己应用生成的文件，是不需要申请文件读写权限的。另外，公有目录下的文件在APP卸载后不会被删除，也能被其他应用访]]></description><category></category></item><item><title><![CDATA[Android开发中的图片压缩]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/109450214</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/109450214</guid><author>zengd0</author><pubDate>Mon, 08 Feb 2021 14:09:58 +0800</pubDate><description><![CDATA[为什么要压缩
随着智能手机技术进步，手机摄像头的像素越来越高，目前主流水平都在四千多万到六千多万像素之间，更有甚者，个别手机的摄像头竟高达一亿像素。这些手机拍照成片所占的存储空间也越来越大，几千万像素的手机成像图片是十几M，一亿像素的jpg成片也高达三十M左右。
在目前的高像素时代，直传十几M以上的原图会带来一系列的问题：
1.上传时间过久带来的失败率高。用户侧上传带宽往往较小，且网络环境错综复杂，不稳定掉线时有发生。
2.服务端侧，如果不走CDN直传服务器，带宽、流量、性能、磁盘开销大；走CDN则磁盘和流]]></description><category></category></item><item><title><![CDATA[【Android】获取网络时间]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/113001245</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/113001245</guid><author>zengd0</author><pubDate>Fri, 22 Jan 2021 20:49:39 +0800</pubDate><description><![CDATA[有时候我们需要获取较为准确的当前时间，可以通过网络获取网络时间。毕竟手机系统的时间能够被用户所更改。
方法一：叫后端同学出接口，返回你想要的当前时间。
方法二：通过访问某个网站，获取它的服务器时间。（注意时区问题，比如要获取东八区时间，那就访问服务器在国内、且服务器时间是正确的，网站。）
下面是方法二的实现代码，getNetworkTime函数是传一个网站的地址，返回该网站的时间。
但是为了可靠性，防止个别网站有坑，导致获取到的时间有误，所以又写了个getCurrentTimeMills函数，同时获取两个网]]></description><category></category></item><item><title><![CDATA[【Android】根据蓝牙信号强度计算出距离]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/109528385</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/109528385</guid><author>zengd0</author><pubDate>Fri, 06 Nov 2020 11:24:44 +0800</pubDate><description><![CDATA[根据蓝牙的RSSI值（信号强度），估算出大概距离。
class BTDistanceUtil {
    companion object {
        const val RSSI_1M: Double = 50.0//发射端和接收端相隔1米时的信号强度
        const val N_VALUE: Double = 2.5//环境衰减因子

        /**
         * 根据rssi值估算出距离
         * @param rssi信号强度
         * @]]></description><category></category></item><item><title><![CDATA[解决frp内网穿透vsftpd报227错误]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/109403079</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/109403079</guid><author>zengd0</author><pubDate>Sat, 31 Oct 2020 15:21:31 +0800</pubDate><description><![CDATA[使用frp来内网穿透ftp，外网ftp客户端使用被动模式进行连接ftp的时候报：
227 Entering Passive Mode ...

frp目前还不支持ftp协议，它在转发ftp被动模式的数据连接所需要的ip，转发的是：frpc的内网ip或者是127.0.0.1。
为解决这个问题，需要指定vsftpd被动模式的ip地址。这样frp在转发的时候，会将这个指定的ip给外网ftp客户端。
编辑 /etc/vsftpd/vsftpd.conf，添加或者修改成下面的：
#关闭ip的安全检查
pasv_pro]]></description><category></category></item><item><title><![CDATA[【Android】解决DataBinding项目apk打包UTF-8报错问题]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/108887956</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/108887956</guid><author>zengd0</author><pubDate>Wed, 30 Sep 2020 16:59:40 +0800</pubDate><description><![CDATA[build控制台输出的错误信息如下：

Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException

据说是xml使用了中文的原因造成的，改成string资源引用即可。
不方便修改的话，则可以设置系统环境变量：
变量名：JAVA_TOOL_OPTIONS
变量值：-Dfile.encoding=UTF-8
然后重启Android Studio就行了。
另外，apk的文件名有中文，AS直接运行安装失败]]></description><category></category></item><item><title><![CDATA[【Android】监听媒体按键按下--响应媒体按钮]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/108451994</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/108451994</guid><author>zengd0</author><pubDate>Mon, 07 Sep 2020 17:17:24 +0800</pubDate><description><![CDATA[媒体按钮是 Android 设备和其他外围设备上的硬件按钮，例如蓝牙耳机或者线控耳机上的暂停/播放按钮。当用户按下媒体按钮时，Android 会生成 KeyEvent，其中包含用于标识按钮的键码。
可先阅读一下官方的文档，了解下整个流程和机制：
官方文档：响应媒体按钮
本文是监听播放、上一首、下一首等按键事件的代码实现。
不同版本的实现方式，差异有点大，比较碎片化。本人肤浅地认为Android5.0以下通过广播的方式接收，5.0及以上通过MediaSession，官方也封装了MediaSessionComp]]></description><category></category></item><item><title><![CDATA[【Android】获取已连接的经典蓝牙设备的名称和地址]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/108447393</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/108447393</guid><author>zengd0</author><pubDate>Mon, 07 Sep 2020 14:28:29 +0800</pubDate><description><![CDATA[经典蓝牙，获取已连接的蓝牙设备的信息。
private var mBluetoothFlag = -1
private var mBluetoothProxy: BluetoothProfile? = null
private val mBluetoothProxyListener = object : BluetoothProfile.ServiceListener {
    override fun onServiceDisconnected(profile: Int) {
    }

    ov]]></description><category></category></item><item><title><![CDATA[Android C/C++输出日志到logcat]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/106961323</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/106961323</guid><author>zengd0</author><pubDate>Thu, 25 Jun 2020 19:21:40 +0800</pubDate><description><![CDATA[Android Studio中我们习惯了在logcat查看日志，c/c++的printf()在logcat中并不会显示。
本文的jni环境是cmake+ndk。
首先，CMakeLists.txt中导入Android的log库：
find_library(log-lib
        log)
target_link_libraries( 
     ...
     ${log-lib}
     )

使用方式一：
在c/c++文件中引入android/log.h头文件：
#include &lt;a]]></description><category></category></item><item><title><![CDATA[Android View Binding使用介绍]]></title><link>https://blog.youkuaiyun.com/zengd0/article/details/104512123</link><guid>https://blog.youkuaiyun.com/zengd0/article/details/104512123</guid><author>zengd0</author><pubDate>Wed, 26 Feb 2020 10:39:37 +0800</pubDate><description><![CDATA[前言
Android Studio稳定版发布了3.6版本，带来了一些新变化：首先外观，启动页变了，logo改了，更显现代化；增加Multi Preview功能，能同时预览多个尺寸屏幕的显示效果；模拟器支持多屏；也终于支持全新的视图绑定组件ViewBinding；等。
之前我们与视图交互的方式有findViewById、kotlin中引入Android Kotlin Extensions后直接通过i...]]></description><category></category></item></channel></rss>