mac编译android源码
Ⅰ Mac 编译 XGBoost for Android
xgboost 的官方源码: https://github.com/dmlc/xgboost
因为 mac 已经使用 clang 代替 gcc,不支持 OpenMp,需要先安装相关库: brew install libomp
安装 NDK 最新版本,本次使用 NDK-r16b
确保 clang 版本支持-fopenmp 参数
Mac OS 版本 10.15+
以下是本机环境,通过 brew config 查看
创建 build_32.sh 脚本:
在源码根目录下创建 build_android 目录,并在目录下执行脚本:
源码根目录 /lib 下,会产生 libxgboost.so 库
将近 60MB... 囧rz
源码目录下,demo/c-api 即为 C 语音版本接口 Demo,修改 CMakeList.txt ,以便进行交叉编译
在源码根目录下创建 build_android 目录,并在目录下执行脚本,脚本内容与前文一致:
push 以下文件到 Android 手机的 /data/local/tmp 目录下:
编译产物: api-demo
模型训练和测试数据: agaricus.txt.test, agaricus.txt.train
xgboost 动态库: libxgboost.o
可以看到 demo 执行结果,就不贴图了
Ⅱ mac 怎样打包android系统源码
设置Mac上的编译环境可参考官方文档:
Initializing a Build Environment 里的 Setting up a Mac OS X build environment
里面有具体的方法,Android代滑宽码所在的分区是需要区分大小写的,默认的Mac分区是不区分大小写的,所以可能新信埋亮建一个区分大小写的分区或者使用文档中的方式,建立一个虚拟分区文件,把它格式化成区分大小写的区分。
但是在Mac里设置编译环境很麻烦,因为Mac本身没有编译工具链,需要额外的安装,还需要安装xCode,液滚等等。
Ⅲ ubuntu/mac android aosp源码编译遇到的坑
以上是编译aosp问题总结
========================分割线==========================
直接在命令行中设置临时变量就行
以上是刷机问题总结
========================分割线==========================
Ⅳ 怎么开发android framework
一.认识android的架构
Android其本质就是在标准的linux系统上增加了java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework
但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。
搭建源码编译环境
http://www.cnblogs.com/bluestorm/p/4419135.html
https://source.android.com/source/downloading.html(这里详细的介绍了如何下载编译)
三.开始主题
在一开始写c程序的时候都有一个运行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
//这里的main就是应用的入口
int main(int argc, const char * argv[]){
return 0;
}
在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
#include <stdio.h>
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}
//判断高低字节是不是2,如果不是2.2的版本则退出
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
return;
}
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址结构体的创建
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行
listen(socSrv, 5);
SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体
int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
//循环等待接受客户端发送请求
while (1)
{
//等待客户请求到来;当请求到来后,接受连接请求,
//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClient.sin_addr));//格式化输出
//用返回的套接字和客户端进行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
//接收数据
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s\\n", recvBuf);
closesocket(sockConn);
}
}
他采用了一个while死循环去监听客户端的请求。
在一遍啰嗦之后,主角终于闪亮的登场了。
先上源代码
public final class ActivityThread {
public static void main(String[] args) {
SamplingProfilerIntegration.start();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
EventLogger.setReporter(new EventLoggingReporter());
Security.addProvider(new AndroidKeyStoreProvider());
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
//从中可以看到为app开辟了一个线程进入了looper之中
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
}
看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper();
Looper.loop();
进一步深入代码
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();
// 在这里看到了一个循环监听消息
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
// Make sure that ring the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
}
msg.recycleUnchecked();
}
}
Ⅳ Android源码能在其他电脑上运行吗
如下:
1.在ubuntu系统下,进入源码根目录,运行如下命令。
mmm命令编译idegen模块,在源码目录下的out/host/linux-x86/frameworks/目录下生成了idegen.jar文件。
2.在源码目录下继续执行如下命令:
3.development/tools/idegen/idegen.sh命令执行完成,会在根目录下生成
android.iml和android.ipr这两个文件,这两个文件是Android Studio的工程配置文件。
4.到这一步我们可以打开Android Studio导入源码了,不过还有一些要注意的地方,如果我们就这么直接导入,会把所有的源码模块导入到Android Studio中,这会很慢的,想想源码那么多文件,直接全部导入,如果你的电脑配置不好,可能会直接假死。所以我们最好过滤一下我们不需要的源码文件,只导入我们需要的模块。
对比源码下目录,我把除了frameworks模块的其他所有模块都过滤掉了。这样导入的速度很快,3分钟左右就导入完成了。
5.所有配置完成了,下面启动Android Studio开始导入源码。
6.Android Studio导入源码
点击ok,大概过了3-5分钟,就导入完成了。
7.好了,现在我们可以愉快的使用Android Studio查看源码了。
8.如果你不想编译源码,还想把源码导入Android Studio的简单方法是什么呢,到这一步我想大家都知道了,就是把上面生成的两个文件android.iml和android.ipr拷贝到你的未编译源码根目录就可以用Android Studio导入了。
9.当然,一般我们大部分人不在ubuntu下开发app ,为了能在Windows或Mac系统下也能使用Android Studio查看未编译的源码,我们也可以像上一步那样直接拷贝ubuntu下的android.iml和android.ipr文件到Windows或Mac系统下的android源码根目录下,然后导入Adnroid Studio中,这样就可以在这两个平台上进行查看源码了,不用一直开虚拟机了。
Ⅵ 在Mac上开发Android是一种怎样的体验
一直在mac上开发,体验不错,用的android studio,昌中山编译速度还是非常快的,耐中比培纤windows强很多。
Ⅶ mac可以编译arm汇编吗
可以
编译就是把源代码转成对应CPU类型下的本地代码。
因为编译器也是程序,也有它自身的运行环境。交叉编译就是用A环境下运行的编译器生成B环境下运行的本地代码。
对于本文,就是用在Mac下的C++编译器,生成ARM下运行的本地代码。编译器由Android提供,对应的目录在:$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g+
Ⅷ 为什么用mac开发android
Android系统的源代码编译只能在linux和mac下进行,而windows不行,这是主要原因。
开发应用3大平台都可以,但是如果涉及JNI之类的,还是linux下方便。
不赞同说linux下配置简单,linux下配置是比较繁琐的。
mac(苹果电脑)是可以用于开发Android系统的,需要在mac平台上搭建Android开发环境,具体步骤为:
一.Eclipse的下载1.找到“EclipseIDEforjavaDevelopers”此处右上角会根据你当前使用的系统自动选择,Mac下就会自动选择位“MacOSX(Cocoa)”
2.然后点击右边枯雀的“MacOSX64bit”(这里我的Pro是i5处理器可以用64位的),根据你的机器也可以选择“MacOSX32bit”进行下载。
二.安装ADT
ADT是Android应用程序的开发环境
在线安装,本来还有个离线安装的,但是我试图去下载这个离线安装包但是没有找到下载的地方,所以这里主要介绍如何进行在线安装。
1.点击菜单中的Help——>InstallNewSoftware?6?8;
2.在弹出的对话框中有个“Workwith”,在右边的输入没嫌早栏中输入:dl-ssl.google/android/eclipse/然后下面就会pending出来一个“DeveloperTools”,勾选上,然后一路的Next下去就可以安装完成。
三.设定ADT
在菜单栏Refactor中如果能看到Android的标签表示ADT安装成功。
1下载AndroidSDK
打开网站:developer.android/sdk/index.html选择MacOSX(intel)的SDK版本进行下载(因为pro是intel的i5处理器)
2安装AndroidSDK
刚下载的Mac版的SDK文件是:“android-sdk-mac_x86.rar”文件,将其解压出来,然后运行tools/Android,在弹出的AndroidSDKandAVDManager对话框中选择左边的Installedpackages,右边就会列出当前已经安装了的SDK,点击下面的“UpdateAll”然后一步一步来就会下载所有的AndroidSDK的版本并进行安装。
然后在菜单栏Eclipse—>Preferences(偏好设置),会弹出一个Preferences对话者芦框,选Android,然后在SDKLoaction中填入刚下载的SDK的路径或者点击右边的Browser选择。
3生成模拟器
菜单栏Window—>AndroidSDKandAVDManger会弹出对话框,然后在对话框中选择new开始按自己的需求新建模拟器,至此就大功告成了。
Ⅸ 编译调试Android系统原生App - 以Settings为例
本文已过时,最新文章:向大家推荐《使用 AS 开发 System App》 https://xiaozhuanlan.com/system-app
Android原生系统带有许多原生的App,比如 浏览器、录音机、计算器、设置 等,有些时候,我们需要用到一些系统的功能,或者是对已有的功能做二次开发,比如我上学时给一个公司做过一个Launcher和Wizard,就需要用到系统设置中的某些功能,比如Wifi、声音、显示等功能,于是就需要从Settings源码中提取出需要的功能。
特别是公司自己定制Android系统,需要在上面做一些 系统级的App 的时候,原生App已有的功能就可以通过编译其源码的方式直接拿过来改改就能用,而且可用度很高。
这里有两种情况,分为 原生 的和 公司定制 的系统。无论是原生的还是定制的,类似于Settings这样需要使用到 系统级或隐藏API 的App,都需要系统签名文件和编译系统源码后得到相应的jar包才可以在IDE中编译,因为标准SDK根本没有那些API可供调用。
举个栗子:
需要额外的Jar就需要自己编译系统源码啦,这个是比较麻烦的,有兴趣可以试试自己编译定制自己的Android系统。
** 注意,既然是定制的,源码、jar、签名文件,还有系统都是一一对应的,你不能拿其他公司的系统签名来给你公司的系统app签名,这样无法运行的。 **
有了源码,下一步当然是要跑起来啦。
建议都使用Eclipse来编译,不要使用AS,因为AS编译大型的原生App能卡到你吐血,而且出错提示也不友好。但是用过AS的人都不想再碰Eclipse了有没有??别急,可以先用Eclipse编译过了,再贴到AS中,这样好很多,也很节省时间。
初始化:
放入源码:
修正res错误:
修正src错误:
使用到系统级API的,或者AndroidManifest.xml文件中声明了
那么没有系统签名,直接debug签名运行是不行的,需要向底层工程师要系统的签名文件,在源码目录
build\target\proct\security
下的 platform.pk8 和 platform.x509.pem ,如果你想看此次编译Settings是否已成功了,可以适当的在入口加一下Log,然后导出未签名的apk,使用系统签名进行签名后,放到 /system/app/ 下替换掉Settings.apk,然后重启系统,打开设置,看看Logcat是否输出里加入的Log。
在不知道系统签名可以转换成debug签名前,老实说我一直都是用Log的方式调试,太特么痛苦了。现在知道后整个人都懵逼了。
我们都希望可以像调试普通app那样调试系统app,以下是如何通过 openssl 将 platform.pk8 和 platform.x509.pem 转换成 debug.keystore 文件:
三个命令
此方法来自: http://curlog.com/2016/08/30/android-pk2debug-keystore/
Mac自带openssl,Linux和Win需要安装。
然后就可以使用得到的debug签名配置到eclipse后愉快的调试啦,当然,得先把系统中已经存在的app先删除掉。然后重启系统,至于如何配置eclipse的debug签名,请Google。
使用过AS后,当然希望在AS中也可以调试系统App,抽空再写篇相关编译和调试的文章。如果这篇文章帮到你了,给个赞呗。
Ⅹ 如何在Mac上进行Android反编译
apktool 反编译得到的是布局和资源文件。 dex2jar 反编译得到的代码字节码,利用jd gui就可以查看到源代码。 1)下载apktool,及mac下jd -gui,解压。 2) 使用apktool d xxx.apk进行反编译,得到一个同名的文件夹。里面就有我们需要的布局文件。 dex2jar反编译 1)将apk文件后缀名直接改为.zip,并解压。得到其中的classes.dex文件 ,它就是java源代码经过编译再通过dx工具打包而成的。 2)将classes.dex文件复制到dex2jar所在的文件夹。 3)命令行下定位到dex2jar目录,运行 sh dex2jar.sh classes.dex 生成 classes_dex2jar.jar 用jd gui打开就可以看到源代码了。