大恕家麦芽糖串串
哥伦比亚水洗Supremo
卡杜拉种,麦德林,海拔1550-1700,中烘
可能尝到的味道:麦芽糖、蜜饯、杏子
非常的饱,鸡胸一如既往的没有味道。
android并没有提供一个一致性的统一的修改某个程序缺省字体的地方,于是网络上的方法:
这三个方法第一个实在太不体现智能了。而第二个是基本是在做死。第三个不错,我一开始也是使用这个方法的。但在实际使用中遇到了如果动态生成的控件,比如listview中由adapter生成的控件是无法在一开始就被枚举到,于是也就无法修改字体。如果放到onDraw里,是很不现实的会严重影响性能。如果放到adapter中的话,就与第一种或第二种没什么不同了,总不能每一个adapter都给个这个函数吧?如果自己生成一个BaseAdapter的话,那不其它类型的adapter就不能用了。
Android本身有提供checkPermission(String, String)
这一系列的函数来检查某个程序是否有某个权限。但这系列数实际上是在检查AndroidManifest里那user-permission
里是否写上了某个权限。大家都知道,这根本行不通,因为安装时那些权限根本没地方让用户部分接受。用户要么全接受一个普通的程序居然有定位读通讯录删除短信这种权限,要么就完全的不能装这个程序了。在一些android机子上,比如华为,会有权限管理这一项。里面可以将程序的一些权限关掉,比如定位、读通讯录、相机还有录音之类的。这个设置就无法通过checkPermission(String, String)
这一系列的函数来得到正确的结果了。
类别 | 名称 | 重量 |
---|---|---|
锅 | MSR 1.7升锅 | 304 |
MSR 2.5升锅 | 430 | |
火枫 集热锅 | 205 | |
铝水壶 | 147 | |
1升铝锅 | 53 | |
1.5升 铝锅 | 82 | |
2升 铝锅 | 101 | |
3升 铝锅 | 152 | |
小煎盘 | 69 | |
大煎盘 | 115 | |
钛锅把 | 24 | |
铝锅把 | 38 | |
锡箔锅盖 | 5 | |
铝锅把(亮面) | 44 | |
炉头 | MSR 炉头 | 177 |
火枫 大黄蜂 | 48 | |
长罐转换头 | 30 | |
火枫 光芒分体锅头 | 280 | |
三头酒精炉 | 70 | |
树哥双层柴火炉 | ||
树哥双层酒精炉加炉架 | ||
钛柴火炉 | 123 | |
钛柴火炉酒精棉球支架(两根) | 16 | |
Tiji钛双层柴火炉 | 147 | |
FOX 折叠锯子 | 161 | |
金属棉球酒精垫 | 5 | |
树哥皇冠酒精棉球炉 | 11 | |
气罐架 | 20 | |
木棉球酒精垫 | 13 | |
小姜手作酒精炉 | 14.2 | |
bushbuddy柴火炉 | 181 | |
水具 | MSR4升水袋 | 166 |
膳魔师FEK800 | 355 | |
虎牌 480 | 193 | |
鸭嘴兽1升水袋(奶头盖子) | 35 | |
鸭嘴兽1升水袋(普通盖子) | 25 | |
鸭嘴兽2升水袋 | 35 | |
红酒水袋 | 50 | |
鸭嘴兽水袋管 | 77 | |
FlodACup 折叠水杯 | 50 | |
睡觉的家伙 | HW LCW300 睡袋 | 512 |
田野热核 充绒650 睡袋 | 872 | |
冰焰 充绒500 睡袋 | 815 | |
TAR XLITE 充气垫 | 353 | |
TAR 银搓 | 215 | |
山之泉蛋槽 | 189 | |
迪卡侬瑜珈垫 | 88 | |
SEATTOSUMMIT Nano 蚊帐 | 95 | |
AR气泵 | 84 | |
NodWand气泵 | 58 | |
酱铺2人cuben金字塔 | 581 | |
懒猫五方塔 | 566 | |
AMK 救生毯 | 82 | |
AMK Bivvy | 101 | |
钛地钉(长) | 15 | |
迪卡侬方钉 | 11 | |
酱铺发泡垫 | 224 | |
钛空心地丁 | 8.8 | |
背包 | 花岗岩 烈火 | 1350 |
花岗岩 晴朗 | 1030 | |
ULA EPIC | 1052 | |
SEATOSUMMIT 35升大河防水袋 | 237 | |
SEATOSUMMIT 60升大河防水袋 | 316 | |
多特水壶腰包 | 174 | |
收线夹 | 7 | |
胸扣 | 9 | |
MOLLE扣 | 7 | |
翔野MOLLE小腰带包 | 99 | |
翔野MOLLE大腰带包 | 174 | |
翔野MOLLE水壶包 | 113 | |
强氧魔怪 | 105 | |
强氧色包MINI | 251 | |
酱铺三明治(含两个腰包一个肩包) | 1010 | |
电器 | 米勒 ML102 | 33 |
米勒 ML202 | 60 | |
18650电池 | 47 | |
长天 M1200E | 27 | |
长天 M241A | 40 | |
MOTO DEFY 导航用 | 114 | |
华为荣耀3C | 137 | |
品胜电霸1000 | 300 | |
曼福图三角架 | 162 | |
索尼Alpha5000 | 414 | |
小米两万毫安充电宝 | 321 | |
伏来阳太阳能板 | 207 | |
NOKIA 1210 黑白机 | 76 | |
小米双头充电器 | 61 | |
garmin forunner 935 | 50 | |
华为充电5V1A | 28 | |
短苹果线 | 8 | |
iPhone11 | 211 | |
紫米Type-C充电线+Lightning转接头 | 30 | |
Apple Watch充电器 | 24 | |
衣服 | cloudveil 防风抓绒 | 341 |
迪卡侬羊毛T恤 | 163 | |
迪卡侬普通T性 | 127 | |
迪卡侬绒里长袖 | 263 | |
迪卡侬速干长袖 | 186 | |
迪卡侬49抓绒 | 293 | |
迪卡侬速干短裤 | 229 | |
迪卡侬速干长裤 | 322 | |
迪卡侬七分裤 | 134 | |
迪卡侬紧身绒裤 | 195 | |
迪卡侬抓绒裤 | 165 | |
迪卡侬防风手套 | 82 | |
迪卡侬空顶帽 | 41 | |
IB羊毛袜子 | 73 | |
outdome羊毛袜子 | 60 | |
羊毛帽子 | 78 | |
buff windstopper头巾 | 79 | |
始祖鸟帽 | 64 | |
带帽檐头巾 | 59 | |
smartwood 袜子 | 68 | |
始祖鸟冲锋衣 | 400 | |
黑冰羽绒脚套 | 155 | |
暖宝宝手套 | 36 | |
HW羽绒短袖 | 230 | |
天石羽绒裤 | 258 | |
HW羽绒服 | 335 | |
迪卡侬皮肤风衣 | 99 | |
buff太阳帽 | 30 | |
老鼠神衣 | 272 | |
三峰裙子 | 72 | |
冲锋裤 | 268 | |
鞋子 | 510 | 914 |
杂项 | 救生哨加打火棒 | 33 |
手表加指南针 | 46 | |
MSR 毛巾 | 41 | |
PATAGONIA 腰带 | 132 | |
安全头盔 | 330 | |
折叠碗 | 49 | |
HW小椅子 | 368 | |
汽灯 | 151 | |
HWB膑骨加压带 | 54 | |
超轻毛巾 | 6 | |
便便铲 | 16 | |
防沙套 | 40 | |
防水&收纳袋 | TPU中号防水袋 | 34 |
TPU大号防水袋 | 67 | |
花岗岩粗苯防水袋18升 | 24 | |
酱铺粗苯收纳袋 | 9 | |
SEATOSUMMIT EVENT防水袋 | 89 | |
HW防水袋 | 47 | |
蜂鸟6升防水袋 | 44 | |
三峰收纳袋(中号) | 27 | |
三峰收纳袋(小号) | 16 | |
三峰收纳袋(大号) | 36 | |
三峰网袋(小号) | 8 | |
三峰网袋(中号) | 13 | |
三峰网袋(大号) | 17 | |
食物名称 | 口感 | 重量 |
---|---|---|
科尔沁风干牛肉(原味) | 口感不错,香脆。但有点过咸,当路粮吃可以,当配菜不行。当路粮吃时会有大量饮水的问题 | |
宝矿力水特冲剂 | 口感不错,与成品水一样,很清爽 | |
NUUN可乐味 | 真是难喝到奇皅 | |
H5ZERO柚子味 | 真是不错,可以再喝 | |
牛肉泡馍 | 酱包放一半味道非常好,吃不太饱,要配其它主食 | 178 |
糊辣汤 | 一小包可以泡一升这种子,可以吃饱的感觉。可加紫菜豆腐 | 90 |
士力架 | 天冷时很好吃 | |
羊肉泡馍 | 酱包放一半 | 192 |
千石谷熟化米 | 真的是非常难吃的东西,以后不要买了 | 124 |
各种意大利面 | 分量很足,但太费火了,不合适重装户外,一两日吃吃可以 | |
维维嚼益嚼(苹果味) | 味道不错,有苹果的味道,口感与果条很像 | |
维维嚼益嚼(芒果椰子) | 有很浓的芒果味道,椰子味道没吃出来 | |
维维嚼益嚼(红枣) | 枣味非常浓,很像月饼 | |
维维嚼益嚼(葡萄干) | 味道不好吃,相对其它口味来说味道有点惨 | |
维维嚼益嚼(山楂) | 味道好像红枣 | |
KOKA 原味鸡汤面 | 味道很清爽,鸡汤味很好,吃过不会口干 | |
7COIN 泰式冬荫功风味 | 很浓的柠檬酸味,口味有点重,一点点的辣 | |
喜达(sedoop)捞面原味 | 原味就是一种冬荫功的感觉,不过捞面看着美好,户外做起来要准备两个碗也是麻烦了点。 | |
尾西 | 来自日本,于是很合适中国人的口味,比较清淡,就是份量不太足 | |
类别 | 名称 | 重量 |
---|---|---|
1.5升 铝锅 | 82 | |
钛锅把 | 24 | |
锡箔锅盖 | 5 | |
树哥皇冠酒精棉球炉 | 11 | |
木棉球酒精垫 | 13 | |
膳魔师FEK800 | 355 | |
鸭嘴兽1升水袋(奶头盖子) | 35 | |
鸭嘴兽2升水袋 | 35 | |
冰焰 充绒500 睡袋 | 815 | |
TAR 银搓 | 215 | |
迪卡侬瑜珈垫 | 88 | |
懒猫五方塔 | 566 | |
救生毯 | 82 | |
钛地钉(长) | 90 | |
ULA EPIC | 1052 | |
SEATOSUMMIT 60升大河防水袋 | 316 | |
强氧魔怪 | 105 | |
电器 | 米勒 ML102 | 34 |
18650电池 | 188 | |
长天 M1200E | 27 | |
索尼Alpha5000 | 414 | |
NOKIA 1210 黑白机 | 76 | |
衣服 | cloudveil 防风抓绒 | 341 |
迪卡侬速干短裤 | 229 | |
迪卡侬防风手套 | 82 | |
outdome羊毛袜子 | 60 | |
羊毛帽子 | 78 | |
smartwood 袜子 | 68 | |
始祖鸟冲锋衣 | 400 | |
黑冰羽绒脚套 | 155 | |
天石羽绒裤 | 258 | |
HW羽绒服 | 335 | |
杂项 | 救生哨加打火棒 | 33 |
手表加指南针 | 46 | |
MSR 毛巾 | 41 | |
花岗岩粗苯防水袋18升 | 48 | |
酱铺粗苯收纳袋 | 9 | |
三峰网袋(中号) | 13 | |
三峰网袋(大号) | 17 | |
6841 | 6841 | 6841 |
类别 | 名称 | 重量 |
---|---|---|
锅 | MSR 1.7升锅 | 304 |
炉头 | MSR 炉头 | 177 |
水具 | 膳魔师FEK800 | 355 |
鸭嘴兽1升水袋(奶头盖子) | 35 | |
鸭嘴兽2升水袋 | 35 | |
睡袋的家伙 | 冰焰 充绒500 睡袋 | 815 |
TAR 银搓 | 215 | |
迪卡侬瑜珈垫 | 88 | |
懒猫五方塔 | 566 | |
救生毯 | 82 | |
钛地钉(长)\* 6 | 90 | |
背包 | ULA EPIC | 1052 |
SEATOSUMMIT 60升大河防水袋 | 316 | |
强氧魔怪 | 105 | |
电器 | 米勒 ML102 | 34 |
18650电池 \* 4 | 188 | |
NOKIA短USB线 | 10 | |
MOTO DEFY | 114 | |
华为荣耀3C | 137 | |
索尼Alpha5000 | 414 | |
衣服 | cloudveil 防风抓绒 | 341 |
迪卡侬羊毛T恤 | 163 | |
迪卡侬绒里长袖 | 263 | |
迪卡侬速干长裤 | 320 | |
迪卡侬紧身绒裤 | 195 | |
迪卡侬防风手套 | 82 | |
outdome羊毛袜子 | 60 | |
羊毛帽子 | 78 | |
smartwood 袜子 | 68 | |
始祖鸟冲锋衣 | 340 | |
stoic冲锋裤 | 229 | |
黑冰羽绒脚套 | 155 | |
天石羽绒裤 | 258 | |
HW羽绒服 | 335 | |
鞋子 | 510 | 914 |
杂项 | 救生哨加打火棒 | 33 |
手表加指南针 | 46 | |
带帽檐头巾 | 59 | |
MSR 毛巾 | 41 | |
折叠碗 | 49 | |
防水袋 | 花岗岩粗苯防水袋18升 \* 2 | 48 |
酱铺粗苯收纳袋 | 9 | |
三峰网袋(大号) | 17 | |
9235 |
java方法:public static native boolean isLoggable(String tag, int level)
JNI方法:static jboolean androidutilLogisLoggable(JNIEnv* env, jobject clazz, jstring tag, jint level)
Java类型 | JNI类型 |
---|---|
java.lang.Class | jclass |
java.lang.String | jstring |
java.lang.Throwable | jthrowable |
object[] | jobjectArray |
boolean[] | jbooleanArray |
byte[] | jbyteArray |
char[] | jcharArray |
short[] | jshortArray |
int[] | jintArray |
long[] | jlongArray |
float[] | jfloatArray |
double[] | jdoubleArray |
Java类型 | 类型签名 |
---|---|
boolean | Z |
byte | B |
chat | C |
long | J |
float | F |
double | D |
short | S |
int | I |
类 | L全限定类名; |
数组 | [元素类型签名 |
访问对象域 | 调用实例方法 | 访问静态域 | 调用静态方法 |
---|---|---|---|
GetFieldID | GetMethodID | GetStaticFieldID | GetStaticMethodID |
Get |
Call |
GetStatic |
CallStatic |
Set |
CallNonvirtual |
SetStatic |
引用类型 | 是否增加引用计数 | 作用范围 | 生命周期 |
---|---|---|---|
局部引用 | 可以增加引用计数 | 本线程 | 一次Native调用,只在创建它的Native方法的线程中有效,并且只在Native方法的一次调用中有效,在方法返回后,被回收 |
全局引用 | 可以增加引用计数 | 多线程 | 多个Native方法,生命周期到显式释放。通过引用JNI函数NewGlobalRef创建,通过DeleteGlobalRef释放 |
弱全局引用 | 不能增加引用计数 | 多线程 | 生命周期到显式释放。通过NewWeakGlobalRef创建,通过DeleteWeakGlobalRef释放,通过IsSameObject判断是否被回收 |
if (env->isSameObject(weakref, NULL) == JNITRUE) 那么引用被释放
全局引用,默认不能超过2000个。如果超过,在logcat中会看到”GREF overflow”
检查异常的方法有:
检查到异常后必须予以处理:
JNI异常处理函数 | 功能描述 |
---|---|
Throw | 抛出现有异常 |
ThrowNew | 抛出新的异常 |
ExceptionOccurred | 判断是否发生异常,并获得异常的引用 |
ExceptionCheck | 判断是否发生异常 |
ExceptionDescribe | 异常堆栈信息 |
ExceptionClear | 清除一个未处理的异常 |
FatalError | 严重错误,退出 |
Trigger关键字 | 描述 |
---|---|
boot | /init.conf被加载后的第一个trigger |
property: |
属性值改变为指定值时 |
device-added- |
添加设备时触发 |
device-removed- |
移除设备时触发 |
service-exited- |
指定服务存在时 |
Command关键字 | 描述 |
---|---|
exec |
执行路径为 |
export |
设置系统全局环境变量 |
ifup |
使用ifup启动名为 |
import |
解析导入的init配置文件,扩展当前的配置 |
hostname |
设置主机名 |
chdir |
切换工作目录 |
chmod |
修改文件访问权限 |
chown |
修改文件所有者和组 |
chroot |
改变程序执行所参考的根目录 |
classstart |
启动指定类别的所有服务 |
classstop |
停止指定类别的所有服务 |
domainname |
设置域名 |
insmod |
加载路径为 |
mkdir |
创建路径为 |
mount |
挂载设备 |
setkey | 暂时不可用 |
setprop |
设置系统属性 |
setrlimit |
设置资源限制,resource是当前要限制的资源,cur是软限制,max是硬限制 |
start |
启动指定服务 |
stop |
停止指定服务 |
symlink |
创建指向 |
sysclktz |
设置系统时钟基准 |
trigger |
触发一个事件 |
write |
打开路径为 |
Option关键字 | 描述 |
---|---|
critial | 核心服务,在一定时间内退出多次,将导致系统重启到recovery mode |
disabled | 开机时禁用此服务,即开机时不会自动启动此服务,但是可以手动启动 |
setenv |
为服务设置环境变量 |
socket |
创建一个名为/dev/socket/ |
类型type的值为dgram或stream。perm表示该socket的访问权限; | |
user和group表示该socket所属的用户各组,这两个参数默认为0 | |
user |
执行服务前切换到用户 |
group |
执行服务前切换到组 |
oneshot | 服务只启动一次,一旦关闭就不能再启动 |
class |
为服务指定一个类别,默认为default, 同一类别的服务必须一起启动和停止 |
onrestart |
当服务重启时,执行一个Command |
init.c中的executeonecommand, servicestart
init.c -> main -> actionforeachtrigger -> builtins.c中的doclassstart -> servicestartifnotdisabled
init.c -> main -> propertyinit() 属性服务内存共享区分配 -> propertyloadbootdefaults加载/default.prop文件中的属性 -> propertyserviceinit -> queuepropertytriggers
启动zygote虚拟机,通过属性系统获取虚拟机配置信息,调用JNICreateJavaVM方法创建虚拟机
注册JNI方法,registerjniprocs
AndroidRuntime:start -> CallStaticVoidMethod -> ZygoteInit的main 进入Java环境
处理Home启动请求
ActivityManagerService.systemReady -> ActivityStack.resumeTopActivityLocked -> ActivityManagerService.startHomeActivityLocked -> ActivityStack.startActivityLocked -> ActivityStack.startActivityUncheckedLocked -> other startActivityLocked -> other resumeTopActivityLocked -> startSpecificActivityLocked -> startProcessLocked -> Process.start(“android.app.ActivityThread”) -> startViaZygote -> zygoteSendArgsAndGetResult -> Socket -> zygote -> runOnce -> handleChildProc -> android.app.ActivityThread.main
初始化Binder通信
将自身注册为Context管理者
循环处理IPC请求
Server启动
Binder在Native中的实现
Binder在Java层中的实现
Java系统服务注册过程
BinderInternal.getContextObject -> IBinder -> ServiceManagerNative.asInteface -> sServiceManager -> addService
Client获取服务代理
Client调用Java系统服务的方法
AIDL
adb push -> adb install -r -l -s -> adb uninstall
Google Market、PackageInstaller.apk、第三方安装界面
PackageManager及其子类、adb与pm命令 -> binder通信 -> PackageManagerService方法
PackageManagerService及其相关类 Setting、Installer、FileObserver、DefaultContainerService
uid >= FIRSTAPPLICATIONUID 或者 uid < FIRSTAPPLICATIONUID,FISTAPPLICATIONUID < 10000为系统程序UID。
PackageManager的hasSystemFeature, getSystemAvailableFeatures
FileObserver监控
scanDirLI
ActivityThread:管理应用程序所在进程的主线程的执行调度和运行Activities,broadcast
Instrumentation:应用程序测量工具基类,用于监控系统与应用程序间的交互
ContextImpl:context的通用实现类
Context2: 可以获取应用程序运行环境中的一些全局信息的接口
Application:一个可以维护全局的应用程序状态的基类
Launcher.onClick -> Launcher.startActivitySafely -> Launcher.startActivity -> Launch.parent.startActivity -> Activity.startActivityForResult(requestCode = -1) -> Instrumentation.execStartActivity -> ActivityManagerProxy.startActivity -> BinderProxy.transact(STARTACTIVITYTRANSACTION)
ActivityManagerService.startActivityMayWait -> ActivityStack.startActivityLock -> ActivityStack.startActivityUncheckedLocked -> ActivityStack.startActivityLocked -> ActivityStack.resumeTopActivity
ActivityManagerService.startActivityMayWait
int index = indexOfTokenLocked -> resultCode = mHistory.get(index) -> sendActivityResultLocked
FLAGACTIVITYNEWTASK:
用户行为导致Activity切换 -> 回调Activity.onUserLeaveHint
可利用Task:
启动Activity的第二个阶段为Pause
启动应用程序进程
加载应用程序Activity
显示Activity
ActivityStack.realStartActivityLocked:加载Activity,onCreate,onStart,onResume。会通过WindowManagerService冻结屏幕并设置Activity可见。
handleLaunchActivity -> performLaunchActivity -> newActivity -> makeApplication -> init -> attach -> callActivityOnCreate -> performCreate -> onCreate -> performStart -> callActivityOnStart -> onStart -> callActivityOnPostCreate -> onPostCreate
handleResumeActivity -> performResumeActivity -> onResume 控制可见性,如果在onResume时,又启动另一个Activity则窗口变不可见,黑屏可能由此来。onResume之前可能会有onNewIntent与onActivityResult调用
如果当前Activity处于stop状态,onRestart -> onStart -> onResume -》onPostResme
Activity.finish只是标志一下Activity处于完成的状态,会在IdleHandle线程中销毁
停止源Activity,在目标Activity的onCreate、onStart、onResume、activityIdleInternal执行后,开始停止源Activity。
非隐藏进程:
/sys/module/lowmemorykiller/paramerters/adj 优先级数
/sys/module/lowmemorykiller/paramerters/minfree 对应的内存阀值
lowmemshrink: