fuseandroid
⑴ 【译】Fuse入门(二)
官网原文: Fuse
预览时,Fuse会在手持设备上创建一个壳(shell)程序,与在运行在桌面系统的Fuse后台程序相连,从而快速显示你对项目做的所有更改。但是,如果你去参加一个会议,或者给客户去秀秀,手持设备要断开与开发环境的连接时,你就需要将项目输出到你要运行的设备上。
首先,你需要有一台运行OS X系统并安装了Xcode的Mac,其次,你还要有一个苹果开发者账号,都齐了,就在项目目录里键入下面的命令:
该命令会在Xcode中打开建成的项目,在可用输出目标的下拉菜单里选择你的设备型号,然后点击“运行”按钮,App就会部明伍署并运行在你的设备上了。
首先确定Android SDK/NDK都安装好了(在安卓上预览也需要安装这些,如没有,在命令行输入: fuse install android ),然后在命令行的项目目录中键入:
你的项目就已部署在与系统相连的安卓设备上了。
Fuse主要被用来做这么两类事儿:
这两类事儿都是通过UX标记来进行主体表唤槐述的。
UX标记实际上是基于XML的文件格式,有点XML经验的用户都能轻松上手。详细的功能、深度的解读,请参考 UX标记文档 。
单独创建应用或原型,使用 <app> 标签:
在 <App> 标签内,可以嵌入任何 Node 、 Behavior 或 Theme 这些类型的标签。上面的例子简单的用默认的字体显示了一段文字。
App 标签自身负责引导整个App,并处理应用程序的生命周期和主题事务。
使用 Background 属性设置App根视图的背景色。
UX文档都是由若干XML标签组成,每个可用的UX标签都相当于一个用Uno编码的类,每个标签还对应一个或多个runtime对象。
这些可用的标签(类)可分为如下类别:
App 提供一个主题设置,Theme定义了各标准组件的外观,如下列所示:
如不指定, App 会默认一个缺省设定叫做 GraphicsTheme 。
当使用 NativeTheme 时, Fuse会应用目标平台的原生控制,如下所示:
此例中,所有显示的控制激链或器都采用iOS和安卓的原生样式,而桌面预览中并不会出现。
GraphicsTheme 是App的缺省主题,它能让你的App在所有平台上都保持一致的外观,除了这些:
使用 GrapicsTheme 主题的好处是:
因为 GraphicsTheme 是缺省值,所以无需特意写上,但如果实在需要,那就看这儿:
或者这样:
扩展定制 GraphicsTheme 也是可行的,比如要给 Slider 滑动条和 Button 按钮定义特别的外观。
自定义 GraphicsTheme 的方式是,把它当成一个基础类来使用, 象这样:
这样的话,在App标签里要这么写:
也可以给它创建一个全局别名,像这样:
那样的话,在App标签里要这么写:
这个 BasicTheme 主题实际上就是以 GraphicsTheme 为基础,加上一些缺省的Fuse页面,并且在设计上采用了谷歌的 material design 设计理念。
如果你设计UI时需要一个起点,该主题会帮到你并在全平台上保持一致的外观。
⑵ android 为什么要用fuse
Android FUSE 的设计目的就是为了把/data分区映射成一个内部储存,使得手机的内部储存和/data分区激扒或可以共用。
还有就是,比如我要支持一个新的文件系统,比如支持NTFS,要在内核中写代码实现,而不巧的是内核态的代码非常的难写,非常的难调试。。。so。。导致整个工程都拖延在这里了此槐,但是呢。明伍。用户空间中编写和调试的难度小,所以非常方便,用C++ Java写都可以。
作者:何文力
⑶ 如何恢复安卓中 /dev/fuse 的文件
步骤一:首先要把手机和电脑连接,判断手机是否能被电脑识别。 步骤二谨唤码:选择合适的数据恢复工具 步骤三:选择合适祥哪的数据恢复方法 步骤五:在扫描结果中查找需要恢复的文件 步骤六:将需要恢复的文件拷贝出来 手机存储卡空间上的文件误删除链族之后,...
⑷ 如何正确获得Android内外SD卡路径
/**
* 获取手机自身内存路径
*
*/
public static String getPhoneCardPath(){
return Environment.getDataDirectory().getPath();
}
/**
* 获取sd卡路径
* 双sd卡时,根据”设置“里面的数据存储位置选择,获得的是内置sd卡或外置sd卡
* @return
*/
public static String getNormalSDCardPath(){
return Environment.getExternalStorageDirectory().getPath();
}
/**
* 获取sd卡路径
* 双sd卡时,获得的是外置sd卡
* @return
*/
public static String getSDCardPath() {
String cmd = "cat /proc/mounts";
Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象
BufferedInputStream in=null;
BufferedReader inBr=null;
try {
Process p = run.exec(cmd);// 启动另一个进程来执行命令
in = new BufferedInputStream(p.getInputStream());
inBr = new BufferedReader(new InputStreamReader(in));
String lineStr;
while ((lineStr = inBr.readLine()) != null) {
// 获得命令执行后在控制台的输出信息
Log.i("CommonUtil:getSDCardPath", lineStr);
if (lineStr.contains("sdcard")
&& lineStr.contains(".android_secure")) {
String[] strArray = lineStr.split(" ");
if (strArray != null && strArray.length >= 5) {
String result = strArray[1].replace("/.android_secure",
"");
return result;
}
}
// 检查命令是否执行失败。
if (p.waitFor() != 0 && p.exitValue() == 1) {
// p.exitValue()==0表示正常结束,1:非正常结束
Log.e("CommonUtil:getSDCardPath", "命令执行失败!");
}
}
} catch (Exception e) {
Log.e("CommonUtil:getSDCardPath", e.toString());
//return Environment.getExternalStorageDirectory().getPath();
}finally{
try {
if(in!=null){
in.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(inBr!=null){
inBr.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return Environment.getExternalStorageDirectory().getPath();
}
//查看所有的sd路径
public String getSDCardPathEx(){
String mount = new String();
try {
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("mount");
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
String line;
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
if (line.contains("secure")) continue;
if (line.contains("asec")) continue;
if (line.contains("fat")) {
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount = mount.concat("*" + columns[1] + "\n");
}
} else if (line.contains("fuse")) {
String columns[] = line.split(" ");
if (columns != null && columns.length > 1) {
mount = mount.concat(columns[1] + "\n");
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mount;
}
//获取当前路径,可用空间
public static long getAvailableSize(String path){
try{
File base = new File(path);
StatFs stat = new StatFs(base.getPath());
long nAvailableCount = stat.getBlockSize() * ((long) stat.getAvailableBlocks());
return nAvailableCount;
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
⑸ android 4.4的sdcardfs是什么它大体是怎样工作的
是三星基于wrapfs,进行二次开发的产物。更准确的说,是重写了fuse.把fuse在用户态(在Android中是sdcard这个可执行文件)。闷绝工作原理是,由挂载触发(mount -t sdcardfs... 或者写在init.rc中也可以)。内部会起一个线程通过inotify监控packages.list这个文件。该文件保存了所有安装APK的包名,uid,gid,路径名等,内虚罩睁部使用一个hashlist来保存。发现有新的包安装后,会去重新reload这个文件,比对包名。读取其中的信息,开始修改对应inode节点的属性,并传递给下一层的具体文件系统。其实本质上理解了fuse,就理解了sdcardfs.相对于fuse,减少了用户态和内核态之间交互数据的过程。在读写大文件时,性能提升差岁显着。
⑹ Android4.4不能写外卡了吗!!!
网上看到的:Google的Android 4.4对外卡的写操作增加了如下两条限制:迟晌第段手一握旦嫌是通过用户态文件系统fuse对外卡的写权限进行了限制
⑺ android fuse和vold的区别
按启动顺绝慎序,如下:
service vold /system/bin/vold
class core
socket vold stream 0660 root mount
service installd /system/bin/installd
class main
socket installd stream 600 system system
service sdcard /system/bin/sdcard -u 1023 -g 1023 -l /并核敬data/media /mnt/氏孙shell/emulated
class late_start