apk构建环境配置 我们在本地采用了buildozer的方案来进行apk的构建,如果在本地其他环境依赖如jdk等都已经部署完毕,在虚拟环境里面直接安装buildozer是没有问题的。...kivy]$ which buildozer /home/dechin/projects/2021-python/kivy/kivy_venv/bin/buildozer buildozer的基本使用...从框架上来说,buildozer的使用方法其实只有两个步骤:先用init生成配置文件,然后使用buildozer debug就可以构造一个apk文件了,如果顺利的话:) (kivy_venv) [dechin...但是,运气好的情况下也不需要去修改这个配置文件就可以成功构建apk。...to make an alias 第一次初始化,出现了权限不足的问题,一开始以为是容器内部读写权限配置的问题,因此这里先给容器加上了privileged权限,但是执行后发现这个问题依然存在
apk构建环境配置 我们在本地采用了buildozer的方案来进行apk的构建,如果在本地其他环境依赖如jdk等都已经部署完毕,在虚拟环境里面直接安装buildozer是没有问题的。...buildozer的基本使用 从框架上来说,buildozer的使用方法其实只有两个步骤:先用init生成配置文件,然后使用buildozer debug就可以构造一个apk文件了,如果顺利的话:) 1...但是,运气好的情况下也不需要去修改这个配置文件就可以成功构建apk。...to make an alias 第一次初始化,出现了权限不足的问题,一开始以为是容器内部读写权限配置的问题,因此这里先给容器加上了privileged权限,但是执行后发现这个问题依然存在.../bin/myapp-0.1-armeabi-v7a-debug.apk"' # Cwd /home/dechin/.buildozer/android/platform Performing Streamed
另外,就语法而言,Python比Java更加简洁,同时又功能强大,既可面向过程亦可面向对象,而不像Java一样,是一种纯粹的面向对象语言,哪怕打印一句话也需要先创建类。...Python作为一种脚本语言,可以边解释边执行,而不需编译,另外Python中存在的元类,可以使我们动态的创建类,如此可以在不需要重新编译安装apk的情况下,动态的由远程服务端为Android项目添加功能...kivy实际上已经解决我们需要实现的目的,模仿Android平台上的kivy实现机制即可。...但是,kivy使用了大量的Cython技术,而非CPython API接口,需要学习Cython语法,并且在其他一些方面存在一些限制。...即在一个安卓apk工程中包含一个cython.so解释器,通过jni机制调用解释器去解释执行Python代码,通过Java调C,C调Python实现交互。
和许多其它的高级语言一样,Python使用了垃圾回收器来自动销毁那些不再使用的对象。每个对象都有一个引用计数,当这个引用计数为0时Python能够安全地销毁这个对象。...弱引用的主要作用就是减少循环引用,减少内存中不必要的对象存在的数量。 使用weakref模块,你可以创建到对象的弱引用,Python在对象的引用计数为0或只存在对象的弱引用时将回收这个对象。...回调函数callback要求单个参数(弱引用的对象)。 一旦你有了一个对象的弱引用,你就能通过调用弱引用来获取被弱引用的对象。...在Python删除了一个引用的对象之后,使用代理将会导致一个weakref.ReferenceError错误。 循环引用 前面说过,使用弱引用,可以解决循环引用不能被垃圾回收的问题。...WeakValueDictionary类,顾名思义,本质上还是个字典类型,只是它的值类型是弱引用。当这些值引用的对象不再被其他非弱引用对象引用时,那么这些引用的对象就可以通过垃圾回收器进行回收。
Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d)...GeneratorExit generator.close()方法被调用的时候 ImportError 导入模块失败的时候 IndexError 索引超出序列的范围 KeyError 字典中查找一个不存在的关键字...KeyboardInterrupt 用户输入中断键(Ctrl+c) MemoryError 内存溢出(可通过删除对象释放内存) NameError 尝试访问一个不存在的变量 NotImplementedError...尚未实现的方法 OSError 操作系统产生的异常(例如打开一个不存在的文件) OverflowError 数值运算超出最大限制 ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象... | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError
,如下做法会报错 console.log(a2); // Uncaught ReferenceError: a2 is not defined console.log(b); // undefined...let a2 = 10; var b = 11; 3) 存在暂时性死区(temporal dead zone),只要块级作用域内存在let的声明,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响...(); // Uncaught ReferenceError: b is not defined 4)let与window对象脱钩 一般来说,全局var声明的变量,会挂钩在window对象上,但let却不会这样...匿名函数 没有块级作用域之前,为了整合代码,更好的分块不予外部代码混淆,我们常常使用匿名函数的自执行方式 (function() { console.log(1); // 1 })(); 但或许现在不再需要了...const声明的引用类型,只是引用类型的地址不能更改,但其指向的值是可以的,如 const obj = { a: 10 }; obj.a = 11; obj.a // 11
id=1415 Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError ...KeyboardInterrupt 用户输入中断键(Ctrl+c) MemoryError 内存溢出(可通过删除对象释放内存) NameError 尝试访问一个不存在的变量 NotImplementedError... 尚未实现的方法 OSError 操作系统产生的异常(例如打开一个不存在的文件) OverflowError 数值运算超出最大限制 ReferenceError 弱引用(...weak reference)试图访问一个已经被垃圾回收机制回收了的对象 RuntimeError 一般的运行时错误 StopIteration 迭代器没有更多的值 SyntaxError... | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError
Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl...GeneratorExit generator.close()方法被调用的时候 ImportError 导入模块失败的时候 IndexError 索引超出序列的范围 KeyError 字典中查找一个不存在的关键字...KeyboardInterrupt 用户输入中断键(Ctrl+c) MemoryError 内存溢出(可通过删除对象释放内存) NameError 尝试访问一个不存在的变量 NotImplementedError...尚未实现的方法 OSError 操作系统产生的异常(例如打开一个不存在的文件) OverflowError 数值运算超出最大限制 ReferenceError 弱引用(weak reference...)试图访问一个已经被垃圾回收机制回收了的对象 RuntimeError 一般的运行时错误 StopIteration 迭代器没有更多的值 SyntaxError Python的语法错误 IndentationError
将内部类改为静态内部类,并使用弱引用WeakReference来保存Activity实例 因为弱引用只要GC发现了就会回收它 ,因此可尽快回收。...解决办法:使用静态内部类+弱引用的方式 资源未被及时关闭造成的内存泄漏 比如一些Cursor 没有及时close 会保存有Activity的引用,导致内存泄漏 解决办法:在onDestory方法中及时close...ARC(Automatic Reference Counting),自动引用计数,只负责对象的生成,其他过程开发人员不再需要关心其销毁,使用方式类似于垃圾回收,但其实质还是引用计数。...当某个指针不再指向这个对象时,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存。 ?...不止两对象存在循环引用问题,多个对象依次持有对方,形式一个环状,也可以造成循环引用问题,而且在真实编程环境中,环越大就越难被发现,从而造成内存泄漏。
在声明它之前,变量 b 是不存在的,这时如果用到它,就会抛出一个错误。 3、暂时性死区 只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。...var c = 123; if (true) { c = 'abc'; // 报错ReferenceError let c; } 上面代码中,存在全局变量 c,但是块级作用域内 let 又声明了一个局部变量...if (true) { const b = 123; } b // 报错Uncaught ReferenceError: MAX is not defined 2、不存在变量提升、暂时性死区...除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的函数。...暂时性死区 暂时性死区 声明变量时可不赋值 声明变量时可不赋值 声明常量时需赋值 (常量除非为引用类型,否则不可修改)
作用是更方便和快速开发 C/C++ 的动态库,并自动将动态库与应用一起打包到 apk。 NDK 是属于 Android 的,与 Java 无直接关系。...注意: 在 native 环境下创建的线程,要想和 java 通信,即需要获取一个 JNIEnv 对象。...局部引用只在创建它的 native 方法中有效,包括其调用的其它函数中有效。因此我们不能寄望于将一个局部引用直接保存在全局变量中下次使用(请使用全局引用实现该需求)。...我们可以不用删除局部引用,它们会在 native 方法返回时全部自动释放,但是建议对于不再使用的局部引用手动释放,避免内存过度使用。...扩展:弱全局引用 通过 NewWeakGlobalRef 和 DeleteWeakGlobalRef 创建和释放一个弱全局引用。 弱全局引用类似于全局引用,唯一的区别是它不会阻止被 GC 回收。
apk安装信息 启动app的时候,常常会检查当前apk的安装信息,以此判断接下来要做哪些准备工作,举例如下: 1、获得apk的版本号,针对不同版本,分别对SQLite的数据库表做相应的变更操作。...2、获得apk的签名,据此判断安装包是否为合法来源。签名的介绍参见《Android开发笔记(七十三)代码混淆与反破解》。 3、获得apk的申请权限,从而判断app是否申请了相应的权限。...PackageManager类便是获取apk安装信息的工具,该类的getPackageInfo方法即可获得相应的安装信息。...列表信息是PackageInfo对象的receivers参数。 GET_SERVICES : 获取服务Service列表。列表信息是PackageInfo对象的services参数。...在上面这篇文章中,我们为了防止Handler的内存泄漏,给Activity加了个弱引用对象,由于弱引用是可以被回收的,因此在使用前得判断弱引用对象是否为空,只有对象非空,才能操作其上的UI元素。
let命令 基本用法 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 不存在变量提升 var会存在变量提升现象..., let和const则不会有这种情况 暂时性死区 简称 TDZ 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。...var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } ES6 明确规定,如果区块中存在let和const命令...块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。...为了解决这个问题,es6引入的let 、const和class声明的全局变量不再属于顶层对象的属性。
所以,什么是 ReferenceError(引用错误)? ReferenceError 说明检测到了一个无效的引用值。...全局上下文的 VariableObject 是全局对象本身(浏览器中的 window)。每个函数上下文都有一个抽象的变量对象,称为 ActivationObject。...结论是,下面的代码片段在浏览器中运行时很可能会抛出 ReferenceError: console.log(new Date()); 如何对可能不存在的变量进行编码?...幸运的是,还有另一种方法:我们已经知道,如果 undefined 属性的基值被定义,那么它就不会抛出 ReferenceError —— 而且由于 console 属于全局对象,我们就可以这样做: window.console...&& console.log(new Date()); 实际上,只需要检查全局上下文中是否存在变量(函数中存在其他执行上下文,而且你可以控制自己的函数中存在哪些变量)。
+-- AssertionError 断言语句失败 | +-- AttributeError 访问未知对象属性...| +-- LookupError 无效数据查询的基类,键、值不存在引发的异常 | | +-- IndexError...索引超出范围 | | +-- KeyError 字典关键字不存在...(没有属性) | | +-- UnboundLocalError 访问未初始化的本地变量 | +-- ReferenceError...弱引用(Weak reference)试图访问已经垃圾回收了的对象 | +-- RuntimeError
ReferenceError 当对变量/项的引用被破坏或不存在时,将引发此错误。也就是说,变量/项不存在。...接下来,我们引用cat变量和dog变量。cat变量存在,而dog变量不存在。 cat将返回“ cat”,而dog会引发ReferenceError,因为在环境记录中找不到名为dog的变量。...can't find it 注意:未定义的变量不会抛出ReferenceError,因为它存在于环境记录中只是它的值尚未设置。 3. SyntaxError 这是我们遇到的最常见的错误。...toUpperCase函数是有意通用的;它不需要其this值是String对象。因此,可以将其转移到其他种类的对象中用作方法。...根据EcmaSpec 2018版: 此异常不再会被JavaScript抛出,但是EvalError对象仍然保持兼容性。 7.
OWASP Mobile Top 10 : M1 – 平台使用不当 M2 – 不安全的数据存储 M3 – 不安全的通信 M4 – 不安全的身份验证 M5 – 弱加密 M6 – 不安全的授权 M7- -...反编译check 2.1 反编译apk 1. 将apk格式后缀缓存.zip后缀 2....查看代码中具体调用这些弱密码的代码段,判断使用是否合理。 8. 关于硬编码和Key同样,确定是不是可以在代码中直接能找到。...M6 – 不安全的授权 不安全的应用程序权限设置 冗余授予的权限 存在不安全的直接对象引用(IDOR)漏洞 测试方法: 1....存在不安全的直接对象引用(IDOR)漏洞 这个问题测试的时候需要app本身,而且需要Burp截断,截断后修改主体信息,看能否修改成功,这边有点像测试防篡改和防重放的测试。
每种计算机编程语言都要它独特的一套错误处理与调试机制,每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。...JavaScript同样如此,JavaScript定义了下列 7 种错误类型: 1、Error 错误 2、EvalError 全局错误 3、RangeError 引用错误 4、ReferenceError...一般就是操作的这个变量一些方法属性是不存在的。...比如这样一个报错:Uncaught ReferenceError: users is not defined Uncaught ReferenceError:用来表示错误类型,之后就是定位到具体的错误。...ReferenceError(引用错误) 对象表明一个不存在的变量被引用。当你尝试引用一个未被定义的变量时,将会抛出一个 ReferenceError引用错误 。
JS 暂时性死区 ES6 暂时性死区 引用 ES6 暂时性死区 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。...var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } 上面代码中,存在全局变量 tmp,但是块级作用域内...if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError...“暂时性死区”也意味着 typeof 不再是一个百分之百安全的操作。...引用 ECMAScript 6 入门——阮一峰 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147427.html原文链接:https://javaforall.cn
内存泄漏:堆内存中的长生命周期的对象持有短生命周期对象的引用,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是Java中内存泄露的根本原因。...Java提供了SoftReference类来实现软引用。 弱引用: 弱引用比起软引用具有更短的生命周期,垃圾收集器一旦发现了只具有弱引用的对象,不管当前内存是否足够,都会回收它的内存。...如果一个软引用(或弱引用,或虚引用)对象本身在引用队列中,就说明该引用对象所指向的对象被回收了。...当软引用(或弱引用,或虚引用)对象所指向的对象被回收了,那么这个引用对象本身就没有价值了,如果程序中存在大量的这类对象(注意,我们创建的软引用、弱引用、虚引用对象本身是个强引用,不会自动被gc回收),就会浪费内存...另外可以根据对象是否经常使用来判断选择软引用还是弱引用。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。
领取专属 10元无门槛券
手把手带您无忧上云