文件树android
A. 如何Golang开发Android应用
环境配置好复杂,我不得不唠叨几句。
需要下载golang1.4rc版,下载ndk,然后编译。 然后用go get 下载gobind这个工具, 然后,将写好的代码用gobind转化下,然后使用特殊的编译命令,将代码编译成.so文件,将生成的相关文件,放到android studio的项目中。然后java代码中,利用jni调用引用的代码。
... 好,接着往下看吧。
环境准备
一台Linux 64的机器
一个带有AndroidStudioIDE的开发机器
因为环境配置实在复杂,所以我们引入的docker。
docker pull codeskyblue/docker-goandroid
docker run --rm -ti codeskyblue/docker-goandroid bash
cd example; echo "view example projects
docker起来之后,什么就都配置好了,NDK啦,java啦,GO的环境变量了,等等,并且还预装了vim,gradle,tmux,git,syncthing,svn
开始写代码
写代码之前,先约定下目录结构
go的代码都放在src/golib下,编译使用make.bash编译脚本,看下这个文件树
.
|-- app.iml
|-- build.gradle
|-- libs/armeabi-v7a # go编译生成的so文件
| `-- libgojni.so
|-- main.go_tmpl # 一个模板文件,先不用管它
|-- make.bash # 编译脚本,用来生成.so和Java代码
`-- src
|-- golib
| |-- hi
| | |-- go_hi�0�2�0�2�0�2 # 自动生成的代码
| | | `-- go_hi.go
| | `-- hi.go # 需要编写的代码
| `-- main.go
`-- main
|-- AndroidManifest.xml
|-- java
| |-- go # 自动生成的代码
| | |-- Go.java
| | |-- Seq.java
| | `-- hi
| | `-- Hi.java
| `-- me/shengxiang/gohello # 主要的逻辑代码
| `-- MainActivity.java
`-- res
我已经写了一个例子,先直接搞下来
编译下,试试行不行(就算不行问题应该也不大,因为大问题都被我消灭了)
cd GoHello/app
./make.bash
../gradlew build
一切顺利的话在build/outputs/apk下应该可以看到app-debug.apk这个文件。(剧透下,这个文件只有800多K)
编译好的我放到qiniu上了,可以点击下载看看
下面可以尝试改改,我抛砖引玉说下
打开hi.go这个文件
hi.go的内容,比较简单,我们写Go代码主要就是这部分
// Package hi provides a function for saying hello.
package hi
import "fmt"
func Hello(name string) {
fmt.Printf("Hello, %s!\n", name)
return "(Go)World"
}
文件末尾添加下面这行代码
func Welcome(name string) string {
return fmt.Sprintf("Welcome %s to the go world", name)
}
使用./make.bash重新编译下
打开MainActivity.java 修改下OnClickListener事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = Hi.Welcome("yourname");
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
});
编译运行下,把生成的apk安装到手机上试试。
原理解读(有兴趣的接着看)
首先说下gobind这个工具。
go_hi/go_hi.go这个文件时通过gobind这个工具生成的,用来配合一个简单的程序,生成.so文件
// go_hi.go
package go_hi
import (
"golang.org/x/mobile/bind/seq"
"example/hi"
)
func proxy_Hello(out, in *seq.Buffer) {
param_name := in.ReadUTF16()
hi.Hello(param_name)
}
func init() {
seq.Register("hi", 1, proxy_Hello)
}
这个简单的程序内容是这样的
// main.go
package main
import (
"golang.org/x/mobile/app"
_ "golang.org/x/mobile/bind/java"
_ "example/hi/go_hi"
)
func main() {
app.Run(app.Callbacks{})
}
src/MyActivity.java文件内容是这样的
import ...
import go.Go; // 引入Go这个包
import go.hi.Hi; // gobind生成的代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Go.init(getApplicationContext()); // 初始化两个线程
Hi.Hello("world");
}
}
其中有一句Go.init(...)这里再看go.Go这个包是什么样子的
public final class Go {
// init loads libgojni.so and starts the runtime.
public static void init(Context context) {
... 判断该函数是否该执行的代码 -- 省略 --
System.loadLibrary("gojni"); // gojni需要这句
new Thread("GoMain") {
public void run() {
Go.run(); // run()是一个native方法
}
}.start();
Go.waitForRun(); // 这个也是一个native方法
// 这部分可以理解为,启动了一个后台线程不断的接收结果到缓存中。
new Thread("GoReceive") {
public void run() { Seq.receive(); }
}.start();
}
private static boolean running = false;
private static native void run();
private static native void waitForRun();
}
MyActivity.java中还有段代码是 Hi.Hello("world");,打开Hi.java路径在src/go/hi/Hi.java,这个文件也是gobind生成的,是用来给java方便的调用.so文件
// Hi.java
// File is generated by gobind. Do not edit.
package go.hi;
import go.Seq;
public abstract class Hi {
private Hi() {} // uninstantiable
public static void Hello(String name) {
go.Seq _in = new go.Seq();
go.Seq _out = new go.Seq();
_in.writeUTF16(name);
Seq.send(DESCRIPTOR, CALL_Hello, _in, _out); // 下面接着说
}
private static final int CALL_Hello = 1;
private static final String DESCRIPTOR = "hi";
}
Seq.send这部分实际上最终调用的是一段go代码
func Send(descriptor string, code int, req *C.uint8_t, reqlen C.size_t, res **C.uint8_t, reslen *C.size_t) {
fn := seq.Registry[descriptor][code]
in := new(seq.Buffer)
if reqlen > 0 {
in.Data = (*[maxSliceLen]byte)(unsafe.Pointer(req))[:reqlen]
}
out := new(seq.Buffer)
fn(out, in)
seqToBuf(res, reslen, out)
}
B. 如何Golang开发Android应用
如何Golang开发Android应用:
一丶准备
1.一台Linux 64的机器
2.一个带有AndroidStudioIDE的开发机器
因为环境配置实在复杂,所以引入的docker。
docker pull codeskyblue/docker-goandroid
docker run --rm -ti codeskyblue/docker-goandroid bash
cd example; echo "view example projects
docker起来之后,什么就都配置好了,NDK,java,GO的环境变量了,等等,并且还预装了vim,gradle,tmux,git,syncthing,svn
二丶代码
1.写代码之前,先约定下目录结构
go的代码都放在src/golib下,编译使用make.bash编译脚本,看下这个文件树
.
|-- app.iml
|-- build.gradle
|-- libs/armeabi-v7a # go编译生成的so文件
| `-- libgojni.so
|-- main.go_tmpl # 一个模板文件,先不用管它
|-- make.bash # 编译脚本,用来生成.so和Java代码
`-- src
|-- golib
| |-- hi
| | |-- go_hi֞֞֞ # 自动生成的代码
| | | `-- go_hi.go
| | `-- hi.go # 需要编写的代码
| `-- main.go
`-- main
|-- AndroidManifest.xml
|-- java
| |-- go # 自动生成的代码
| | |-- Go.java
| | |-- Seq.java
| | `-- hi
| | `-- Hi.java
| `-- me/shengxiang/gohello # 主要的逻辑代码
| `-- MainActivity.java֞֞֞
`-- res
2.写了一个例子
git clone
3.编译下,试试行不行(就算不行问题应该也不大,因为大问题都被消灭了)
cd GoHello/app
./make.bash
../gradlew build
4.一切顺利的话在build/outputs/apk下应该可以看到app-debug.apk这个文件。
编译好的放到qiniu上了,可以点击下载看看
下面可以尝试改改
打开hi.go这个文件
hi.go的内容,比较简单,写Go代码主要就是这部分
// Package hi provides a function for saying hello.
package hi
import "fmt"
func Hello(name string) {
fmt.Printf("Hello, %s!
", name)
return "(Go)World"
}
5.文件末尾添加下面这行代码
func Welcome(name string) string {
return fmt.Sprintf("Welcome %s to the go world", name)
}
使用./make.bash重新编译下
6.打开MainActivity.java修改下OnClickListener事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = Hi.Welcome("yourname");
Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
}
});
编译运行下,把生成的apk安装到手机上试试。
C. 6.2、Android Studio 添加编译依赖
文章摘要
1、 三种依赖类型
2、库依赖关系配置
3、远程仓库
4、查看依赖关系树
英文文献
Android Studio中的摇篮构建系统可以很容易地包括外部的二进制文件或其他库模块到您的构建与依赖。该依赖性可以位于您的计算机上或远程仓库中,他们宣布任何传递依赖将自动包括在内。
要添加一个依赖于你的项目,指定诸如依赖配置compile在dependencies您的块build.gradle文件。
例如,下面build.gradle为应用模块文件包括三种不同类型的依赖关系:
每个这些要求不同类型的依赖关系如下:
此声明一有依赖性 的Android库模块 名为“在MyLibrary”(此名称必须定义为库名称相匹配include你的 settings.gradle 文件)。它需要构建系统编译库模块与应用模块,并在您的APK所产生的AAR文件。
由于Gradle读取相对路径的build.gradle 文件,这告诉构建系统添加您的项目内的所有JAR文件 mole_name/libs/的目录的依赖。
或者,您可以指定单独的文件如下:
这实际上是以下简写:
这宣告了“应用程序魔”库的12.3版本的依赖,在“code.example.android”命名空间组内。
内侧dependencies块,可以声明使用几种不同的一个库依赖依赖关系配置(诸如compile上面示出)。每个相关配置提供了摇篮有关如何使用图书馆不同的指令。下面的列表描述了每个可使用在你的Android项目库依赖的配置。
以上配置适用于项目的主要来源集,它适用于所有的构建变种。
如果你不是想声明的依赖只有特定的 构建变量 源设置或更改一个 测试源设置 ,你必须利用配置名称以及与构建变量或测试源集的名称前缀它。
例如,在添加compile
依赖关系只为您的“免费”产品的风味(使用远程二进制依赖),它看起来像这样:
但是,如果你想添加一个依赖于结合了产品的风味变体和构建类型,那么你必须初始化的配置名称configurations块。下面的示例增加了一个apk依赖于你的“freeDebug”打造变种(使用本地二进制依赖):
要添加compile为本地测试和仪表测试的依赖性,它看起来像这样:
如果你的 库模块提供了多个变种 ,你可以添加不同的库变体像这样不同的应用程序变量:
当你的依赖比当地的图书馆或文件树以外的东西,摇篮会在哪个在线存储库中指定的文件 repositories的块build.gradle文件。
默认情况下,新的Android Studio项目申报JCenter作为该项目的顶级存储库位置build.gradle的文件,如下图所示:
如果你想从Maven的中央仓库的东西,然后再添加 mavenCentral(),或本地存储库使用mavenLocal():
参考配置:
有些直接依赖可能有自己的依赖。这些被称为 传递依赖 。而不是要求您手动声明每个传递依赖,摇篮自动收集,并增加了它们。为了形象化两个项目的直接和传递依赖,对于摇篮的Android插件提供了生成依赖关系树为每个摇篮任务 构建变量 和 测试源集合 。
要生成此报告,步骤如下:
下面的示例报告显示调试构建变量的依赖关系树,包括前面例子中的本地库模块依赖和远程依赖性。
D. android系统的手机目录各个文件夹代表什么例如acct
1、acct文件夹:根目录/acct/ ,系统回收站,误删除的系统文件恢复ACCT计算机语言,系统调用禁止/启用系统记录进程信息。
2、cache文件夹:缓存(cache) 文件。只是内存中少部分数据的复制品,先于内存与CPU交换数据,因此速率很快。
3、config文件夹:(计算机系统)配置。如:系统里的config.sys就是系统自动配置文件,它是在用户开机这段时间对计算机进行初始化设置,也就是用户对系统的设置都由它来对计算机进行恢复。
4、system:Android 系统文件。主要包括usr(用户文件夹,包含共享、键盘布局、时间区域文件等) ,app(常规下载的应用程序,这些 apk 包都是受保护的), lib(系统底层库,如平台运行时库等)等。
5、etc:系统主要配置文件,比如APN接入点设置等核心配置等。
6、data:用户程序目录。存储手机系统文件和安装软件的数据文件,不能随便删除。
E. Android项目目录哪个视图中的树形结构和实际工程文件夹存储相同
Android视图:app/manifests
Project视图对应的文件夹:app/src/main/AndroidManifest.xml
Android视图:app/java
Project视图对应的文件夹:app/src/main/java
Android视图:app/cpp
Project视图对应的文件夹:app/src/main/jni
Android视图:app/aidl
Project视图对应的文件夹:app/src/main/aidl
Android视图:app/renderscript
Project视图对应的文件夹:app/src/main/rs