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

如何在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

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

输入的主密码
(如果和 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]删除。

暂无评论
发表评论