提起安卓237,大家都知道,有人问安卓23,你知道这是怎么回事?下面就一起来看看安卓237,希望能够帮助到大家!

安卓237、安卓23

如何在android源码里查找java中native方法对应的c 实现

如何在android源码里查找java中native方法对应的c 实现

在framework下全局搜索这个native方法的全名。一个个查看匹配的文件,应该会找到你需要的。一般命名都有规律,大部分jni方法都在 \frameworks\base\core\jni目录

在android源码里,有许多方法都是使用jni机制调用底层的c 实现,比如大家都很熟悉的binder.java里,就有 public static final native int getcallingpid(); public static final native int getcallinguid(); public static final native long clearcallingidentity(); 等方法都是直接调用c 里的实现。 通过下面命令可以拦雀陆很快找到对应的实现, . build/envsetup cgrep ./frameworks '"getcallingpid"' 这时会查找到如下结果: 这样就可以知道对应的c 实现方法名字为android_os_binder_getcallingpid, 在该文件中找这个方法的实现即可。

android源码只包含android app java的客户端代码。

native部分可能有可能没有,先全局搜索.c或者.cpp文件,有这些文件才可能有。

如果是标准的android native support 工程,那么eclipse里面打开之后,在工程目录/jni下面就是 native的c 代码。

比如有方法aaa.bbb.ccc.ddd,jni对应的名字就是java_aaa_bbb_ccc_ddd,地图炮搜索就是了,注意不要用全字简顷段匹配,因为jni名可能还带参数后缀。

另外你的确定你是下的整套android系统的源码,不是sdk附带的那个源码,那个只有java的而且还不全。

android源码只包含android app java的客户端代码。

native部分可能有可能没有,先全局搜索.c或者.cpp文件,有这些文件才可能有。

如果是标准的android native support 工程,那么eclipse里面打开之后,在工程目录/jni下面就是 native的c 代码。

android源码中很多关键代码都是c 实现的,java通过jni来调用,经常会看到java中这样的代码:

static native thread currentthread();

如何根据方法名找到其对应的c 实现,有两个方法。

先来个java代码的示例vmthread.java:

package java.lang;

class vmthread {

thread thread;

int vmdata;

vmthread(thread t) {

thread = t;

}

native static void create(thread t, long stacksize);

static native thread currentthread();

static native boolean interrupted();

static native void sleep (long msec, int nsec) throws interruptedexception;

static native void yield();

native void interrupt();

native boolean isinterrupted();

......

}

我们要查找currentthread方法的实现。

方法一:

由于android源码中对每个native实现都会写一个java方法名和c 方法名映射的列表,所以我们直接搜索这个列表内容即可。

zkw@zkw $ grep -rns '"currentthread"' ./*

./art/piler/dex/quick/dex_file_method_inliner.:108: "currentthread", knamecachecurrentthread

匹配岁枯到二进制文件 ./dalvik/vm/native/.java_lang_vmthread.cpp.swp

./dalvik/vm/native/java_lang_vmthread.cpp:241: { "currentthread", "()ljava/lang/thread;",

./external/android-mock/testsgoogle/android/testing/mocking/androidmockgeneratortest.java:249: method method = thread.class.getmethod("currentthread");

./external/android-mock/testsgoogle/android/testing/mocking/androidmockgeneratortest.java:407: method method = thread.class.getmethod("currentthread");

可以看到,在文件./dalvik/vm/native/java_lang_vmthread.cpp中找到currentthread方法相关的信息,后面()ljava/lang/thread代表这个方法的返回值。

进入java_lang_vmthread.cpp这个文件可以看到:

17 /*

18 * java.lang.vmthread

19 */

20 #include "dalvik.h"

21 #include "native/internalnativepriv.h"

22

23

24 /*

25 * static void create(thread t, long stacksize)

26 *

27 * this is eventually called as a result of thread.start().

28 *

29 * throws an exception on failure.

30 */

31 static void dalvik_java_lang_vmthread_create(const u4* args, jvalue* presult)

32 {

33 object* threadobj = (object*) args[0];

34 s8 stacksize = get_arg_long(args, 1);

35

36 /* copying collector will pin threadobj for us since it was an argument */

37 dvmcreateinterpthread(threadobj, (int) stacksize);

38 return_void();

39 }

40

41 /*

42 * static thread currentthread()

43 */

44 static void dalvik_java_lang_vmthread_currentthread(const u4* args,

45 jvalue* presult)

46 {

47 unused_parameter(args);

48

49 return_ptr(dvmthreadself()-threadobj);

50 }

51

......

237

238 const dalviknativemethod dvm_java_lang_vmthread[] = {

239 { "create", "(ljava/lang/thread;j)v",

240 dalvik_java_lang_vmthread_create },

241 { "currentthread", "()ljava/lang/thread;",

242 dalvik_java_lang_vmthread_currentthread },

243 { "getstatus", "()i",

244 dalvik_java_lang_vmthread_getstatus },

245 { "holdslock", "(ljava/lang/object;)z",

246 dalvik_java_lang_vmthread_holdslock },

247 { "interrupt", "()v",

248 dalvik_java_lang_vmthread_interrupt },

249 { "interrupted", "()z",

250 dalvik_java_lang_vmthread_interrupted },

251 { "isinterrupted", "()z",

252 dalvik_java_lang_vmthread_isinterrupted },

253 { "namechanged", "(ljava/lang/string;)v",

254 dalvik_java_lang_vmthread_namechanged },

255 { "setpriority", "(i)v",

256 dalvik_java_lang_vmthread_setpriority },

257 { "sleep", "(ji)v",

258 dalvik_java_lang_vmthread_sleep },

259 { "yield", "()v",

260 dalvik_java_lang_vmthread_yield },

261 { null, null, null },

262 };

源码中第242行找到对应的名字,用红色标出,其实现就在第44行。

这个方法不是很准确,要靠经验来判断搜出来的代码是否是自己要找的,下一个方法可以较准确的查找。

方法二:

还是找vmthread.java的currentthread函数,找多了会发现,c 的名字一般都是包名 类名 方法名,比如currentthread的c 名字就肯定包含“java_lang_vmthread_currentthread”,所以直接搜索即可。

如何在android源码里查找java中native方法对应的c 参考::edu.51cto./course/course_id-4377.

知道方法名就知道c 里的函数名了,native方法的函数名是 java_包名_类名_函数名 开头的,包名要把.换成_。比如.xxx.yyy.classa.methodb在c 那边找java__xxx_yyy_classa_methodb就行了

如何在eclipse中查看android源码

假设我们想参看activity类的源代码,按着ctrl键,左击它,现实的结果却看不到代码的,提示的信息便是“找不到activity.class文件”。

此时点击下面的按钮,“change attached source…”,选择android源代码所在位置,便弹出对话框。

第一种是选择工作目录,即已经存在的android应用程序源代码。

第二种分两种方式

(1)选择external file…按钮,添加jar格式文件或者zip格式文件路径;

(2)选择external floder…按钮,添加文件夹所在路径。

下面问题就来了,源代码在哪里?不能凭空产生阿。

可以通过android sdk manager进行源代码下载;(推荐该种方法),勾选source for android sdk,进行下载即可。

此外也可通过其他途径下载,网上有很多共享的资源。

这里选择第二种方式的(2)方法,选择源码所在目录(即下载源代码目录所在路径)

点击“ok”按钮,此时,activity文件便能够查看源代码了

如何反编译android应用并重新打包

一.看android的源代码

1)将apkd.apk 用zip解压后,出现了一个classes.dex文件

2014/02/19 19:42

.

2014/02/19 19:42

..

2014/02/19 15:35 1,656 androidmanifest.xml

2014/02/19 15:35 687,024 classes.dex

2014/02/19 15:49

meta-inf

2014/02/19 15:49

res

2014/02/19 15:35 2,200 resources.arsc

2)进入到dex2jar目录中,运行情况如下:

d:\developer\tools\test_apk\dex2jar-0.0.9.15dex2jar.bat "..\apkd(d2j)\classes.d

安卓237、安卓23

ex"

this cmd is deprecated, use the d2j-dex2jar if possible

dex2jar version: translator-0.0.9.15

dex2jar ..\apkd(d2j)\classes.dex - ..\apkd(d2j)\classes_dex2jar.jar

done.

在apk所在的目录会出现 classes_dex2jar.jar 文件。

3) 用jd-gui对jar包进行查看,可以查看源文件

二.反编译apk

1.在 下载 apktool中的三个文件(aapt.exe、apktool.bat、apktool.jar)解压缩到你的windows安装目录下,以方便使用dos命令.

2012/12/06 11:44 854,016 aapt.exe

2014/02/19 17:15 277,372 apkd.apk //示例用 apk文件

2012/12/23 23:39 92 apktool.bat

2013/02/03 02:37 2,655,843 apktool.jar

2.进入到apktool.bat所在的目录,运行:

apktool d apkd.apk decode_dir

反编译裂虚早后,decode_dir目录下的内容如下:

2014/02/19 17:16 716 androidmanifest.xml

2014/02/19 17:16 237 apktool.yml

2014/02/19 17:18

build

2014/02/19 17:16

res

2014/02/19 17:16

smali

此时我可以查看原文件androidmanifest.xml了,也是查看smali源文件(是用smali语言写的,可以对照java看)。

三.apktool的使用

1).decode

该命令用于进行反编译apk文件,一般用法为

apktool d

代表了要反编译的apk文件的路径,最好写绝对路径,比如c:\musicplayer.apk

代表了反编译后的文件的存储位置,比如c:\musicplayer

如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命肆雀令加入-f指令

apktool d –f

这样就会强行覆盖已经存在的文件

2).build

该命令用于编译修改好的文件,一般用法为

apktool b

这里的

就是刚才你反编译时输入的

(如c:\musicplayer),输入这行命令后,如果一切正常,你会发现c:\musicplayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。

3).install-framework

该命令用于为apktool安装特誉胡定的framework-res.apk文件,以方便进行反编译一些与rom相互依赖的apk文件。具体情况请看常见问题

四.smali与java源码对照,并做出相应的修改

java源代码:

import android.os.bundle;

import android.app.activity;

import android.view.menu;

import android.widget.*;

public class mainactivity extends activity {

@override

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.activity_main);

textview a = (textview)this.findviewbyid(r.id.test) ;

a.settext("raoliang");

}

@override

public boolean oncreateoptionsmenu(menu menu) {

// inflate the menu; this adds items to the action bar if it is present.

getmenuinflater().inflate(r.menu.main, menu);

return true;

}

}

对应的smali源代码:

.class public lali/text/apkd/mainactivity;

.super landroid/app/activity;

.source "mainactivity.java"

# direct methods

.method public constructor ()v

.locals 0

.prologue

.line 8

invoke-direct {p0}, landroid/app/activity;-()v

return-void

.end method

# virtual methods

.method protected oncreate(landroid/os/bundle;)v

.locals 2

.parameter "savedinstancestate"

.prologue

.line 12

invoke-super {p0, p1}, landroid/app/activity;-oncreate(landroid/os/bundle;)v

.line 13

const/high16 v1, 0x7f03

invoke-virtual {p0, v1}, lali/text/apkd/mainactivity;-setcontentview(i)v

.line 14

const/high16 v1, 0x7f08

invoke-virtual {p0, v1}, lali/text/apkd/mainactivity;-findviewbyid(i)landroid/view/view;

move-result-object v0

check-cast v0, landroid/widget/textview;

.line 15

.local v0, a:landroid/widget/textview;

const-string v1, "raoliang"

invoke-virtual {v0, v1}, landroid/widget/textview;-settext(ljava/lang/charsequence;)v

.line 16

return-void

.end method

.method public oncreateoptionsmenu(landroid/view/menu;)z

.locals 2

.parameter "menu"

.prologue

.line 21

invoke-virtual {p0}, lali/text/apkd/mainactivity;-getmenuinflater()landroid/view/menuinflater;

move-result-object v0

const/high16 v1, 0x7f07

invoke-virtual {v0, v1, p1}, landroid/view/menuinflater;-inflate(ilandroid/view/menu;)v

.line 22

const/4 v0, 0x1

return v0

.end method

通过对比可以看到,常量是没有必变的,可以根据的smali的语法,进行相应的修改

五.3、打包、签名和安装修改后的apk

修改完了,就可以打包回apk了。执行以下命令:

apktool b decode_dir

在mygame目录下的dist在会看到打包好的apk。

当然,现在一般是无法安装的,因为apk还没有签名。下面就来签名。签名需要keystore文件,我已经有专用的keystore了,如果还没有,请参阅这里进行生成。

执行以下命令为重新编译的my_game.apk签名:

jarsigner -verbose -keystore demo.keystore apkd.apk demo.keystore

最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。

完整的运行情况如下:

d:\developer\tools\test_apk\new\decode\distkeytool -genkey -alias demo.keystore -keyalg rsa -validity 40000 -keystore demo.keystore

输入keystore密码:

再次输入新密码:

您的名字与姓氏是什么?

[unknown]: rao

您的组织单位名称是什么?

[unknown]: rao

您的组织名称是什么?

[unknown]:

您所在的城市或区域名称是什么?

[unknown]:

您所在的州或省份名称是什么?

[unknown]:

该单位的两字母国家代码是什么

[unknown]:

cn=rao, ou=rao, o=unknown, l=unknown, st=unknown, c=unknown 正确吗?

[否]: y

安卓237、安卓23

输入的主密码

(如果和 keystore 密码相同,按回车):

d:\developer\tools\test_apk\new\decode\distjarsigner -verbose -keystore demo.keystore apkd.apk demo.keystore

输入密钥库的口令短语:

正在添加: meta-inf/manifest.mf

正在添加: meta-inf/demo_key.sf

正在添加: meta-inf/demo_key.rsa

正在签名: res/drawable-hdpi/ic_launcher.png

正在签名: res/drawable-mdpi/ic_launcher.png

正在签名: res/drawable-xhdpi/ic_launcher.png

正在签名: res/drawable-xxhdpi/ic_launcher.png

正在签名: res/layout/activity_main.xml

正在签名: res/menu/main.xml

正在签名: androidmanifest.xml

正在签名: classes.dex

正在签名: resources.arsc

d:\developer\tools\test_apk\new\decode\dist

到此为止,修改后的apk可以正常的安装了,不过,在安装之前,必须要先卸载以前的apk,不能直接替换(因为签名不一样)

如何配置并查看android系统环境变量?

[question]

如何配置并查看android系统环境变量?原文:

[answer]

1、配置全局系统环境变量方法

路径:system/core/rootdir/init.environ.rc.in

内容如下

1 # set up the global environment

2 on init

3 export path /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

4 export android_bootlogo 1

5 export android_root /system

6 export android_assets /system/app

7 export android_data /data

8 export android_storage /storage

9 export asec_mountpoint /mnt/asec

10 export loop_mountpoint /mnt/obb

11 export bootclasspath %bootclasspath%

12 export systemserverclasspath %systemserverclasspath%

2、配置临时系统环境变量

adb shell进入命令行

设置

$export android_bootlogo =1

查看

$echo $android_bootlogo

1 3

、通过洞唤adb shell set可以查看android系统当前全部的环纳余凯境变量

例:

d:\testcadb shell set

android_assets=/system/app

android_bootlogo=1

android_data=/data

android_property_workspace=9,0

android_root=/system

android_socket_adbd=10

android_storage=/storage

asec_mountpoint=/mnt/asec

bashpid=14728

bootclasspath=/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/fra

mework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/syst

em/framework/telephony-common.jar:/system/framework/voip-common.jar:/毁锋system/framework/ims-common.jar:/system/framework/m

ms-common.jar:/system/framework/android.policy.jar:/system/framework/apache-xml.jar:/system/framework/telephony-common2.

jar

columns

emulated_storage_source=/mnt/shell/emulated

emulated_storage_target=/storage/emulated

epochrealtime=1454469703.316158

external_storage=/storage/sdcard0

home

ifs=$' \t\n'

internal_storage_type=emulated

kshegid=2000

kshgid=2000

kshuid=2000

ksh_version='@(#)mirbsd ksh r50 2014/10/07'

legacy_storage=/storage/emulated/legacy

lines

loop_mountpoint=/mnt/obb

optind=1

path=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

pgrp=14728

pipestatus=0

ppid=237

primary_storage_type=external

ps1='$ '

ps2=' '

ps3='#? '

ps4=' '

pwd=/

random=1577

secondary_storage=/storage/emulated/legacy

seconds=0

shell

systemserverclasspath=/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-servi

ce.jar

tmout=0

user_id=2000

安卓机237。网上说我已经把手机root了什么意思啊,我知道和最高权限有关,我也正在研究这个,在哪里

你想软件删除是受限制的,我们只能利用获取root权限来做我们被限制的去做的事情,比如google禁止我们看到市场里很多免费或付费的软件,我们可以用market进去看;很多朋友只能看不能下,不能绑定gmail,我们可以唯稿修改host来搞定他们;有定制软件,就可以通过re管理器进行操

作。

但这些都需要安卓4.0root权限(由于root权限对于系统具有最高的统治权,对于部件删除或更改。只有获得滑贺root权限,可随心所欲地对自己的爱机

进行“重新包装”,感受新版本软件的优点)。取得root后,使用更高级的程序,可以通过re管理器进行修改系统的程序,把程序安装在sd卡上。

root方式各不相同,但一般步骤还是差不多的。那么root有什么需要注意的呢?首先就是国行用户了,国行的手机一旦root就不再保修了,不过小编认为,只要不是硬件上的损伤,其余都是可以自己弄好的。

一般root的步骤都是先关机重启手机进入到一个模式,再在电脑上进行操作,全程耗时不会太长。

了一个应用程序,superuser或是lbe什么的,该程序出现即代表了手机已root成功,这时你便拥有你手机的最高权限。同时为了更加妥善的管理手机,你可以下载些管理手机的软件,例如re管理器,之后你便能删除那些多余的系统应用了,让手机运行速指让孝度再上一级台阶。

# androidstudio代码块的自动补全

settings --笑森辩 editor -- live templates

private (){}

private static class singletonholder {

public static instance = new ();

}

public static ins() {

return singletonholder.instance;

}

碰缺/pre

private static final string tag = " ";

private (){}

/**

public static ins() {

return singletonholder.instance;

}

pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeloaded" lang="java" cid="n13" mdtype="fences" style="caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; position: relative !important;" private static final string tag = " ";

private () {}

public volatile static myinstance;

public static ins() {

if (myinstance == null) {

synchronized ( .class) {

if (myinstance == null) {

myinstance = new ();

}

}

}

return myinstance;

}

春如/pre

避免重复造轮子贴出来俩:

[图片上传失败...(image-25cb22-1600260779098)]

还需要你选择一下选择一下name的表述才行 比如我是想要class 那就拿classname()吧,ok了 就这样了

天真了吧!这样生成出来的肯定不是你想要自动补齐类名的东西!!!

你以为这样就完了?

安卓237我把手机root后,我想改了手机开机时的动画,在哪改呢?谢谢

1.确保您已经获得手机的root权限,且安装了re文件管理器。 2.将下芹困载好的开机画面文件改为bootanimation.zip。 3.打族衡开re文件管理器,进入/system/media/目录,将屏幕右上角的兆首做mount r/w改为mount r/o,然后把新的开机动画文件复制进去,覆盖原来的文件。 4.长按bootanimation.zip,选择permission(权限),依旧下图进行勾选,然后点击ok,在重启手机

以上就是与安卓237、安卓23相关内容,。看完安卓237后,希望这对大家有所帮助!

以上关于安卓237、安卓23的内容由用户:【遥寄三山】在【2023-04-28】整理发布到游戏攻略栏目,希望对您有帮助并解决了您的实际问题。

声明:该文观点仅代表作者本人,内容仅供参考,56国际快递物流网系信息发布平台,56国际快递物流网仅提供信息存储空间服务,如有不实/侵权问题,请联系[email protected]删除。